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

01.04.20

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Валидация данных
.epf 9,41Kb
6
6 Скачать (1 SM) Купить за 1 850 руб.

Введение

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

При обмене данными между разными информационными системами иногда возникает необходимость проверки данных на соответствие определенным критериям — это могут быть проверки на типы, диапазоны значений, заполненность полей, корректные связи между несколькими моделями и другое. С одной стороны, валидация это дополнительные затраты времени и ресурсов, с другой стороны — она позволяет значительно сократить время на последующую отладку и проверку при модификации обмена. По сути это 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С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

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

15500 руб.

02.09.2020    185136    1033    403    

970

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

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

8400 руб.

20.08.2024    25023    163    86    

161

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 руб.

06.10.2023    20505    52    19    

86

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

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

15000 руб.

10.11.2023    13790    57    33    

77

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

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

9360 руб.

17.05.2024    30728    105    48    

148

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

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    19177    7    32    

43

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    104976    246    100    

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


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

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

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

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