Как исправить ошибку преобразования XDTO при выгрузке документа ОперацияБух через XML в 1С?

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

При переносе данных между информационными базами с помощью стандартной обработки Выгрузка и загрузка данных XML разработчики нередко сталкиваются с падением процесса на этапе чтения файла. Ошибка сопровождается исключением платформы Ошибка при вызове метода контекста (ПрочитатьXML) со ссылкой на сбой десериализации XDTO объекта DocumentObject.ОперацияБух и его табличной части ТаблицаРегистровСведений.

Выясним причину такого поведения платформы 1С:Предприятие, разберем ключевые технические нюансы работы XDTO-сериализатора и рассмотрим практические способы решения возникшей проблемы.

Почему возникает ошибка преобразования данных XDTO

Проанализируем механику работы метода Сериализатор.ПрочитатьXML(). Обработка Выгрузка и загрузка данных XML опирается на стандартный механизм платформенной сериализации в пространстве имен http://v8.1c.ru/8.1/data/enterprise/current-config. Этот механизм предъявляет жесткие требования к структуре передаваемого файла:

  1. Строгое соответствие XSD-схеме: фабрика XDTO в базе-приемнике генерирует схему типов динамически на основании структуры метаданных текущей информационной базы. Схема строго фиксирует состав реквизитов, табличных частей и строгий порядок следования XML-тегов. Любое несовпадение приводит к мгновенной остановке чтения.
  2. Различия в конфигурациях и расширениях: даже если версии конфигураций формально совпадают, базы могут иметь различные доработки в основной конфигурации либо подключенные расширения, изменяющие структуру объектов (добавленные реквизиты или измененный состав табличной части ТаблицаРегистровСведений).
  3. Специфика документа «ОперацияБух»: данный документ содержит служебную табличную часть ТаблицаРегистровСведений, хранящую перечень имен регистров, по которым включены движения. Если в базе-источнике в операцию включен регистр, отсутствующий в базе-приемнике, либо табличная часть в приемнике имеет иной порядок полей, возникает ошибка десериализации строки DocumentTabularSectionRow.ОперацияБух.ТаблицаРегистровСведений.
  4. Различия в правах и RLS: если пользователь, под которым выполняется загрузка, ограничен в правах на уровне записей и полей (RLS), платформа исключает недоступные элементы из схемы XDTO текущего сеанса, вызывая ошибку при попытке прочитать существующий в файле тег.
  5. Кэш метаданных после динамического обновления: применение динамического обновления («демоническое обновление») в одной из баз часто приводит к рассинхронизации серверного кэша метаданных, из-за чего сериализатор ожидает устаревшую последовательность полей.

Способ 1. Сравнение структуры XML и ручная корректировка файла

Разберем по шагам наиболее быстрый способ исправления файла без изменения конфигурации баз данных:

  1. Откроем базу-приемник и создадим в ней тестовый документ ОперацияБух. Заполним его минимальными данными и сохраним.
  2. С помощью обработки Выгрузка и загрузка данных XML выгрузим этот тестовый документ из базы-приемника в отдельный XML-файл.
  3. Воспользуемся встроенным инструментом 1С: откроем главное меню Файл -> Сравнить файлы... (или запустим внешний инструмент сравнения, например, KDiff3) и выполним сопоставление файла из базы-источника с эталонным файлом из базы-приемника.
  4. Найдем узел DocumentObject.ОперацияБух и проанализируем блок строк внутри тега ТаблицаРегистровСведений. Обратим внимание на точные имена тегов, наличие дополнительных реквизитов и, самое главное, порядок их следования.
  5. В текстовом редакторе приведем порядок следования и состав тегов в исходном файле выгрузки к виду, который ожидает база-приемник, удалив лишние элементы или переставив их местами.
  6. Повторим загрузку скорректированного файла через обработку.

Способ 2. Устранение рассинхронизации метаданных и очистка кэша

