При настройке и использовании синхронизации данных между конфигурациями «Управление торговлей» (УТ) и «Бухгалтерия предприятия» (БП) через универсальный формат обмена (EnterpriseData) пользователи часто сталкиваются со сбоем на этапе загрузки файлов. В журнале регистрации базы-приемника фиксируется критическая ошибка: «Получатель из сообщения обмена не соответствует ожидаемому», и процесс интеграции полностью останавливается. Для этой задачи есть инструмент поиска и устранения расхождений после обмена УТ и БП.
В этой статье мы подробно разберем причины возникновения этой ошибки, выясним, почему в кодах узлов планов обмена внезапно появляются длинные GUID-идентификаторы вместо привычных текстовых префиксов, а также рассмотрим пошаговые методы устранения проблемы — как с помощью встроенных инструментов администрирования, так и программным путем. В решении поможет настройка типовой двусторонней синхронизации через EnterpriseData.
Для того чтобы понять природу сбоя, проанализируем внутреннюю структуру обмена данными. При выгрузке информации из базы-отправителя формируется XML-файл (или ZIP-архив, содержащий этот файл). В заголовке этого XML-документа обязательно присутствуют служебные теги:
<Отправитель> — уникальный код узла базы, из которой выгружаются данные.<Получатель> — уникальный код узла базы, в которую эти данные должны поступить.Когда база-приемник начинает считывать файл обмена, встроенные механизмы Библиотеки стандартных подсистем (БСП) выполняют строгую проверку:
<Получатель> из файла должно абсолютно точно совпадать с кодом предопределенного элемента ЭтотУзел в плане обмена базы-приемника.<Отправитель> должно совпадать с кодом узла корреспондента (второй базы), зарегистрированного в этом же плане обмена.Если обнаруживается малейшее несовпадение — например, база ожидает получателя с кодом Л3, а в файле записан код БП, или вместо текстового префикса в одном из мест прописан длинный уникальный идентификатор (GUID) — платформа немедленно блокирует чтение данных в целях безопасности, чтобы не допустить загрузку информации в «чужую» информационную базу.
Выясним, почему настройки префиксов и кодов «разъезжаются» на практике:
57462bf0-7577-446c-b6b9-94eabf9813b9) вместо простых понятных префиксов. Если на этапе создания настройки произошел сетевой сбой, в одной базе узел может создаться с GUID, а в другой — остаться с дефолтным текстовым кодом.БП на Л3), предопределенный элемент ЭтотУзел в плане обмена СинхронизацияДанныхЧерезУниверсальныйФормат автоматически не перезаписывается и не удаляется. Он сохраняет старый префикс, из-за чего новые файлы выгрузки будут генерироваться с новыми именами, но внутри файлов в теге получателя все равно останется старый код.Рассмотрим подробные варианты исправления этой ошибки.
Если в вашей базе коды узлов заблокированы конфигурацией для прямого редактирования в интерфейсе, наиболее надежным и быстрым способом будет написание небольшой внешней обработки или выполнение кода через консоль. Нам необходимо принудительно перезаписать поле Код в плане обмена СинхронизацияДанныхЧерезУниверсальныйФормат для обоих узлов (собственного и узла корреспондента) в обеих базах так, чтобы они зеркально соответствовали друг другу.
Рассмотрим пример кода, который решает эту задачу. Запустим его в базе-приемнике:
// Создадим обработку для принудительного изменения кодов узлов синхронизации
УзелОбъекта = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("57462bf0-7577-446c-b6b9-94eabf9813b9").ПолучитьОбъект();
Если УзелОбъекта <> Неопределено Тогда
УзелОбъекта.Код = "УТ"; // Меняем непонятный GUID на наш префикс базы УТ
УзелОбъекта.Записать();
Сообщить("Код узла корреспондента успешно изменен на УТ");
КонецЕсли;
// Теперь откорректируем собственный узел (ЭтотУзел)
ЭтотУзелОбъект = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел().ПолучитьОбъект();
Если ЭтотУзелОбъект.Код <> "БП" Тогда
ЭтотУзелОбъект.Код = "БП"; // Устанавливаем ожидаемый префикс
ЭтотУзелОбъект.Записать();
Сообщить("Код собственного узла успешно изменен на БП");
КонецЕсли;
После выполнения данного кода в обеих базах (с соблюдением зеркальности: код отправителя в одной базе должен быть кодом получателя в другой) необходимо обязательно сбросить номера сообщений обмена на «0» или «1», чтобы синхронизация началась заново без конфликтов нумерации — для этого есть обработка управления регистрацией и сброса номеров сообщений обмена.
Если у вас нет возможности писать или запускать сторонний программный код, мы можем воспользоваться штатным инструментом администратора 1С. Разберем этот процесс по шагам:
Синхронизация данных через универсальный формат (Планы обмена) (удобно через настройка и модификация синхронизации EnterpriseData между УТ и БП).Код, так как оно является ключевым системным идентификатором.Этот узел).Код.УТ для узла Управления торговлей или БП для Бухгалтерии), который соответствует реальным настройкам в сопредельной базе.Выполнив эту операцию в обеих базах, мы добьемся идеальной синхронности кодов, и ошибка «Получатель из сообщения обмена не соответствует ожидаемому» будет полностью устранена — для контроля качества подойдёт автоматизированная сверка данных после синхронизации УТ и БП.
Проанализируем ситуацию, когда обмен данными нужно провести немедленно, документы «горят», а времени на поиск и запуск обработок или изменение системных реквизитов прямо сейчас нет. Если обмен осуществляется через общий файловый ресурс или сетевой каталог, мы можем временно обмануть систему валидации файлов.
Выполним следующие шаги:
Message_...xml с помощью любого продвинутого текстового редактора (например, Notepad++).
<Header>
<FormatVersion>1.10</FormatVersion>
<Sender>УТ</Sender>
<Recipient>БП_старый_код</Recipient>
</Header>
<Recipient> (Получатель) на тот код, который сейчас реально прописан в базе-приемнике в качестве кода собственного узла (например, заменим устаревший префикс или GUID на фактическое значение, на которое ругается программа).Важное предупреждение: этот метод является исключительно временной «скорой помощью». При следующей автоматической выгрузке база-отправитель снова сгенерирует файл со старым некорректным заголовком, поэтому полноценное решение проблемы требует исправления кодов в самих базах методами, описанными выше.