При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда типовые механизмы (например, на базе Конвертации данных 3.0) не подходят, и приходится возвращаться к проверенным правилам Конвертации данных 2.0. Однако при программном использовании обработки УниверсальныйОбменДаннымиXML разработчики сталкиваются с проблемой: файл выгружается как простой набор данных, без заголовка сообщения обмена, номеров сообщений и квитирования. Это лишает нас возможности автоматически управлять регистрацией изменений на узлах плана обмена.
В этой статье мы разберем, как превратить обычную выгрузку в полноценное сообщение обмена, рассмотрим программные методы управления планом обмена и выясним, какие инструменты Библиотеки стандартных подсистем (БСП) помогут сделать процесс надежным.
Обработка УниверсальныйОбменДаннымиXML изначально проектировалась как универсальный инструмент для разового или периодического переноса данных. Она умеет читать правила, применять отборы и выгружать объекты, зарегистрированные на узле плана обмена. Но она не отвечает за формирование транспортного конверта XML, который включает в себя тег v8msg:Message и заголовок v8msg:Header с номерами отправленного и принятого сообщений.
Без этих данных принимающая сторона не сможет отправить подтверждение (квитанцию), а отправляющая сторона не будет знать, какие изменения можно смело удалять из регистрации. Проанализируем, как можно решить эту задачу двумя способами.
Если вы работаете в современных конфигурациях, таких как УНФ 3.0 или Бухгалтерия предприятия 3.0, в них уже встроена логика БСП для работы с правилами КД 2.0. Вместо внешней или встроенной обработки УниверсальныйОбменДаннымиXML, мы рекомендуем использовать механизмы подсистемы «Обмен данными».
Рассмотрим, как это работает «под капотом». Процедуры БСП используют объект ЗаписьСообщенияОбмена, который автоматически формирует правильную структуру XML-файла. Посмотрим на пример кода, который позволяет выполнить выгрузку в формате сообщения:
// Пример использования системных механизмов для формирования сообщения
УзелОбмена = ПланыОбмена.SP_Контрагенты.НайтиПоКоду("G");
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ФайлОбмена = Новый ЗаписьXML;
ФайлОбмена.ОткрытьФайл("C:\Exchange\Message.xml");
ЗаписьСообщения.НачатьЗапись(ФайлОбмена, УзелОбмена);
// Здесь подключается логика выгрузки через правила КД 2.0
// БСП делает это через специализированные методы модуля ОбменДаннымиСервер
// Например: ОбменДаннымиСервер.ВыгрузитьДанныеДляУзлаОбмена(УзелОбмена, Параметры);
ЗаписьСообщения.ЗакончитьЗапись();
ФайлОбмена.Закрыть();
Преимущество этого метода в том, что 1С сама инкрементирует НомерОтправленногоСообщения в плане обмена и корректно закрывает все теги. Если же вам необходимо использовать именно УниверсальныйОбменДаннымиXML, перейдем ко второму способу.
Если вы решили программно инициализировать обработку УниверсальныйОбменДаннымиXML, как показано в вопросе автора, вам необходимо вручную управлять процессом выборки изменений и фиксации номера сообщения. Разберем по шагам, как доработать исходный код.
Шаг 1. Инициализация и загрузка правил. Проанализируем ситуацию: нам нужно не просто включить все правила, а указать обработке, что источником данных является конкретный узел плана обмена.
&НаСервере
Процедура ВыгрузитьНаСервере()
УзелПланаОбмена = ПланыОбмена.SP_Контрагенты.НайтиПоКоду("G");
ФайлПравилОбмена = "C:\Rules\Rules.xml";
ИмяФайлаОбмена = "C:\Exchange\Export.xml";
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = "Выгрузка";
Обработка.ИмяФайлаПравилОбмена = ФайлПравилОбмена;
Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
// Важно: не снимаем регистрацию сразу, чтобы не потерять данные при сбое
Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0;
Обработка.ЗагрузитьПравилаОбмена();
// Привязываем узел плана обмена к правилам выгрузки
Для Каждого Стр Из Обработка.ТаблицаПравилВыгрузки.Строки Цикл
Стр.Включить = 1;
Для Каждого Стр1 Из Стр.Строки Цикл
Стр1.Включить = 1;
Стр1.СсылкаНаУзелОбмена = УзелПланаОбмена;
// Указываем, что выгружаем только измененные объекты
Стр1.ИспользоватьОтборПоВыгруженнымОбъектам = Истина;
КонецЦикла;
КонецЦикла;
Обработка.ВыполнитьВыгрузку();
// После успешной выгрузки нужно зафиксировать номер сообщения
// и при необходимости очистить регистрацию вручную
КонецПроцедуры
Чтобы файл превратился в «сообщение», его нужно обернуть в XML-конверт. Если вы не используете ЗаписьСообщенияОбмена, вам придется формировать файл в три этапа:
ЗаписьXML.Обработка.ВыполнитьВыгрузку() в этот же поток (или в текстовый файл, который потом приклеить к заголовку).Однако более профессиональным подходом будет использование метода ПланыОбмена.ВыбратьИзменения(). Выясним, почему это надежнее. Этот метод возвращает объект ВыборкаИзменений, который содержит в себе номер сообщения. Вы можете передать эту выборку в обработку через параметр ВыборкаОбъектовРегистрации.
Проанализируем специфику данных. Передача контактной информации (адреса, телефоны) — одна из самых коварных задач в КД 2.0. В современных версиях БП 3.0 контактная информация хранится в табличных частях справочников, а в старых или в некоторых регистрах — в РегистрСведений.КонтактнаяИнформация.
Важные моменты при настройке правил:
ВидыКонтактнойИнформации идентичен в обеих базах или настройте четкое сопоставление по наименованию или GUID. Если в УНФ вид называется «Адрес доставки», а в БП такого вида нет, данные не загрузятся.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0, регистрация останется в базе. Чтобы её очистить после получения подтверждения от БП, используйте метод:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПланаОбмена, НомерПринятогоСообщения);Рассмотрим итоговый алгоритм действий для создания надежного обмена:
УниверсальныйОбменДаннымиXML, но обязательно устанавливайте свойство СсылкаНаУзелОбмена в таблице правил.ЗаписьСообщенияОбмена.Таким образом, мы выяснили, что для решения задачи автора достаточно правильно прописать привязку к узлу в таблице правил выгрузки и дополнить код механизмами фиксации номера отправленного сообщения через объект ПланыОбмена. Это позволит системе корректно отслеживать, какие данные уже ушли в бухгалтерию, а какие ожидают отправки.