Обновление элементов Справочника в 1С с асинхронным ответом

от автора

Аннотация

В этой статье рассмотрим получение Номенклатуры из базы данных SQL и последующую запись в систему 1С. После обработки сообщения системой 1С будет сформирован асинхронный ответ о статусе обработки и отправлен в систему источник. 

Асинхронный ответ выгодно использовать, когда:

  • Нет необходимости оперативно обновлять информацию и получать статус об обновлении данных

  • Если есть риск недоступности системы приёмника (обслуживание или обновление базы 1С)

  • Требуется обновить большие объемы данных не вызывая повышенную нагрузку на сервера

Описание работы разрабатываемого решения: 

  1. Задание по расписанию (триггер) запускает обработку бизнес-процесса по получению записей из системы источника (MS SQL).

  2. При выполнении бизнес-процесса происходит маппинг массива и отправка элемента Номенклатуры в 1С.

  3. В обработчике 1С происходит создание/изменение Номенклатуры в Справочнике.

  4. Формируется статус и помещается в регистр сведений «сшпОчередьИсходящихСообщений» с использованием документируемой функции сшпПоместитьВОчередьИсходящих.

  5. Ответ попадает в Platform и маршрутизируется до MSSQL. При обработке статуса элементу в MSSQL всегда проставляется need_send = 0, чтобы успешные или ошибочные записи больше не попадали в обработку.

Настройки в Platform

1. Подготовительный этап:

Создаём тип данных habr_Номенклатура и импортируем в него структуру из Справочника “Номенклатура” из 1С. Назначение: Используется для обработки сообщения в обработчике 1С.

Создаём внешний тип данных habr_dbo_nomenklature и импортируем в него структуру таблицы “nomenklature” из базы MS SQL. Используем алиас (название), т.к. name зарезервированное слово. Назначение: Используется для получения Номенклатуры из Источника и обработки сообщения.

Создаём тип данных habr_Номенклатура_Ответ_1С, и заполняем его. Назначение: Используется для заполнения структуры ответа и маршрутизации.

2. Настройка обработчиков

  • Создаём обработчик habr_Номенклатура_Получение_MSSQL с типом “Обработчик MSSQL” для получения записей из системы источника (базы MSSQL).

    • На вкладке Основное указываем направление “В Platform”.

    • На вкладке Код указываем запрос:

      SELECT TOP 100 uuid, sku, "name", units FROM nomenklature WHERE need_send = 1;
    • На вкладке В Платформ указываем тип данных habr_dbo_nomenklature и указываем ему признак “Массив”, Операция — “Произвольный запрос”.

  • Создаём обработчик habr_Номенклатура_Обогощение_1С с типом “Обработчик 1С” для записи полученной номенклатуры в базу 1С.

    • На вкладке Основное указываем направление “Из Platform”

    • На вкладке Из Platform выбираем тип данных habr_Номенклатура

    • На вкладке Код указываем следующее:

НачатьТранзакцию();Попытка    xdtoОбъект = сшпОбщегоНазначения.ПолучитьОбъектXDTO(Перечисления.сшпФорматыСообщений.JSON, ТелоСообщения());    ИдентификаторMSSQL = Новый УникальныйИдентификатор(xdtoОбъект.UUID_MSSQL);        Блокировка = Новый БлокировкаДанных;    ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.сшпБлокировкаОчереди");    ЭлементБлокировки.УстановитьЗначение("Идентификатор", ИдентификаторMSSQL);        Попытка        Блокировка.Заблокировать();    Исключение        Пока ТранзакцияАктивна() Цикл            ОтменитьТранзакцию();        КонецЦикла;        СостояниеСообщение = Перечисления.сшпСтатусыСообщений.ОжиданиеОбработки;        Задержка = 30;        Перейти ~Выход;    КонецПопытки;    //Поиск объекта    спрСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("UUID_MSSQL", ИдентификаторMSSQL);    Если спрСсылка = Неопределено ИЛИ спрСсылка.Пустая() Тогда            спрОбъект = Справочники.Номенклатура.СоздатьЭлемент();    Иначе            спрОбъект = спрСсылка.ПолучитьОбъект();    КонецЕсли;        спрОбъект.Наименование = xdtoОбъект.Наименование;    спрОбъект.Артикул = xdtoОбъект.Артикул;    спрОбъект.ЕдиницыИзмерения = xdtoОбъект.ЕдиницыИзмерения;    спрОбъект.UUID_MSSQL = ИдентификаторMSSQL;    спрОбъект.ДополнительныеСвойства.Вставить("СШПНеобрабатывать", Истина);    спрОбъект.Записать();    ОтветПоНоменклатуре = Новый Структура;    ОтветПоНоменклатуре.Вставить("UUID_Source", ИдентификаторMSSQL);    ОтветПоНоменклатуре.Вставить("updated_at", ТекущаяДатаСеанса());    ОтветПоНоменклатуре.Вставить("status", "OK");    СтруктОтв = сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(Перечисления.сшпФорматыСообщений.JSON, ОтветПоНоменклатуре);    сшпПользовательскиеМетоды.ПоместитьВОчередьИсходящих("Номенклатура_ОбработкаОтвета",СтруктОтв);    Пока ТранзакцияАктивна() Цикл        ЗафиксироватьТранзакцию();    КонецЦикла;Исключение    Пока ТранзакцияАктивна() Цикл        ОтменитьТранзакцию();    КонецЦикла;    ОтветПоНоменклатуре = Новый Структура;    ОтветПоНоменклатуре.Вставить("UUID_Source", ИдентификаторMSSQL);    ОтветПоНоменклатуре.Вставить("updated_at", ТекущаяДатаСеанса());    ОтветПоНоменклатуре.Вставить("status", "Error. " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));    СтруктОтв = сшпОбщегоНазначения.ПреобразоватьСтруктуруПоФормату(Перечисления.сшпФорматыСообщений.JSON, ОтветПоНоменклатуре);    сшпПользовательскиеМетоды.ПоместитьВОчередьИсходящих("Номенклатура_ОбработкаОтвета",СтруктОтв);КонецПопытки;~Выход:
  • Создаём “прокси” обработчик habr_Номенклатура_ОбработкаОтвета_1C с типом “Обработчик 1С”, который будет получать сформированный ответ из 1С

    • На вкладке Основное выбираем направление “В Platform” и указываем имя таблицы Номенклатура_ОбработкаОтвета. С этим типом объекта мы поместили ответ в регистр сведений очередь исходящих на стороне 1С.

    • На вкладке  В Platform выбираем тип данных habr_Номенклатура_Ответ_1С

    • На вкладке Код указываем следующее:

