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