Как передать номера сообщений через Универсальный обмен данными в формате XML?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С (например, между Управление производственным предприятием и Зарплата и управление персоналом 3.1) часто возникает необходимость использовать обработку УниверсальныйОбменДаннымиXML («Конвертация данных 2.1»). Однако в отличие от механизмов стандартной подсистемы обмена платформы, эта обработка напрямую не формирует инфраструктурные заголовки сообщений обмена с номерами пакетов.

Разберем, почему возникает эта сложность и какими способами можно организовать контроль номеров сообщений и квитирование изменений.

Причина проблемы и особенности механизма обмена

Проанализируем архитектуру работы обработки. Обработка УниверсальныйОбменДаннымиXML предназначена для произвольной выгрузки и загрузки массивов данных по правилам конвертации. По умолчанию она формирует файл XML с собственным корневым тегом, где отсутствуют стандартные системные атрибуты заголовка платформы (MessageNo, ReceivedNo, узлы-отправители и получатели), с которыми работают объекты ЗаписьСообщенияОбмена и ЧтениеСообщенияОбмена.

Из-за этого механизм автоматического подтверждения приема (квитирования) и очистки таблиц регистрации изменений на узлах плана обмена не работает в стандартном автоматическом режиме без дополнительной настройки.

Способ 1. Передача номеров сообщений через параметры правил обмена

Рассмотрим основной способ передачи номеров сообщений без изменения структуры XML-файла — использование механизма параметров правил конвертации данных (КД 2.1).

Разберем реализацию по шагам:

  1. В конфигурации «Конвертация данных» в правилах обмена создаем параметры выгрузки, например, НомерСообщения и НомерПринятого.
  2. Устанавливаем для параметров признак Передавать при выгрузке либо передаем их программно в глобальном обработчике правил Перед выгрузкой данных.
  3. В обработчике Перед выгрузкой данных получаем текущий узел плана обмена, увеличиваем счетчик отправленных сообщений и передаем параметр в файл:

// Увеличиваем номер отправленного сообщения на узле
УзелОбъект = УзелОбмена.ПолучитьОбъект();
УзелОбъект.НомерОтправленного = УзелОбъект.НомерОтправленного + 1;
УзелОбъект.Записать();

// Передаем номер сообщения в файл выгрузки
ПередатьОдинПараметрВПриемник("НомерСообщения", УзелОбъект.НомерОтправленного);
ПередатьОдинПараметрВПриемник("НомерПринятого", УзелОбъект.НомерПринятого);

На стороне базы-приемника в обработчике После загрузки данных считываем переданные параметры и фиксируем входящий номер на соответствующем узле плана обмена:


Если Параметры.Свойство("НомерСообщения") И ЗначениеЗаполнено(Параметры.НомерСообщения) Тогда
    УзелОбъект = УзелОбмена.ПолучитьОбъект();
    УзелОбъект.НомерПринятого = Параметры.НомерСообщения;
    УзелОбъект.Записать();
КонецЕсли;

При получении ответного пакета с подтвержденным номером принятого сообщения в базе-источнике вызывается платформенный метод удаления зарегистрированных изменений:


// Удаление изменений, подтвержденных номером квитанции
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НомерПодтвержденногоСообщения);

Метод ПланыОбмена.УдалитьРегистрациюИзменений автоматически удалит из таблиц регистрации только те записи, номер отправки которых меньше либо равен переданному номеру.

Способ 2. Обертывание XML в системное сообщение обмена

Если необходимо использовать стандартные платформенные заголовки инфраструктуры сообщений, выгрузку и загрузку данных можно обернуть в платформенные объекты чтения и записи сообщений.

Рассмотрим, как это работает:

  1. Перед началом работы обработки УниверсальныйОбменДаннымиXML создается объект ЗаписьСообщенияОбмена и вызывается метод НачатьЗапись(). В файл записывается валидный XML-заголовок сообщения с номерами пакетов.
  2. Тело XML-файла заполняется данными выгрузки конвертации.
  3. После завершения выгрузки вызывается метод ЗакончитьЗапись().
  4. На стороне приемника файл сначала открывается объектом ЧтениеСообщенияОбмена (метод НачатьЧтение()), который валидирует последовательность номеров, после чего передается обработке загрузки данных и закрывается через ЗакончитьЧтение().

Альтернативные архитектурные решения

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

  1. Прямой синхронный обмен (COM-соединение / Web-сервисы / HTTP-сервисы). При прямом подключении выгрузка и загрузка данных выполняются в рамках одной сессии. Если загрузка завершилась успешно, регистрация изменений сразу удаляется методом ПланыОбмена.УдалитьРегистрациюИзменений(Узел), что исключает необходимость вести учет номеров пакетов в файлах.
  2. Переход на формат EnterpriseData. Конфигурация ЗУП 3.1 рассчитана на использование универсального формата EnterpriseData и подсистемы БСП. Настройка обмена через формат EnterpriseData полностью автоматизирует контроль доставки, нумерацию пакетов и разрешение коллизий.
← На главную