Аннотация

В этой статье рассмотрим получение Номенклатуры из базы данных 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.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, доступны по ссылке.

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

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

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

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