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

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

При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда типовые механизмы (например, на базе Конвертации данных 3.0) не подходят, и приходится возвращаться к проверенным правилам Конвертации данных 2.0. Однако при программном использовании обработки УниверсальныйОбменДаннымиXML разработчики сталкиваются с проблемой: файл выгружается как простой набор данных, без заголовка сообщения обмена, номеров сообщений и квитирования. Это лишает нас возможности автоматически управлять регистрацией изменений на узлах плана обмена.

В этой статье мы разберем, как превратить обычную выгрузку в полноценное сообщение обмена, рассмотрим программные методы управления планом обмена и выясним, какие инструменты Библиотеки стандартных подсистем (БСП) помогут сделать процесс надежным.

Анализ проблемы: почему стандартная обработка не создает сообщение

Обработка УниверсальныйОбменДаннымиXML изначально проектировалась как универсальный инструмент для разового или периодического переноса данных. Она умеет читать правила, применять отборы и выгружать объекты, зарегистрированные на узле плана обмена. Но она не отвечает за формирование транспортного конверта XML, который включает в себя тег v8msg:Message и заголовок v8msg:Header с номерами отправленного и принятого сообщений.

Без этих данных принимающая сторона не сможет отправить подтверждение (квитанцию), а отправляющая сторона не будет знать, какие изменения можно смело удалять из регистрации. Проанализируем, как можно решить эту задачу двумя способами.

Способ 1. Использование встроенных механизмов БСП (обработка ОбменДаннымиXML)

Если вы работаете в современных конфигурациях, таких как УНФ 3.0 или Бухгалтерия предприятия 3.0, в них уже встроена логика БСП для работы с правилами КД 2.0. Вместо внешней или встроенной обработки УниверсальныйОбменДаннымиXML, мы рекомендуем использовать механизмы подсистемы «Обмен данными».

Рассмотрим, как это работает «под капотом». Процедуры БСП используют объект ЗаписьСообщенияОбмена, который автоматически формирует правильную структуру XML-файла. Посмотрим на пример кода, который позволяет выполнить выгрузку в формате сообщения:


// Пример использования системных механизмов для формирования сообщения
УзелОбмена = ПланыОбмена.SP_Контрагенты.НайтиПоКоду("G");
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ФайлОбмена = Новый ЗаписьXML;
ФайлОбмена.ОткрытьФайл("C:\Exchange\Message.xml");

ЗаписьСообщения.НачатьЗапись(ФайлОбмена, УзелОбмена);

// Здесь подключается логика выгрузки через правила КД 2.0
// БСП делает это через специализированные методы модуля ОбменДаннымиСервер
// Например: ОбменДаннымиСервер.ВыгрузитьДанныеДляУзлаОбмена(УзелОбмена, Параметры);

ЗаписьСообщения.ЗакончитьЗапись();
ФайлОбмена.Закрыть();

Преимущество этого метода в том, что 1С сама инкрементирует НомерОтправленногоСообщения в плане обмена и корректно закрывает все теги. Если же вам необходимо использовать именно УниверсальныйОбменДаннымиXML, перейдем ко второму способу.

Способ 2. Программная настройка обработки и управление регистрацией

Если вы решили программно инициализировать обработку УниверсальныйОбменДаннымиXML, как показано в вопросе автора, вам необходимо вручную управлять процессом выборки изменений и фиксации номера сообщения. Разберем по шагам, как доработать исходный код.

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


&НаСервере
Процедура ВыгрузитьНаСервере()
    
    УзелПланаОбмена = ПланыОбмена.SP_Контрагенты.НайтиПоКоду("G");
    ФайлПравилОбмена = "C:\Rules\Rules.xml";
    ИмяФайлаОбмена   = "C:\Exchange\Export.xml";
    
    Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    Обработка.РежимОбмена = "Выгрузка";
    Обработка.ИмяФайлаПравилОбмена = ФайлПравилОбмена;
    Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
    
    // Важно: не снимаем регистрацию сразу, чтобы не потерять данные при сбое
    Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0; 
    
    Обработка.ЗагрузитьПравилаОбмена();
    
    // Привязываем узел плана обмена к правилам выгрузки
    Для Каждого Стр Из Обработка.ТаблицаПравилВыгрузки.Строки Цикл
        Стр.Включить = 1;
        Для Каждого Стр1 Из Стр.Строки Цикл
            Стр1.Включить = 1;
            Стр1.СсылкаНаУзелОбмена = УзелПланаОбмена;
            // Указываем, что выгружаем только измененные объекты
            Стр1.ИспользоватьОтборПоВыгруженнымОбъектам = Истина;
        КонецЦикла;
    КонецЦикла;
    
    Обработка.ВыполнитьВыгрузку();
    
    // После успешной выгрузки нужно зафиксировать номер сообщения
    // и при необходимости очистить регистрацию вручную
КонецПроцедуры

Как добавить «обертку» сообщения обмена вручную

Чтобы файл превратился в «сообщение», его нужно обернуть в XML-конверт. Если вы не используете ЗаписьСообщенияОбмена, вам придется формировать файл в три этапа:

  1. Создать новый файл и записать в него заголовок сообщения (Header) с помощью ЗаписьXML.
  2. Выгрузить данные через Обработка.ВыполнитьВыгрузку() в этот же поток (или в текстовый файл, который потом приклеить к заголовку).
  3. Записать закрывающий тег сообщения.

Однако более профессиональным подходом будет использование метода ПланыОбмена.ВыбратьИзменения(). Выясним, почему это надежнее. Этот метод возвращает объект ВыборкаИзменений, который содержит в себе номер сообщения. Вы можете передать эту выборку в обработку через параметр ВыборкаОбъектовРегистрации.

Особенности обмена контактной информацией между УНФ и БП 3.0

Проанализируем специфику данных. Передача контактной информации (адреса, телефоны) — одна из самых коварных задач в КД 2.0. В современных версиях БП 3.0 контактная информация хранится в табличных частях справочников, а в старых или в некоторых регистрах — в РегистрСведений.КонтактнаяИнформация.

Важные моменты при настройке правил:

Резюме для разработчика

Рассмотрим итоговый алгоритм действий для создания надежного обмена:

  1. Используйте Планы Обмена с авторегистрацией для нужных объектов (Контрагенты, Контактная информация).
  2. Программная выгрузка: Если правила на КД 2.0, инициализируйте УниверсальныйОбменДаннымиXML, но обязательно устанавливайте свойство СсылкаНаУзелОбмена в таблице правил.
  3. Контроль номеров: Чтобы не «сломать» типовой обмен, если он уже настроен, лучше создать отдельный план обмена специально для своих задач.
  4. Подтверждение: Помните, что без номера сообщения в файле принимающая сторона (БП 3.0) не сможет понять, что это была порция изменений, а не полная выгрузка. Если вы планируете регулярный обмен, внедряйте использование ЗаписьСообщенияОбмена.

Таким образом, мы выяснили, что для решения задачи автора достаточно правильно прописать привязку к узлу в таблице правил выгрузки и дополнить код механизмами фиксации номера отправленного сообщения через объект ПланыОбмена. Это позволит системе корректно отслеживать, какие данные уже ушли в бухгалтерию, а какие ожидают отправки.

← На главную