РезультатОбработки.Body = ОбъектОбработки;
  • Создаём обработчик habr_Номенклатура_ОбновлениеСтатуса_MSSQL с типом “Обработчик MSSQL”, который будет производить обновление статуса в базе MSSQL.

    • На вкладке Основное указываем направление “Из Платформ”

    • На вкладке Из Platform указываем тип данных habr_ОбработкаОтвета_1С

    • На вкладке Код указываем запрос по обновлению записи. Подстановка переменных происходит из типа данных. Например @ИмяПоляВТипеДанных.

UPDATE dbo.nomenklatureSETneed_send = 0,updated_at = @updated_at,status = @statusWHEREuuid = @UUID_Source;

3. Настройка бизнес процессов

  • Создаём бизнес-процесс habr_Номенклатура_Обновление_БП, который производит получение и обновление номенклатуры В 1С.

    • На вкладке Основное снимаем галочку “Запускать автоматически”

    • На вкладке Переменные устанавливаем следующее:

      • Получаемый массив Номенклатуры

      • Итератор используется для обхода элементов массива

      • Общее количество элементов — определяет количество элементов в массиве и вычисляется единожды.

      • Номенклатура 1С — тип данных отправляемый в 1С.

Подробное описание настроек в бизнес-процессе:

Процесс будет обходит элементы массива, формируя сообщения для отправки в 1С.

1.Выбираем шаг “Источник” и заполняем его, для получения Номенклатуры из MSSQL.

2. Устанавливаем шаг “Алгоритм” в нём указываем следующее:

ОбщееКоличествоЭлем = ПолученнаяНоменклатура_MSSQL.Count;Logger.Debug($"ОбщееКоличество записей к обработке: {ОбщееКоличествоЭлем}");

3. Устанавливаем шаг “Условие”, ведём от (+) к шагу маппинг. На соединительной линии указываем условие:

Итератор < ОбщееКоличествоЭлем

4. В шаге “Алгоритм” производим маппинг Элемента массива с типом данных для обработки в 1С. (Можно воспользоваться шагом установка переменных, кому как удобнее).

Номенклатура_1C.Наименование = ПолученнаяНоменклатура_MSSQL[Итератор].название;Номенклатура_1C.Артикул = (int)ПолученнаяНоменклатура_MSSQL[Итератор].sku;Номенклатура_1C.ЕдиницыИзмерения = ПолученнаяНоменклатура_MSSQL[Итератор].units;Номенклатура_1C.UUID_MSSQL = ПолученнаяНоменклатура_MSSQL[Итератор].uuid;Logger.Debug($"ЭлементНоменклатуры = {Номенклатура_1C}");

5. Выбираем шаг “Отправка получателю” и заполняем его

6. Выбираем шаг “Алгоритм” и к переменной Итератор добавляем единицу.

Итератор++;

  • Создаём бизнес-процесс habr_Номенклатура_ОбработкаОтвета_1С_БП , который производит запись ответа в MSSQL. 

    • На вкладке Основное указываем “Запускать автоматически” 

    • На вкладке Переменные в переменной обработки указываем тип данных ответа habr_Номенклатура_Ответ_1С (синоним habr_ОбработкаОтвета_1С).

    • Заполняем получателя и выбираем обработчик по обновлению статуса.

4. Создание задания по расписанию (триггера)

Создаём триггер, устанавливаем ему время запуска и указываем схему обработки habr_Номенклатура_Обновление_БП, которую необходимо периодически запускать. 

Результат работы:

Устанавливаем статус need_send = 1 в таблице Номенклатура в MSSQL.

В случае корректной обработки в базе MSSQL видим статус ОК.

Записи из MSSQL добавлены в справочник на стороне 1С:

В случае ошибки атрибут need_send становится равным нулю, повторная обработка ошибочных сообщений не происходит. В поле status описана ошибка, например: Деление на 0

В этом кейсе рассмотрена простая настройка для одного потока, если планируется обновление большого количества объектов, то можно подумать в сторону:

  • Формирования универсальной структуры ответа

  • Единого формата обработчиков по обновлению Статуса в СУБД

  • Универсальных бизнес-процессов по обработке данных

Используемое ПО

  • Microsoft SQL Server 2019 (MS SQL)

  • DATAREON Platform 3.2.1.1

  • Информационная база 1С (Платформа 1С 8.3.23.2157), в режиме совместимости 8.3.22

Файл скрипта базы MSSQL и выгрузка конфигурации Platform, доступны по ссылке.

Документация

  1. Зарезервированные имена — документация Datareon Platform — использование зарезервированных системных слов используя алиасы.

  2. Обработчики 1С — документация Datareon Platform — помещение в очередь исходящих.

  3. Обработчики СУБД — документация Datareon Platform — работа с переменными в обработчиках с типом СУБД

ссылка на оригинал статьи https://habr.com/ru/articles/1082122/