Почему возникает ошибка преобразования XML при загрузке данных через ВыгрузкаЗагрузкаДанныхXML и как её исправить?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переносе справочников и документов между информационными базами с помощью типовой обработки ВыгрузкаЗагрузкаДанных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-тег с типом данных или реквизитом, которого еще нет в метаданных конфигурации-приемника, платформа не может создать объект и аварийно прерывает выполнение операции.

Также к подобной ошибке могут приводить:

  1. Недопустимые управляющие символы XML (ASCII-коды от 0x00 до 0x1F, за исключением разрешенных переводов строк и табуляций), которые иногда присутствуют в строковых полях старых баз.
  2. Битые ссылки на удаленные объекты метаданных или некорректно заполненные составные типы.

Вариант 1. Обновление конфигурации-приемника (рекомендуемый)

Самый правильный и надежный путь решения — выровнять версии конфигураций источника и приемника. Выполним следующие шаги:

  1. Создадим резервную копию информационной базы-приемника.
  2. Обновим конфигурацию базы-приемника до точной версии базы-источника (в нашем примере — до релиза 2.0.53.4).
  3. Применим изменения метаданных и выполним запуск в режиме 1С:Предприятие для прохождения обработчиков обновления.
  4. Повторим загрузку XML-файла через стандартную обработку ВыгрузкаЗагрузкаДанныхXML.

После обновления метаданные обеих баз станут полностью идентичными, и метод ПрочитатьXML() корректно восстановит все объекты.

Вариант 2. Точечный анализ и корректировка файла выгрузки

Если обновить базу-приемник прямо сейчас невозможно, а перенести нужно небольшой объем данных, локализуем конкретный проблемный элемент по координатам из сообщения об ошибке.

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

  1. В тексте ошибки найдем точные координаты сбоя — например, [253732, 17], где первое число — номер строки, а второе — позиция символа.
  2. Откроем сформированный XML-файл в текстовом редакторе, поддерживающем работу с большими объемами данных.
  3. Перейдем к указанной строке и определим, какой именно объект метаданных или реквизит вызвал сбой при чтении.
  4. Если в объекте выгружен реквизит, отсутствующий в старом релизе, удалим соответствующий XML-блок либо исключим весь этот справочник из первоначальной выгрузки, сняв соответствующий флаг в дереве метаданных обработки.

Вариант 3. Использование альтернативных инструментов переноса данных

Если структуры баз существенно различаются, прямое чтение через ПрочитатьXML() не подходит. В таких случаях применяют универсальные инструменты, поддерживающие сопоставление полей и гибкую логику загрузки:

  1. Конфигурация «Конвертация данных» (редакция 2) и обработка Универсальный обмен данными в формате XML. Этот механизм позволяет сформировать правила обмена (ПКО, ПКС), в которых можно отключить перенос новых реквизитов, настроить сопоставление справочников по ключевым полям (Код, Наименование, ИНН) и программно обработать различия в типах данных.
  2. Обработка «Загрузка данных из табличного документа». Если требуется перенести простые плоские справочники (например, «Номенклатура», «Контрагенты», «Статьи затрат»), выгрузим их в таблицу (MXL, XLS или CSV) и выполним загрузку в целевую базу с ручным сопоставлением колонок реквизитам.
  3. Перенос через COM-соединение. Разработаем небольшую внешнюю обработку, которая подключается к базе-источнику через COMConnector, выполняет выборку элементов справочника и программно заполняет только те реквизиты, которые присутствуют в базе-приемнике.

Таким образом, для быстрого и корректного переноса с помощью ВыгрузкаЗагрузкаДанныхXML всегда контролируем соответствие версий конфигураций, а при наличии различий в метаданных используем специализированные инструменты обмена по правилам.

← На главную