При настройке регулярного обмена данными между конфигурациями различных релизов или базами с несовпадающей структурой метаданных (например, при переносе документов между типовой и доработанной базами) разработчики часто сталкиваются с ошибками стандартных механизмов обмена. Попытка использовать типовой план обмена «Полный» или стандартные диалоги подсистемы «Прочие обмены данными» без адаптации приводит к сбоям формата сообщений, ошибкам вызова процедур и конфликтам заголовков XML.
Разберем детально, почему возникают эти ошибки, проанализируем логику работы механизмов платформы и рассмотрим проверенные способы реализации автоматического обмена данными.
Рассмотрим распространенные проблемы, с которыми можно столкнуться при использовании подсистемы «Все настройки обмена данными» и типовых планов обмена:
Ошибка при чтении изменений при обмене РИБ: Изменения конфигурации не могут быть получены из подчиненного узла распределенной ИБ. Она возникает, если для обмена по правилам выбран план обмена с установленным свойством Распределенная информационная база. Такой план предназначен исключительно для баз с полностью идентичной конфигурацией.Метод объекта не обнаружен (ЗагрузитьИзмененияДанныхДляУзла) и Метод объекта не обнаружен (ВыгрузитьИзмененияДанныхДляУзла). В модуле объекта типового плана обмена «Полный» нет процедур обработки изменений, так как платформенный РИБ выполняет эту операцию на уровне движка платформы.Ошибка при вызове метода контекста (НачатьЧтение): Неправильный формат сообщения. Проблема появляется при несовпадении формата файла. Стандартные методы платформы ЧтениеСообщенияОбмена ожидают специальный заголовок транспортного пакета, а выгрузка через универсальную обработку формирует стандартный корень <Выгрузка>.Поле объекта не обнаружено (Объекты) или StartTag: invalid element name происходят из-за того, что подсистема обмена по умолчанию после загрузки пытается сразу же сформировать ответную выгрузку (квитанцию), но правила выгрузки в базе-приемнике не заданы или некорректны.Разберем по шагам, как правильно адаптировать подсистему для работы с правилами конвертации, созданными в конфигурации «Конвертация данных»:
ОбменДаннымиНетиповой). Флаг Распределенная информационная база должен быть обязательно снят. В состав плана обмена включим только те справочники, документы и регистры, изменения которых требуется передавать.
Процедура ВыгрузитьИзмененияДанныхДляУзла(ЭлементСтруктурыАвтообмена, Отказ) Экспорт
// Вызов обработчика конвертации данных или универсального обмена
КонецПроцедуры
Процедура ЗагрузитьИзмененияДанныхДляУзла(ЭлементСтруктурыАвтообмена, Отказ) Экспорт
// Вызов логики чтения данных по правилам обмена
КонецПроцедуры
ЗаписьСообщенияОбмена, структура XML-файла должна содержать обязательный транспортный заголовок:
<?xml version="1.0" encoding="UTF-8"?>
<v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages">
<v8msg:Header>
<v8msg:ExchangePlan>ИмяПланаОбмена</v8msg:ExchangePlan>
<v8msg:To>КодУзлаПолучателя</v8msg:To>
<v8msg:From>КодУзлаОтправителя</v8msg:From>
<v8msg:MessageNo>1</v8msg:MessageNo>
<v8msg:ReceivedNo>0</v8msg:ReceivedNo>
</v8msg:Header>
<v8msg:Body>
<!-- Данные выгрузки по правилам конвертации -->
</v8msg:Body>
</v8msg:Message>
Если нет необходимости глубоко модифицировать конфигурацию и вмешиваться в модули планов обмена, оптимальным решением является программный вызов встроенной или внешней обработки Обработка.УниверсальныйОбменДаннымиXML (V8Exchan82.epf / V8Exchan83.epf) через регламентное задание.
Рассмотрим пример кода для выгрузки измененных данных по правилам конвертации с использованием отбора по узлу плана обмена:
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Exchange\Rules.xml";
ОбработкаОбмена.ИмяФайлаОбмена = "C:\Exchange\Data.xml";
ОбработкаОбмена.РежимОбмена = "Выгрузка";
// Включаем использование плана обмена для регистрации изменений
ОбработкаОбмена.ИспользоватьОтборПоПлануОбмена = Истина;
ОбработкаОбмена.УзелПланаОбмена = ПланыОбмена.ОбменДаннымиНетиповой.НайтиПоКоду("PRM");
ОбработкаОбмена.ВыгружатьТолькоИзмененные = Истина;
ОбработкаОбмена.ВыполнитьВыгрузку();
Для загрузки полученного файла в базе-приемнике используется аналогичный программный вызов:
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаОбмена = "C:\Exchange\Data.xml";
ОбработкаОбмена.РежимОбмена = "Загрузка";
ОбработкаОбмена.ОптимизированнаяЗаписьОбъектов = Истина;
ОбработкаОбмена.ВыполнитьЗагрузку();
Для корректного отслеживания переданных объектов при обмене между неидентичными конфигурациями применяются методы программной работы с планами обмена:
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, СсылкаНаОбъект);
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НомерСообщения);
Такой подход обеспечивает надежную и контролируемую передачу данных между любыми версиями конфигураций 1С без риска повреждения структуры распределенной информационной базы.