Зарисовки на тему оформления кода HTTP-сервиса 2. Валидация данных

29.06.26

Интеграция - WEB-интеграция

«Никогда не доверяйте входным данным». Продолжаю размышления на базе пет-проекта «Управление задачами», демонстрируя код. Простые приемы валидации данных с акцентом на организацию кода и взаимосвязи модулей сервиса.

Начало: Зарисовки на тему оформления кода HTTP-сервиса

Новая статья посвящена валидации данных.

Напомню, мы разбили сервис на 4 модуля, определив функции, границы и взаимосвязи. Что важно для их поддержки и развития. В прошлый раз показал код модуля РаботаСЗадачами, на очереди модуль ВалидацияДанных, будет много кода из РаботаСЗадачамиHTTP и кусочек из РаботаСЗадачамиРеализация.

Валидация – это фильтр для входных данных, проверка на соответствие заданным условиям и ограничениям.

 

Что проверяем:

  1. Само наличие

  2. Тип и формат

  3. Допустимые значения и ссылочную целостность

  4. Состав и согласованность (обязательность, актуальность, бизнес правила)

Безопасность, отдельная тема. Права доступа, объемы и «вражеское» содержимое не рассматриваем.

Входные данные в нашем сервисе — это строки (заголовки, параметры и текстовое тело запроса) или файлы, последних не касаемся.

При проверке данные можем преобразовать в доменные объекты или объекты языка: строка в дату, строка в число. Преобразование может быть как часть проверки (через Попытку) и всегда как результат.

 

Обратная связь

Обратную связь даем в виде текста ошибки. Все ошибки валидации объединены под КодОшибки = «ВалидацияДанных». Можем проверять данные как точечно, так и массово, собирая ошибки в массив.

Способ сбора ошибок в массив (Механизм «СообщенияПользователю + Отказ»):

// ОМ ВалидацияДанных (далее если не указано, то используем именно этот модуль)
Процедура СообщитьПользователю(ТекстОшибки, Отказ)
    
    ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,, Отказ)
КонецПроцедуры

 

Как проверяем

 

Наличие или обязательность

 
 Функция Пустое(Значение, ТекстОшибки, Отказ) Экспорт

 

Тип и формат

 
 Функция КакДата(Значение, ТекстОшибки, Отказ) Экспорт
 
 Функция КакЧисло(Значение, ТекстОшибки, Отказ) Экспорт
 
 Функция КакУИД(Значение, ТекстОшибки, Отказ) Экспорт

 

Ссылки

 
 Функция КорректнаяСсылка(Значение, ТекстОшибки, Отказ) Экспорт

 

Согласованность и бизнес-правила

Проверяем через «Вычислить» условие безопасно. Смотрите далее в разделе «Массовая проверка» 

 
 Функция УсловиеВыполнено(ШаблонУсловие, Контекст)

 

Тексты ошибок 

Тексты ошибок, как и в случае с типизированными ошибками создает модуль «РаботаСЗадачамиHTTP», пример в реализации метода поиска объекта по переданному идентификатору:

 
 Функция ЗадачаСотрудникаПоИдентификатору(Значение, Отказ)

 

Массовая проверка

На примере получения списка задач, проверим входящие данные. Дано такое соответствие: имена параметров запроса к БД и имена параметров http-запроса:

// ОМ РаботаСЗадачамиHTTP
Функция СписокЗадачСоответствиеКлючей()

    Результат = Новый Соответствие;
    
    Результат.Вставить("ДатаНачала", "startDate");
    Результат.Вставить("ДатаОкончания", "endDate");
    Результат.Вставить("ИдентификаторИсполнителя", "userId");
    Результат.Вставить("ИдентификаторАвтора", "authorId");
    Результат.Вставить("НомерСтраницы", "page");
    Результат.Вставить("ДоКурсора", "before");
    Результат.Вставить("ПослеКурсора", "after");
    Результат.Вставить("Лимит", "limit");
    
    Возврат Результат;
КонецФункции

 

Конструкторы правила и условия

Создадим конструкторы в модуле ВалидацияДанных.

 
 Функция НовоеПравилоВалидации(Ключ, КакПроверять, ТекстОшибки, ЗначениеПоУмолчанию = Неопределено) Экспорт
 
 Функция НовоеУсловие(ШаблонУсловие, ШаблонОшибка) Экспорт

 

Набор правил

Создаем в модуле РаботаСЗадачамиHTTP

 
 Функция НаборПравилВалидацииПараметровСпискаЗадач()

Это набор правил под конкретную задачу, могут быть другие задачи и соответственно другие наборы. Ключом набора является имя параметра запроса к БД, ключом правила – имя параметра http-запроса.

 

Набор условий

Создаем в модуле РаботаСЗадачамиHTTP

 
 Функция НаборУсловийПараметровСпискаЗадач()

Это набор для проверки условий согласованности в переданных параметрах http-запроса. Ключ условия - список, участвующих в условие параметров запроса к БД, в значение само условие. Сложность: в тексте ошибки надо вывести ключи, которые пришли из http-запроса. Смотрите метод ТекстОшибкиЗаменитьКлючиНаВходящиеКлючи() в следующем пункте.

 

Метод, реализующий проверки

В модуле ВалидацииДанных. На входе наборы правил валидации и условий, которые мы обойдем и проверим. Если найдем ошибки, то зафиксируем их и Отказ будет автоматически взведен в Истину.

 
 Функция РезультатВалидации(ВходящиеЗначения, СоответствиеКлючей, Валидация, Условия, Отказ) Экспорт

 

Для полной картины еще раз посмотрим на всю цепочку:

 

- В модуле сервиса РаботаСЗадачами, вызов:

