Почему при синхронизации ЗУП и БП возникает ошибка преобразования XML и как настроить обмен по правилам

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

При разработке собственной синхронизации между конфигурациями «Зарплата и управление персоналом» (ЗУП) и «Бухгалтерия предприятия» (БП) на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с ситуацией, когда стандартный механизм обмена игнорирует загруженные правила конвертации данных (КД 2.1). Это приводит к ошибкам преобразования XML и невозможности сопоставить объекты с разными именами метаданных. Разберем детально, почему это происходит и как заставить систему работать корректно.

Анализ проблемы: почему возникает ошибка «Значения данного типа не могут быть представлены в XML»

Рассмотрим ситуацию: вы создали план обмена, прописали его в общих модулях, загрузили правила, созданные в «Конвертации данных 2.1», и даже зарегистрировали объекты. Однако при попытке обмена в журнале регистрации появляется ошибка на этапе вызова функции ПрочитатьXML. Проанализируем причину этого сбоя.

В БСП существует два принципиально разных механизма передачи данных через XML-сообщения:

  1. Стандартная (платформенная) сериализация: Система напрямую записывает и читает объекты, используя методы платформы ЗаписатьXML и ПрочитатьXML. Этот метод требует полной идентичности имен метаданных в обеих базах.
  2. Обмен по правилам конвертации (КД 2.1): Система использует специализированную обработку «Универсальный обмен данными в формате XML», которая умеет сопоставлять разные типы объектов (например, Справочник.НоменклатурныеГруппы в БП и Справочник.Т_НоменклатурныеГруппы в ЗУП), основываясь на ПКО (правилах конвертации объектов).

Если в файле обмена вы видите узлы типа <CatalogObject.НоменклатурныеГруппы>, это верный признак того, что система пытается использовать платформенную сериализацию. Когда ПрочитатьXML в ЗУП встречает такой тег, она ищет справочник с именем НоменклатурныеГруппы. Не найдя его (так как в ЗУП он называется иначе), платформа выдает ошибку преобразования или сообщает, что тип не может быть представлен в XML.

Шаг 1. Настройка модуля менеджера плана обмена

Чтобы система поняла, что нужно использовать логику правил конвертации, а не прямое чтение XML, необходимо правильно настроить модуль менеджера вашего плана обмена. Простого копирования кода из типовых планов часто недостаточно, так как в них могут быть завязаны специфические зависимости.

Проанализируем процедуру ПриПолученииНастроек (или аналогичную в вашей версии БСП). Нам нужно явно указать флаг использования правил. Рассмотрим пример настройки:


Процедура ПриПолученииНастроек(Настройки) Экспорт
	
	Настройки.Определения.Вставить("ИспользоватьПравилаКонвертации", Истина);
	Настройки.Определения.Вставить("ЗагружатьДанныеОбобщенно", Ложь);
	
	// Указываем, откуда брать правила (обычно из информационной базы)
	Настройки.Определения.Вставить("ИсточникПравилКонвертации", Перечисления.ИсточникиПравилДляОбменаДанными.ИзИнформационнойБазы);
	
КонецПроцедуры

Если этот флаг не установлен в Истина, подсистема обмена данными по умолчанию будет пытаться выполнить ПрочитатьXML напрямую в общем модуле ОбменДаннымиСервер, что и приводит к ошибке, описанной автором темы.

Шаг 2. Проверка регистрации плана обмена в БСП

Выясним, правильно ли подключен план обмена к инфраструктуре БСП. Одного добавления в ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена может быть мало. Необходимо убедиться, что система «видит» правила для этого плана.

Рассмотрим порядок действий:

  1. Проверьте, что в общем модуле ОбменДаннымиПереопределяемый в процедуре ПриОпределенииСоставаПлановОбмена ваш план обмена добавлен в общий список.
  2. Убедитесь, что в режиме «1С:Предприятие» в справочнике «Настройки синхронизации данных» вы действительно загрузили файл правил (xml) именно для этого узла.
  3. Проверьте регистр сведений ПравилаДляОбменаДанными. В нем должна быть запись для вашего плана обмена, и статус должен быть «Используются».

Шаг 3. Устранение несоответствия имен в XML

Посмотрим на пример из сообщения автора: тег <CatalogObject.НоменклатурныеГруппы> в XML-файле. При использовании правил КД 2.1 структура файла внутри секции <v8msg:Body> должна управляться правилами выгрузки. Если тег все равно формируется платформенным образом, значит, выгрузка также прошла не по правилам.

Проанализируем ситуацию: в правилах конвертации (КДО) у вас указано:

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

Шаг 4. Отладка процесса загрузки

Если вы хотите точно найти место, где система «сворачивает» не туда, выполните следующие шаги в отладчике:

  1. Найдите общий модуль ОбменДаннымиСервер.
  2. Установите точку останова в процедуре ВыполнитьСтандартнуюЗагрузкуИзмененийДляУзла.
  3. Посмотрите, какой метод вызывается далее. Если система заходит в ПрочитатьXML(ЧтениеXML) — значит, настройки использования правил не подхватились.
  4. Вам нужно добиться того, чтобы управление передалось в процедуру, которая инициализирует Обработки.УниверсальныйОбменДаннымиВФорматеXML.

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

Рекомендации по доработке правил конвертации

Иногда проблема кроется в самих правилах. Проанализируем настройки в программе «Конвертация данных»:

  1. Проверьте, что в ПКО на вкладке «Алгоритмы» или в настройках самого правила не стоят флаги, принуждающие к стандартной сериализации.
  2. Убедитесь, что версии метаданных, загруженные в КД, соответствуют вашим текущим базам ЗУП и БП. Если вы добавили новый справочник, перевыгрузите описание метаданных и обновите их в КД.
  3. Если вы используете самописный справочник, проверьте его свойства. Он должен быть включен в состав плана обмена в обеих базах.

Рассмотрим пример правильного кода в модуле менеджера для регистрации правил, если они хранятся в макете конфигурации (как альтернатива загрузке через интерфейс):


Функция ПолучитьПравилаКонвертации() Экспорт
    Возврат ПолучитьМакет("ПравилаОбмена");
КонецФункции

В этом случае в настройках обмена (через БСП) нужно будет указать, что источником правил является макет плана обмена. Это более надежный способ для «самописных» обменов, так как правила всегда будут актуальны версии конфигурации.

Подводя итог: основная причина ошибки — работа механизма обмена в режиме «Стандартная выгрузка» вместо «Обмен по правилам». Настройте флаги в ПриПолученииНастроек модуля менеджера плана обмена, проверьте корректность ПКО в КД 2.1 и убедитесь, что в XML-сообщении данные упакованы согласно логике правил конвертации, а не просто сериализованы платформой.

← На главную