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

В этой статье рассмотрим получение Номенклатуры из базы данных SQL и последующую запись в систему 1С. После обработки сообщения системой 1С будет сформирован асинхронный ответ о статусе обработки и отправлен в систему источник.
Асинхронный ответ выгодно использовать, когда:
Нет необходимости оперативно обновлять информацию и получать статус об обновлении данных
Если есть риск недоступности системы приёмника (обслуживание или обновление базы 1С)
Требуется обновить большие объемы данных не вызывая повышенную нагрузку на сервера
Описание работы разрабатываемого решения:
Задание по расписанию (триггер) запускает обработку бизнес-процесса по получению записей из системы источника (MS SQL).
При выполнении бизнес-процесса происходит маппинг массива и отправка элемента Номенклатуры в 1С.
В обработчике 1С происходит создание/изменение Номенклатуры в Справочнике.
Формируется статус и помещается в регистр сведений "сшпОчередьИсходящихСообщений" с использованием документируемой функции сшпПоместитьВОчередьИсходящих.
Ответ попадает в 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.nomenklature
SET
need_send = 0,
updated_at = @updated_at,
status = @status
WHERE
uuid = @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, доступны по ссылке.
Документация
Зарезервированные имена — документация Datareon Platform - использование зарезервированных системных слов используя алиасы.
Обработчики 1С — документация Datareon Platform - помещение в очередь исходящих.
Обработчики СУБД — документация Datareon Platform - работа с переменными в обработчиках с типом СУБД
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.