При переносе справочников и документов между информационными базами с помощью типовой обработки ВыгрузкаЗагрузкаДанныхXML разработчики и администраторы нередко сталкиваются с критической ошибкой десериализации:
{ВнешняяОбработка.ВыгрузкаЗагрузкаДанныхXML.МодульОбъекта(147)}: Ошибка при вызове метода контекста (ПрочитатьXML) ЗаписанноеЗначение = ПрочитатьXML(ЧтениеXML); по причине: Ошибка преобразования данных XML: [file://...][строка, колонка]
Разберем детально, почему возникает данное исключение, какие ограничения заложены в механизм прямой сериализации платформы 1С:Предприятие и какими путями можно решить возникшую проблему.
Обработка ВыгрузкаЗагрузкаДанныхXML предназначена исключительно для переноса данных между полностью идентичными конфигурациями (одинаковые релизы конфигурации с точно совпадающей структурой метаданных). Внутри обработки используется прямое XDTO-сериализирование платформы посредством методов ЗаписатьXML() и ПрочитатьXML().
Проанализируем типовую ситуацию: выгрузка выполняется из базы Бухгалтерия предприятия 2.0 (релиз 2.0.53.4), а загрузка — в базу Бухгалтерия предприятия 2.0 (релиз 2.0.44.13). Между этими версиями разработчики конфигурации добавили новые реквизиты объектов, значения перечислений, предопределенные элементы или изменили составные типы данных. Когда метод ПрочитатьXML() в более старой базе встречает XML-тег с типом данных или реквизитом, которого еще нет в метаданных конфигурации-приемника, платформа не может создать объект и аварийно прерывает выполнение операции.
Также к подобной ошибке могут приводить:
Самый правильный и надежный путь решения — выровнять версии конфигураций источника и приемника. Выполним следующие шаги:
После обновления метаданные обеих баз станут полностью идентичными, и метод ПрочитатьXML() корректно восстановит все объекты.
Если обновить базу-приемник прямо сейчас невозможно, а перенести нужно небольшой объем данных, локализуем конкретный проблемный элемент по координатам из сообщения об ошибке.
Рассмотрим порядок действий:
[253732, 17], где первое число — номер строки, а второе — позиция символа.Если структуры баз существенно различаются, прямое чтение через ПрочитатьXML() не подходит. В таких случаях применяют универсальные инструменты, поддерживающие сопоставление полей и гибкую логику загрузки:
COMConnector, выполняет выборку элементов справочника и программно заполняет только те реквизиты, которые присутствуют в базе-приемнике.Таким образом, для быстрого и корректного переноса с помощью ВыгрузкаЗагрузкаДанныхXML всегда контролируем соответствие версий конфигураций, а при наличии различий в метаданных используем специализированные инструменты обмена по правилам.