СписокЗадач = РаботаСЗадачамиHTTP.СписокЗадач(Запрос, КодОшибки, Заголовки);

 
 Функция ПолучитьЗадачи(Запрос)

 

- В модуле контроллере РаботаСЗадачамиHTTP, вызов:

ПараметрыЗапроса = ВалидацияДанных.РезультатВалидации(…, Отказ)

 
 Функция СписокЗадач(Запрос, КодОшибки, ЗаголовкиРезультат) Экспорт

 

Все получается, довольно емко).

 

Разделение ответственности

Проверки могут быть на разных уровнях. Кроме нашего сервиса, часть проверок можно поручить конфигурации и БД. Например, нарушение состава обязательных реквизитов можно выявить через вызов у объекта метода ПроверитьЗаполнение() перед записью:

// ОМ РаботаСЗадачамиРеализация
Процедура СоздатьЗадачуСотрудника(ПараметрыЗаполнения, РезультатНомер, Отказ) Экспорт

    ДокОбъект = Документы.ЗадачаСотрудника.СоздатьДокумент();
    ДокОбъект.Заполнить(ПараметрыЗаполнения);
    
    Если Не ДокОбъект.ПроверитьЗаполнение() Тогда 
        
        Отказ = Истина;
        Возврат
    КонецЕсли;
    
    ДокОбъект.Записать();
    
    РезультатНомер = ДокОбъект.Номер;
КонецПроцедуры

В случае нарушения сама система сформирует текст ошибки и отправит его куда надо, правда нам придется самим позаботиться об Отказе. Таким образом мы облегчаем себе задачу проверки входящих данных при создании объектов.

 

Проверки ожидаемых значений заголовков и формата тела http-запроса

Такие проверки делаем внутри контроллера сервиса и присваиваем соответствующий типизированный КодОшибки:

 
 Функция НоваяЗадачаСотрудника(Запрос, КодОшибки, ЗаголовкиРезультат, КодРезультат) Экспорт

 

На этом тему закрываю. Модуль ВалидацияДанных является независимым, может быть включен в состав любой конфигурации и переиспользоваться любым http-сервисом или подсистемой для проверок с выводом текстов ошибок.

 

Критикуйте, делитесь, предлагайте.

Всем успехов в проектировании http-сервисов!

Вступайте в нашу телеграмм-группу Инфостарт

HTTP-сервис Архитектура Слои Валидация данных Обработка ошибок

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

42700 руб.

03.08.2020    24694    38    26    

29

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Расширение для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

24000 руб.

02.02.2021    23401    73    52    

44

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17568 руб.

20.12.2024    6663    28    4    

30

WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена по API между конфигурацией 1С:Альфа-Авто 6 и порталом LogicStar. Позволяет работать с несколькими обменами LogicStar разных брендов (CHERY, OMODA, JAECOO, EXEED, TENET) в одной информационной базе в ручном и автоматическом режиме. Поддерживается выгрузка заказ-нарядов, реализаций товаров и товарных остатков.

20740 руб.

13.05.2025    2349    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gybson 13 29.06.26 18:51 Сейчас в теме
Крайне не рекомендую в названии использовать "Не". Если вы делаете функцию "НеЗаполнено", то на заполненность вы будете проверять "Не НеЗаполнено", на этом рано или поздно мозг сломается. Лично видел ошибку, где вместе "Не НеЗаполнено" написали "Не Заполнено" и потом еще этот баг и костылями исправили, потому что даже второй человек на него не среагировал.
2. SAS1C 38 29.06.26 19:12 Сейчас в теме
(1) Прикольное замечание, а я как раз думал, что нашел способ избавится от этого постоянного НЕ Заполнено и код стал понятнее. Оказывается, нет. Согласую другой код и изменю. Спасибо
3. alexandr_yang 3 29.06.26 20:13 Сейчас в теме
(1) В целом вы правы, но бывают исключения. Программный интерфейс может содержать противоположные методы Заполнено и НеЗаполнено, Равно и НеРавно, Содержит и НеСодержит, как раз что бы избавиться от дополнительного отрицания и сделать код более читаемым. Применимо это не везде, тем не менее имеет место быть. С другой стороны никто (кроме здравого смысла) не мешает вам сделать НЕ НЕ НЕ Заполнено() = Истина (я художник - я так вижу).

Касаемо текущей реализации, важнее не имя метода, а его действия. Вроде бы метод должен просто проверить заполненность значения, но он еще и сообщение пользователю делает. Неявное поведение создает больше сложности в понимании кода.
6. SAS1C 38 29.06.26 21:52 Сейчас в теме
(3)
Касаемо текущей реализации, важнее не имя метода, а его действия. Вроде бы метод должен просто проверить заполненность значения, но он еще и сообщение пользователю делает. Неявное поведение создает больше сложности в понимании кода.


Звучит двояко, сначала Имя не важно, но при этом Имя отражает поведение. Смысл ясен. Наименование метода важно для понимания кода.

Предполагаю, что сигнатура метода Функция Пустое(Значение, ТекстОшибки, Отказ) Экспорт
намекает, что в случае положительного ответа будет выведено сообщение об ошибке, а Отказ будет взведен в Истина.

Заменил "НеЗаполнено" на "Пустое"

Если ВалидацияДанных.Пустое(Значение, ИдентификаторНеЗадан, Отказ) Тогда Возврат Неопределено КонецЕсли;
4. Трактор 1283 29.06.26 20:27 Сейчас в теме
Активно используется СообщитьПользователю. Кто увидит эти сообщения при работе HTTP-сервиса?
5. SAS1C 38 29.06.26 21:12 Сейчас в теме
(4) За создание Ответа и вывода сообщений пользователю - ошибок отвечает модуль сервиса, о котором в прошлой публикации https://infostart.ru/1c/articles/2724743/
Для отправки сообщения требуется регистрация/авторизация