При доработке правил обмена в Конвертация данных 2.1 разработчики часто сталкиваются с ситуацией, когда правила, идеально работающие в Универсальном обмене данными в формате XML, вызывают критическую ошибку Ошибка формата сообщения обмена при попытке выполнения штатной синхронизации через планы обмена. Давайте разберем, почему это происходит и как исправить ситуацию.
Основная причина конфликта кроется в различии контекстов исполнения кода. Когда вы используете Универсальный обмен данными, в вашем распоряжении оказывается целый набор процедур и функций, жестко прописанных в модуле объекта данной обработки. Эти методы доступны вам в обработчиках Перед выгрузкой, После выгрузки или После загрузки.
Однако, когда вы запускаете синхронизацию через механизм БСП (библиотеки стандартных подсистем), процесс выполнения обмена происходит внутри общих модулей конфигурации, в которых структуры вызова и доступные методы отличаются. Если вы вызвали в правилах функцию, которая «живет» только внутри обработки Универсальный обмен данными, механизм синхронизации выдаст ошибку, так как он не «видит» эту функцию или не имеет права ее вызывать.
В ходе анализа проблемы было выявлено, что причиной сбоя стало использование процедуры ПередатьОдинПараметрВПриемник. Данная процедура является внутренней для Универсального обмена данными. Она не объявлена как Экспорт, поэтому в любом другом контексте — например, при работе через План обмена — она недоступна.
Когда парсер XML при загрузке данных в конфигурации ЕРП встречает структуру, сформированную или обработанную таким нестандартным образом, он сталкивается с нераспознанным узлом или форматом, что и приводит к вызову исключения Ошибка формата сообщения обмена.
Для решения этой задачи выполним следующие шаги:
Конвертации данных 2.1 и найдем все места, где используются специфические методы. Проверьте, нет ли там вызовов процедур из модуля Обработка.УниверсальныйОбменДаннымиXML.КД 2.1, например, коллекцию ПараметрыОбъекта или глобальные параметры выгрузки, которые доступны в обоих режимах обмена.Вместо вызова недоступной процедуры ПередатьОдинПараметрВПриемник, которую вы использовали ранее, реализуйте передачу данных через структуру параметров, доступную в рамках стандартной работы Конвертации данных. Разберем подход к передаче значения:
// Пример: Вместо вызова процедуры из модуля обработки
// ПередатьОдинПараметрВПриемник("ИмяПараметра", Значение);
// Используйте стандартный механизм записи в структуру параметров
Параметры.Вставить("ИмяПараметра", Значение);
// И в правилах после загрузки на стороне приемника:
Значение = Параметры.ИмяПараметра;
Такой подход гарантирует, что ваш код будет одинаково успешно исполняться как при ручном обмене, так и при штатной синхронизации в ЕРП.
Чтобы избежать подобных ошибок в будущем, придерживайтесь правил разработки правил конвертации:
Общие модули конфигурации.Объект может содержать как объект Метаданных, так и ссылку, в зависимости от этапа обмена. Всегда проверяйте тип переменной перед обращением к ней.Ошибка формата сообщения обмена, ставьте точку останова в месте возникновения исключения. Изучив значение переменной, содержащей имя узла XML, вы точно определите, на каком объекте падает загрузка, и сможете найти соответствующее правило выгрузки.Разделив логику на стандартную и специфическую, вы обеспечите стабильность обмена данными между вашими конфигурациями. Всегда помните, что Универсальный обмен — это лишь инструмент тестирования, а боевой обмен через План обмена всегда требует соблюдения стандартов БСП.