Рассмотрим действия по нормализации информационной базы перед повторной выгрузкой:

  1. Сравним основные конфигурации обеих баз через конфигуратор: выполним Конфигурация -> Сравнить, объединить с конфигурацией из файла, чтобы убедиться в отсутствии скрытых доработок. Также проверим состав расширений в обеих базах.
  2. Проверим свойство Режим совместимости в корневом узле конфигурации: различия в этом свойстве изменяют внутренние XDTO-пакеты платформы.
  3. Выполним сброс кэша: удалим временные файлы пользователя в каталогах AppData\Local\1C\1cv8 и AppData\Roaming\1C\1cv8. В клиент-серверном режиме перезапустим службу сервера 1С:Предприятия.
  4. Убедимся, что загрузка выполняется пользователем с ролью Администратор системы или Полные права, у которого отключено действие RLS.

Важная особенность: перенос проводок документа «ОперацияБух»

Обратим особое внимание на фундаментальное ограничение документа ОперацияБух. У данного документа отсутствует процедура ОбработкаПроведения: он не формирует проводки динамически при проведении. Все проводки и движения записываются напрямую в наборы записей соответствующих регистров.

Если мы выгрузим только сам объект DocumentObject.ОперацияБух, в базе-приемнике документ появится, но будет полностью «пустым» — без сумм, счетов и проводок. Чтобы документ перенесся корректно со всеми данными, в обработке Выгрузка и загрузка данных XML необходимо обязательно включить в состав выгрузки:

  1. Сам документ ОперацияБух;
  2. Регистр бухгалтерии Хозрасчетный (с отбором по регистратору);
  3. Регистры сведений и регистры накопления, движения по которым зафиксированы в переносимой операции.

Способ 3. Перенос через COM-соединение как надежная альтернатива

Если структуры баз имеют неизбежные различия, использование прямой XDTO-сериализации теряет смысл. В такой ситуации эффективнее применить программный перенос через COM-соединение или правила обмена (Конвертация данных 2.1). Посмотрим на пример программного создания документа и заполнения его движений через COM:


// Устанавливаем подключение к базе-приемнику
Подключение = Новый COMОбъект("V83.COMConnector");
БазаПриемник = Подключение.Connect("Srvr=""Server1C"";Ref=""AccountingBase"";Usr=""Admin"";Pwd=""Password"";");

// Создаем документ в базе-приемнике
НоваяОперация = БазаПриемник.Документы.ОперацияБух.СоздатьДокумент();
НоваяОперация.Дата = ТекущаяОперация.Дата;
НоваяОперация.Организация = БазаПриемник.Справочники.Организации.НайтиПоКоду(ТекущаяОперация.Организация.Код);
НоваяОперация.Содержание = ТекущаяОперация.Содержание;
НоваяОперация.Записать();

// Переносим проводки регистра бухгалтерии
НаборЗаписейПриемник = БазаПриемник.РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписейПриемник.Отбор.Регистратор.Установить(НоваяОперация.Ссылка);

НаборЗаписейИсточник = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписейИсточник.Отбор.Регистратор.Установить(ТекущаяОперация.Ссылка);
НаборЗаписейИсточник.Прочитать();

Для Каждого Проводка Из НаборЗаписейИсточник Цикл
    НоваяПроводка = НаборЗаписейПриемник.Добавить();
    НоваяПроводка.Период = Проводка.Период;
    НоваяПроводка.Организация = НоваяОперация.Организация;
    НоваяПроводка.СчетДт = БазаПриемник.ПланыСчетов.Хозрасчетный.НайтиПоКоду(Проводка.СчетДт.Код);
    НоваяПроводка.СчетКт = БазаПриемник.ПланыСчетов.Хозрасчетный.НайтиПоКоду(Проводка.СчетКт.Код);
    НоваяПроводка.Сумма = Проводка.Сумма;
    НоваяПроводка.Содержание = Проводка.Содержание;
КонецЦикла;

НаборЗаписейПриемник.Записать();

Рассмотренный программный подход полностью исключает влияние расхождений в XSD-схемах и гарантирует корректный перенос проводок между конфигурациями с разным составом метаданных.

← На главную