Валидация данных

01.04.20

Разработка - Инструментарий разработчика

Пример универсального механизма для валидации данных: проверка типов, связей между таблицами, заполненности полей.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Валидация данных
.epf 9,41Kb
6 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Введение

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

При обмене данными между разными информационными системами иногда возникает необходимость проверки данных на соответствие определенным критериям — это могут быть проверки на типы, диапазоны значений, заполненность полей, корректные связи между несколькими моделями и другое. С одной стороны, валидация это дополнительные затраты времени и ресурсов, с другой стороны — она позволяет значительно сократить время на последующую отладку и проверку при модификации обмена. По сути это Unit-тест, который проверяет результат выгрузки данных.

В данной статье описан один из подходов к валидации исходящих данных, на конкретном примере выгрузки из 1С для сайта.

Постановка задачи

Имеем базу оперативного учета компании, занимающейся оптово-розничной продажей. Необходимо подготовить и выгрузить данные в формате JSON и отправить их на сайт по протоколу HTTP.

Подготовка к реализации

Нужно выполнить две простые операции:

  • сформировать необходимые данные в формате JSON
  • передать данные на сайт

Если никак не проверять данные, то процесс скорее всего будет выглядеть так:

  1. Реализовали/Исправили на стороне 1С.
  2. Отправили данные на сайт.
  3. Подождали пока разработчики сайта за нас проверят данные, оказалось, что есть какие-то проблемы.
  4. Вернулись к п.1.

Важно, что при любом изменении логики или формата выгрузки, есть большая вероятность повторения этого циклического процесса исправления ошибок. И основная проблема даже не в том, что есть ошибки и мы их исправляем, а в том, что в процессе задействованы сразу несколько человек и процесс затягивается. Если бы разработчик 1С оперативно мог сам проверять результат, то он сразу бы исправил ошибки. 

Сам процесс валидации можно разбить на два этапа:

  • описание модели данных: типы, связи, обязательность
  • проверка данных на основе описания

Реализация

Данные выгрузки представляют собой набор таблиц, которые связаны между собой. Для упрощения, будем считать, что это следующие таблицы: Товары, Остатки, Цены.

Для формирования JSON в 1С удобно представить набор таблиц в виде структуры, содержащей в себе массивы структур — каждая структура из массива описывает строку таблицы.

Выгрузка = Новый Структура();

Выгрузка.Вставить("Товары");
Выгрузка.Вставить("Остатки");
Выгрузка.Вставить("Цены");


Далее, необходимо объявить структуру, описывающую каждое поле таблицы, а также параметры которые мы собираемся контролировать. По значениям этих полей функция-валидатор будет проверять соответствующие поля. В нашем примере мы будем контролировать тип значения поля, допустимость равенства значения поля значению NULL (в каких-то случаях это допустимо, а в каких-то нет и это указывает на проблемы либо выборки данных, либо их хранения).

СтруктураПоля = Новый Структура("ИмяПоля, ТипПоля, ВозможенNULL, ОбязательноеЗаполнение");


Описание полей таблицы «Остатки» будет выглядеть следующим образом:

//Описываем поля

МассивПолейТаблицы = Новый Массив;
ПолеСтроки = ОписаниеСтруктурыПоля();
ПолеСтроки.ИмяПоля = "id";
ПолеСтроки.ТипПоля = Тип("Число");
ПолеСтроки.ВозможенNULL = Ложь;
ПолеСтроки.ОбязательноеЗаполнение = Истина;
МассивПолейТаблицы.Добавить(ПолеСтроки);

ПолеСтроки = ОписаниеСтруктурыПоля();
ПолеСтроки.ИмяПоля = "name";
ПолеСтроки.ТипПоля = Тип("Строка");
ПолеСтроки.ВозможенNULL = Ложь;
ПолеСтроки.ОбязательноеЗаполнение = Истина;

МассивПолейТаблицы.Добавить(ПолеСтроки);
ПолеСтроки = ОписаниеСтруктурыПоля();
ПолеСтроки.ИмяПоля = "article";
ПолеСтроки.ТипПоля = Тип("Строка");
ПолеСтроки.ВозможенNULL = Ложь;
ПолеСтроки.ОбязательноеЗаполнение = Ложь;

МассивПолейТаблицы.Добавить(ПолеСтроки);


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

Структуру описания таблицы запишем следующим образом:

СтруктураТаблицы = Новый Структура("Наименование, МассивДанных, МассивПолейТаблицы, ПоляИдентифицирующиеЗапись"
									, "", Новый Массив , Новый Массив, Новый Массив);

