Аннотация
В этой статье рассмотрим получение Номенклатуры из базы данных 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.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, доступны по ссылке.
Документация
-
Зарезервированные имена — документация Datareon Platform — использование зарезервированных системных слов используя алиасы.
-
Обработчики 1С — документация Datareon Platform — помещение в очередь исходящих.
-
Обработчики СУБД — документация Datareon Platform — работа с переменными в обработчиках с типом СУБД
ссылка на оригинал статьи https://habr.com/ru/articles/1082122/