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

01.04.20

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

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

Скачать исходный код

Наименование Файл Версия Размер
Валидация данных
.epf 9,41Kb
5
.epf 9,41Kb 5 Скачать

Введение

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

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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    125990    683    389    

735

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

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

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

18000 руб.

06.10.2023    8167    24    6    

43

Infostart УДиФ: Управление данными и формами 1С

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

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

10000 руб.

10.11.2023    4555    12    2    

38

SALE! %

PowerTools

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2280 руб.

14.01.2013    178780    1084    0    

862

Бустер Конвертации данных 3 (Infostart Toolkit)

Инструментарий разработчика 8.3.14 1С:Конвертация данных Россия Платные (руб)

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

15000 руб.

07.10.2021    15050    3    12    

37

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

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

5000 руб.

07.02.2018    99723    239    97    

298

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28381    4    10    

16

[ЕХТ] Фреймворк для Расширений 1С

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

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18467    6    8    

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


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

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

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

что за функция валидации?
о ней ни слова...
6. relines 43 02.04.20 16:24 Сейчас в теме
(5) Дополнили немного статью, спасибо за замечание.
Функция валидации — самописная функция, которая выполняет по заданным правилам проверку данных и формирует лог с ошибками.
7. RustIG 1613 03.04.20 09:31 Сейчас в теме
Оставьте свое сообщение