В целом, описание таблицы будет выглядеть так:

Функция СформироватьОписание_Товары(МассивДанных)

	СтруктураВозврата = Новый Структура("СтруктураТаблицы, МассивСтруктурСвязей",
                                        ОписаниеТаблицы(), Новый Массив);

    //Описываем поля
    МассивПолейТаблицы = Новый Массив;
    ПолеСтроки = ОписаниеСтруктурыПоля();
    ПолеСтроки.ИмяПоля = "id";
    ПолеСтроки.ТипПоля = Тип("Число");
    ПолеСтроки.ВозможенNULL = Ложь;
    ПолеСтроки.ОбязательноеЗаполнение = Истина;

    МассивПолейТаблицы.Добавить(ПолеСтроки);

    ПолеСтроки = ОписаниеСтруктурыПоля();
    ПолеСтроки.ИмяПоля = "name";
    ПолеСтроки.ТипПоля = Тип("Строка");
    ПолеСтроки.ВозможенNULL = Ложь;
    ПолеСтроки.ОбязательноеЗаполнение = Истина;

    МассивПолейТаблицы.Добавить(ПолеСтроки);

    ПолеСтроки = ОписаниеСтруктурыПоля();
    ПолеСтроки.ИмяПоля = "article";
    ПолеСтроки.ТипПоля = Тип("Строка");
    ПолеСтроки.ВозможенNULL = Ложь;
    ПолеСтроки.ОбязательноеЗаполнение = Ложь;

    МассивПолейТаблицы.Добавить(ПолеСтроки);

    //Описание таблицы и связей

    СтрокаСвязей = ОписаниеСвязейТаблиц();
    СтрокаСвязей.НаименованиеТаблицы1 =  "Товары";
    СтрокаСвязей.НаименованиеТаблицы2 =  "Остатки";
    СтрокаСвязей.ИмяКлючаТаблицы1 =  "id";
    СтрокаСвязей.ИмяКлючаТаблицы2 =  "prod_id"; 
    СтрокаСвязей.СообщениеЕслиNULLЛевоеСоединение =  "[Ошибка]Выгружены товары без остатков";
    СтруктураВозврата.МассивСтруктурСвязей.Добавить(СтрокаСвязей);

    СтрокаСвязей = ОписаниеСвязейТаблиц();
    СтрокаСвязей.НаименованиеТаблицы1 =  "Товары";
    СтрокаСвязей.НаименованиеТаблицы2 =  "Цены";
    СтрокаСвязей.ИмяКлючаТаблицы1 =  "id";
    СтрокаСвязей.ИмяКлючаТаблицы2 =  "prod_id"; 
    СтрокаСвязей.СообщениеЕслиNULLЛевоеСоединение =  "[Ошибка]Выгружены товары без цен";
    СтруктураВозврата.МассивСтруктурСвязей.Добавить(СтрокаСвязей);

    СтруктураВозврата.СтруктураТаблицы.Наименование = "Товары";
    СтруктураВозврата.СтруктураТаблицы.МассивДанных = МассивДанных;
    СтруктураВозврата.СтруктураТаблицы.МассивПолейТаблицы = МассивПолейТаблицы;

    СтруктураВозврата.СтруктураТаблицы.ПоляИдентифицирующиеЗапись.Добавить("id");

    Возврат СтруктураВозврата;

КонецФункции		

 

Так как процедура проверки связей является универсальной, то в структуре, описывающей связь таблиц, сразу указывается текст ошибки, который будет записываться в лог выполнения, если возникнет ошибка.

Таким образом, мы описываем все таблицы нашей выгрузки и связи между ними, а затем «скармливаем» полученные данные и описание функции валидации, которая производит проверку и возвращает лог с ошибками.

Функция проверки таблиц выглядит следующим образом:

