Как настроить обмен данными между неидентичными конфигурациями 1С по правилам обмена?

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

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

Разберем детально, почему возникают эти ошибки, проанализируем логику работы механизмов платформы и рассмотрим проверенные способы реализации автоматического обмена данными.

Анализ типовых ошибок при настройке обмена через встроенные планы

Рассмотрим распространенные проблемы, с которыми можно столкнуться при использовании подсистемы «Все настройки обмена данными» и типовых планов обмена:

  1. Ошибка распределенной информационной базы: Ошибка при чтении изменений при обмене РИБ: Изменения конфигурации не могут быть получены из подчиненного узла распределенной ИБ. Она возникает, если для обмена по правилам выбран план обмена с установленным свойством Распределенная информационная база. Такой план предназначен исключительно для баз с полностью идентичной конфигурацией.
  2. Отсутствие процедур в модуле плана обмена: При снятии флага РИБ с плана обмена «Полный» платформа выдает ошибки: Метод объекта не обнаружен (ЗагрузитьИзмененияДанныхДляУзла) и Метод объекта не обнаружен (ВыгрузитьИзмененияДанныхДляУзла). В модуле объекта типового плана обмена «Полный» нет процедур обработки изменений, так как платформенный РИБ выполняет эту операцию на уровне движка платформы.
  3. Неправильный формат сообщения XML: Ошибка при вызове метода контекста (НачатьЧтение): Неправильный формат сообщения. Проблема появляется при несовпадении формата файла. Стандартные методы платформы ЧтениеСообщенияОбмена ожидают специальный заголовок транспортного пакета, а выгрузка через универсальную обработку формирует стандартный корень <Выгрузка>.
  4. Ошибка записи ответного пакета в базе-приемнике: Ошибки вида Поле объекта не обнаружено (Объекты) или StartTag: invalid element name происходят из-за того, что подсистема обмена по умолчанию после загрузки пытается сразу же сформировать ответную выгрузку (квитанцию), но правила выгрузки в базе-приемнике не заданы или некорректны.

Вариант 1. Использование отдельного плана обмена в подсистеме обмена данными

Разберем по шагам, как правильно адаптировать подсистему для работы с правилами конвертации, созданными в конфигурации «Конвертация данных»:

  1. Создание отдельного плана обмена: Создадим в дереве метаданных новый план обмена (например, ОбменДаннымиНетиповой). Флаг Распределенная информационная база должен быть обязательно снят. В состав плана обмена включим только те справочники, документы и регистры, изменения которых требуется передавать.
  2. Реализация процедур в модуле плана обмена: В модуле объекта созданного плана обмена объявим экспортные процедуры, необходимые подсистеме автообмена:
    
    Процедура ВыгрузитьИзмененияДанныхДляУзла(ЭлементСтруктурыАвтообмена, Отказ) Экспорт
        // Вызов обработчика конвертации данных или универсального обмена
    КонецПроцедуры
    
    Процедура ЗагрузитьИзмененияДанныхДляУзла(ЭлементСтруктурыАвтообмена, Отказ) Экспорт
        // Вызов логики чтения данных по правилам обмена
    КонецПроцедуры
    
  3. Настройка заголовка сообщения: Если обмен использует платформенные сообщения ЗаписьСообщенияОбмена, структура 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>
    
  4. Настройка узлов и отключение ответной записи: В базе-источнике создаем узел с кодом базы-приемника, а в базе-приемнике — узел с кодом источника. Если обратная передача данных не требуется, в настройках обмена на стороне приемника настраиваем только действие Загрузка данных, чтобы база не пыталась формировать пустой или поврежденный ответный файл.

Вариант 2. Программный запуск обработки универсального обмена по расписанию

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

Рассмотрим пример кода для выгрузки измененных данных по правилам конвертации с использованием отбора по узлу плана обмена:


ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Exchange\Rules.xml";
ОбработкаОбмена.ИмяФайлаОбмена       = "C:\Exchange\Data.xml";
ОбработкаОбмена.РежимОбмена          = "Выгрузка";

// Включаем использование плана обмена для регистрации изменений
ОбработкаОбмена.ИспользоватьОтборПоПлануОбмена = Истина;
ОбработкаОбмена.УзелПланаОбмена = ПланыОбмена.ОбменДаннымиНетиповой.НайтиПоКоду("PRM");
ОбработкаОбмена.ВыгружатьТолькоИзмененные = Истина;

ОбработкаОбмена.ВыполнитьВыгрузку();

Для загрузки полученного файла в базе-приемнике используется аналогичный программный вызов:


ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаОбмена = "C:\Exchange\Data.xml";
ОбработкаОбмена.РежимОбмена    = "Загрузка";
ОбработкаОбмена.ОптимизированнаяЗаписьОбъектов = Истина;

ОбработкаОбмена.ВыполнитьЗагрузку();

Управление регистрацией изменений

Для корректного отслеживания переданных объектов при обмене между неидентичными конфигурациями применяются методы программной работы с планами обмена:

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

Такой подход обеспечивает надежную и контролируемую передачу данных между любыми версиями конфигураций 1С без риска повреждения структуры распределенной информационной базы.

← На главную