При настройке обмена данными между конфигурациями «Управление производственным предприятием» (редакция 1.3) и «Управление торговлей» (редакция 11) технические специалисты часто сталкиваются с критической ошибкой: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(13575)}: Ошибка формата сообщения обмена. Эта проблема особенно актуальна, когда одна система (УПП) работает на старых версиях Библиотеки стандартных подсистем (БСП), а приемник (УТ 11) — на современных.
Рассмотрим детально, почему возникает этот сбой, и проанализируем пошаговые методы его устранения. Ситуация осложняется тем, что ошибка может проявляться даже при попытке передачи абсолютно «пустого» сообщения обмена, что указывает на проблему в структуре самого XML-контейнера, а не в правилах конвертации.
Проанализируем механику формирования файла обмена в УПП 1.3. В старых версиях механизмов обмена, которые использовались в обычных формах, при формировании XML-пакета в заголовок сообщения принудительно добавляется служебный тег ДанныеПоФоновомуОбмену. Этот тег использовался для управления очередями загрузки в фоновом режиме.
Однако современные конфигурации (УТ 11, ERP 2.x, КА 2.x), использующие актуальные версии БСП, этот тег не поддерживают и не ожидают его увидеть. Когда процедура НачатьЧтениеСообщения в приемнике встречает неизвестный элемент в структуре XML, она прерывает выполнение с исключением Ошибка формата сообщения обмена.
Разберем, в каком именно месте происходит сбой. В коде обработки КонвертацияОбъектовИнформационныхБаз чтение файла идет строго по определенным узлам. Если ФайлОбмена.ТипУзла не соответствует ожидаемому началу элемента данных, система выдает ошибку. Нам необходимо либо научить приемник игнорировать этот тег, либо заставить источник его не выгружать.
Если мы готовы внести небольшие изменения в конфигурацию (или расширение), это самый надежный способ «подружить» системы. Нам нужно найти процедуру, отвечающую за итерацию по узлам XML-файла, и добавить обработку исключительной ситуации для старого формата УПП.
Найдем в модуле обработки КонвертацияОбъектовИнформационныхБаз (или в соответствующем общем модуле БСП в УТ 11) процедуру ПроизвестиЧтениеДанных. Нам нужно добавить условие, которое будет просто пропускать узел ДанныеПоФоновомуОбмену, если он встретится в файле.
Посмотрим на пример исправленного кода:
Процедура ПроизвестиЧтениеДанных(ЧтениеСообщения)
СтрокаСообщенияОбОшибке = "";
Пока ФайлОбмена.Прочитать() Цикл
ИмяУзла = ФайлОбмена.ЛокальноеИмя;
Если ИмяУзла = "Объект" Тогда
// Стандартная обработка объекта
ПоследнийОбъектЗагрузки = ПрочитатьОбъект();
ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки);
ИначеЕсли ИмяУзла = "НаборЗаписейРегистра" Тогда
ПоследнийОбъектЗагрузки = ПрочитатьНаборЗаписейРегистра();
ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки);
ИначеЕсли ИмяУзла = "ДанныеПоФоновомуОбмену" Тогда
// ВОТ ОНО: Решение проблемы несовместимости УПП и УТ
// Просто переходим к следующему узлу, игнорируя этот тег
Продолжить;
ИначеЕсли (ИмяУзла = "ФайлОбмена") И (ФайлОбмена.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда
Прервать;
ИначеЕсли ИмяУзла = "ДанныеПоОбмену" Тогда
// Продолжаем чтение данных
Иначе
// Если узел совсем неизвестный и не является специфичным для УПП
ВызватьИсключение НСтр("ru = 'Ошибка формата сообщения обмена.'");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный момент: Добавление конструкции ИначеЕсли ИмяУзла = "ДанныеПоФоновомуОбмену" Тогда Продолжить; позволяет загрузчику корректно пропустить заголовок, который генерирует УПП, и перейти к чтению непосредственно полезных данных. Это решает проблему «в лоб» на стороне приемника.
Мало кто знает, что в поздних релизах УПП 1.3 фактически существуют две подсистемы обмена данными:
Проанализируем этот путь. Рассмотрим пошагово:
ДанныеПоФоновомуОбмену.Как показывает практика, использование подсистемы из управляемых форм УПП часто позволяет избежать правок кода в УТ 11, так как формат сообщения становится полностью совместимым с требованиями современных БСП. Если регулярный синхронный процесс требуется запускать по расписанию, используется автоматический обмен данными между конфигурациями 1С, работающий поверх настроенных планов обмена без изменения кода программ.
Если ваша версия УПП позволяет, или если вы используете специализированные расширения, рассмотрим переход на современный протокол Enterprise Data (КД 3.0). В отличие от Конвертации данных 2.1, которая жестко привязана к структуре метаданных, Универсальный формат более гибко обрабатывает версии протоколов.
В современных релизах УПП (начиная с 2015 года и позже) появились зачатки поддержки Enterprise Data. Использование этого формата полностью снимает проблему «ошибки формата сообщения», так как XML-схема в КД 3.0 принципиально иная и строго стандартизирована. Для переноса данных в этом формате подойдёт обработка выгрузки и загрузки EnterpriseData с исправлением типовых ошибок.
Проанализируем еще несколько нюансов, которые могут влиять на результат:
<ДанныеПоФоновомуОбмену>...</ДанныеПоФоновомуОбмену>. Если после этого загрузка в УТ пройдет успешно, значит, причина была именно в этом.Таким образом, мы выяснили, что корень проблемы кроется в эволюции Библиотеки стандартных подсистем. Выбор между «костылем» в коде УТ или переходом на интерфейс управляемых форм в УПП зависит от ваших возможностей по изменению типовой конфигурации, но оба метода являются рабочими и проверенными на практике.