Функция ПроверитьТаблицы(ДанныеСтруктура)
     
    СтруктураВозврата = Новый Структура("ОшибкиПроверкиПолей, ОшибкиПроверкиСвязей");
    МассивТаблиц = Новый Массив;
     
    РезультатПроверкаПолей = "";
    МассивТаблиц.Добавить(СформироватьОписание_Товары(ДанныеСтруктура["Товары"]));
    РезультатПроверки = ПроверитьДанныеПоПолямСтруктуры(МассивТаблиц[МассивТаблиц.ВГраница()].СтруктураТаблицы);
    РезультатПроверкаПолей = РезультатПроверкаПолей 
                        + ?(РезультатПроверки = "", "", РезультатПроверки + Символы.ПС);
                         
    МассивТаблиц.Добавить(СформироватьОписание_Остатки(ДанныеСтруктура["Остатки"]));
    РезультатПроверки = ПроверитьДанныеПоПолямСтруктуры(МассивТаблиц[МассивТаблиц.ВГраница()].СтруктураТаблицы);
    РезультатПроверкаПолей = РезультатПроверкаПолей 
                        + ?(РезультатПроверки = "", "", РезультатПроверки + Символы.ПС);
                         
    МассивТаблиц.Добавить(СформироватьОписание_Цены(ДанныеСтруктура["Цены"]));
    РезультатПроверки = ПроверитьДанныеПоПолямСтруктуры(МассивТаблиц[МассивТаблиц.ВГраница()].СтруктураТаблицы);
    РезультатПроверкаПолей = РезультатПроверкаПолей 
                        + ?(РезультатПроверки = "", "", РезультатПроверки + Символы.ПС);
                         
    РезультатПроверкаСвязей = ПроверитьСвязиТаблиц(МассивТаблиц);
     
    СтруктураВозврата.ОшибкиПроверкиПолей = РезультатПроверкаПолей;
    СтруктураВозврата.ОшибкиПроверкиСвязей = РезультатПроверкаСвязей;
     
    Возврат СтруктураВозврата;
     
КонецФункции

Заключение

Описанный подход к проверке данных не является каким-либо стандартом, а является лишь небольшим примером универсальной реализации валидатора данных, которым пользуемся мы при обмене данными между разными системами. Функция валидации не зависит от данных, для использования необходимо лишь подготовить описание данных и сами данные.

К статье прилагается обработка для демонстрации механизма проверки данных. Тестировалась на релизе платформы: 1С:Предприятие 8.3 (8.3.14.1993).

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

валидация JSON

См. также

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    63788    334    162    

298

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    251680    1394    421    

1147

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

15250 руб.

25.08.2025    48283    100    27    

113

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22570 руб.

06.10.2023    36600    96    40    

116

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

17000 руб.

10.11.2023    24342    92    42    

101

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9500 руб.

17.05.2024    51249    181    63    

210

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

5000 руб.

25.02.2026    2601    10    1    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. infosoft-v 1071 01.04.20 16:33 Сейчас в теме
А почему не воспользовались xml схемами? Они же ровно для этого предназначены.
2. relines 43 01.04.20 17:08 Сейчас в теме
Если честно, такой вариант не рассматривали, т.к. у нас для обменов везде используется JSON и тогда потребовалось бы переходить как-то к XML. Плюс, насколько я понимаю, с помощью XSD схем не получится провалидировать связь между отдельнами таблицами.
sergathome; +1 Ответить
8. ovcharenko.di 110 04.04.20 17:30 Сейчас в теме
(2)
. у нас для обменов везде используется JSON и тогда потребовалось бы переходить как-то к XML. Плюс, насколько я понимаю, с помощью XSD схем не получится провалидировать связь между отдельнами таблицами.


а как же JSON Schema?
3. sergathome 4 01.04.20 18:13 Сейчас в теме
Реализация ХМЛ-схемы-преобразования + чекер непротиворечивости конкретной выгрузки... хмм велосипед, конечно, но для случая сложных взаимоотношений и обилия дураков на своей стороне, наверное, небесполезный. Сам однажды был на грани написания подобного, но удержался.
4. DrZombi 310 02.04.20 09:46 Сейчас в теме
почему вложение 2 стар мани?
что там такого особенного, что вы не смогли разложить в тексте публикации?

по мне так вы пытаетесь продать кота в мешке

...я бы свои разработки отдавал бы даром, но это запрещено ресурсом...
jONES1979; +1 Ответить
5. RustIG 1947 02.04.20 14:56 Сейчас в теме
(0)
а затем «скармливаем» полученные данные и описание функции валидации

что за функция валидации?
о ней ни слова...
6. relines 43 02.04.20 16:24 Сейчас в теме
(5) Дополнили немного статью, спасибо за замечание.
Функция валидации — самописная функция, которая выполняет по заданным правилам проверку данных и формирует лог с ошибками.
7. RustIG 1947 03.04.20 09:31 Сейчас в теме
9. TheOldGuard 12 28.10.24 10:53 Сейчас в теме
Присоединюсь к прошлым комментариям. Реализация через xdto, json schema и если отвечает требованиям, выполнять нужные проверки по связям таблиц, имхо
Для отправки сообщения требуется регистрация/авторизация