При настройке обмена данными между конфигурациями 1С (например, между Управление производственным предприятием и Зарплата и управление персоналом 3.1) часто возникает необходимость использовать обработку УниверсальныйОбменДаннымиXML («Конвертация данных 2.1»). Однако в отличие от механизмов стандартной подсистемы обмена платформы, эта обработка напрямую не формирует инфраструктурные заголовки сообщений обмена с номерами пакетов.
Разберем, почему возникает эта сложность и какими способами можно организовать контроль номеров сообщений и квитирование изменений.
Проанализируем архитектуру работы обработки. Обработка УниверсальныйОбменДаннымиXML предназначена для произвольной выгрузки и загрузки массивов данных по правилам конвертации. По умолчанию она формирует файл XML с собственным корневым тегом, где отсутствуют стандартные системные атрибуты заголовка платформы (MessageNo, ReceivedNo, узлы-отправители и получатели), с которыми работают объекты ЗаписьСообщенияОбмена и ЧтениеСообщенияОбмена.
Из-за этого механизм автоматического подтверждения приема (квитирования) и очистки таблиц регистрации изменений на узлах плана обмена не работает в стандартном автоматическом режиме без дополнительной настройки.
Рассмотрим основной способ передачи номеров сообщений без изменения структуры XML-файла — использование механизма параметров правил конвертации данных (КД 2.1).
Разберем реализацию по шагам:
НомерСообщения и НомерПринятого.
// Увеличиваем номер отправленного сообщения на узле
УзелОбъект = УзелОбмена.ПолучитьОбъект();
УзелОбъект.НомерОтправленного = УзелОбъект.НомерОтправленного + 1;
УзелОбъект.Записать();
// Передаем номер сообщения в файл выгрузки
ПередатьОдинПараметрВПриемник("НомерСообщения", УзелОбъект.НомерОтправленного);
ПередатьОдинПараметрВПриемник("НомерПринятого", УзелОбъект.НомерПринятого);
На стороне базы-приемника в обработчике После загрузки данных считываем переданные параметры и фиксируем входящий номер на соответствующем узле плана обмена:
Если Параметры.Свойство("НомерСообщения") И ЗначениеЗаполнено(Параметры.НомерСообщения) Тогда
УзелОбъект = УзелОбмена.ПолучитьОбъект();
УзелОбъект.НомерПринятого = Параметры.НомерСообщения;
УзелОбъект.Записать();
КонецЕсли;
При получении ответного пакета с подтвержденным номером принятого сообщения в базе-источнике вызывается платформенный метод удаления зарегистрированных изменений:
// Удаление изменений, подтвержденных номером квитанции
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НомерПодтвержденногоСообщения);
Метод ПланыОбмена.УдалитьРегистрациюИзменений автоматически удалит из таблиц регистрации только те записи, номер отправки которых меньше либо равен переданному номеру.
Если необходимо использовать стандартные платформенные заголовки инфраструктуры сообщений, выгрузку и загрузку данных можно обернуть в платформенные объекты чтения и записи сообщений.
Рассмотрим, как это работает:
УниверсальныйОбменДаннымиXML создается объект ЗаписьСообщенияОбмена и вызывается метод НачатьЗапись(). В файл записывается валидный XML-заголовок сообщения с номерами пакетов.ЗакончитьЗапись().ЧтениеСообщенияОбмена (метод НачатьЧтение()), который валидирует последовательность номеров, после чего передается обработке загрузки данных и закрывается через ЗакончитьЧтение().Проанализируем альтернативы, которые позволяют избежать ручного контроля номеров при интеграции современных конфигураций:
ПланыОбмена.УдалитьРегистрациюИзменений(Узел), что исключает необходимость вести учет номеров пакетов в файлах.EnterpriseData и подсистемы БСП. Настройка обмена через формат EnterpriseData полностью автоматизирует контроль доставки, нумерацию пакетов и разрешение коллизий.