Почему обработка Выгрузка и загрузка данных XML не переносит перечисления

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

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

Разберем детально, как устроен механизм сериализации данных, по каким причинам перечисления не загружаются и как решить эту проблему.

Принцип работы выгрузки данных через XML

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

<СпособУчетаНДС>ПринимаетсяКВычету</СпособУчетаНДС>

При импорте в базу-приемник платформа сопоставляет прочитанное имя значения с перечислением, указанным в описании типа реквизита. Если структура данных полностью идентична, значение подставляется автоматически без ошибок.

Основные причины, почему перечисления не заполняются

  1. Неидентичность метаданных конфигураций. Обработка предназначена строго для полностью одинаковых конфигураций. Если одна база типовая, а вторая доработанная, даже при совпадении номеров релизов имена типов или структура объектов могут отличаться. Если в базе-приемнике перечисление называется иначе, значение отсутствует или изменено его имя (идентификатор), значение реквизита загрузится пустым.
  2. Составной тип данных реквизита. Если реквизит в источнике или приемнике имеет составной тип (например, перечисление и справочник), в XML-файле обязательно должен присутствовать атрибут с явным указанием типа данных (xsi:type). Если состав типов в двух базах различается, сериализатор не сможет однозначно определить тип и пропустит заполнение.
  3. Перезаполнение реквизитов в модуле объекта при записи. При загрузке данных обычно устанавливается флаг ОбменДанными.Загрузка = Истина. Этот режим отключает типовые проверки платформы, однако он не отключает выполнение кода в обработчиках событий ПередЗаписью, ПриЗаписи и в подписках на события, если в них разработчиком не прописана соответствующая проверка. Если в коде документа выполняется автозаполнение реквизитов при записи, перенесенное перечисление может затираться алгоритмами конфигурации.

Способы решения проблемы

1. Проверка идентичности метаданных и типов

Выполним сравнение конфигураций базы-источника и базы-приемника через механизм «Конфигурация — Сравнить, объединить с конфигурацией из файла». Обратим внимание на следующие моменты:

  1. Проверим имена и состав значений перечисления. Имена элементов перечисления (не синонимы) должны совпадать символ в символ с учетом регистра.
  2. Проверим состав типов реквизита документа, в который загружается перечисление. Набор допустимых типов в источнике и приемнике должен быть строго одинаковым.

2. Проверка кода обработчиков событий документа

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


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Алгоритмы автозаполнения реквизитов при интерактивной работе
    
КонецПроцедуры

Если условие отсутствует, алгоритмы конфигурации при записи объекта перезаполнят или очистят перенесенный реквизит.

3. Использование конфигурации «Конвертация данных» (КД)

Если конфигурации баз различаются (например, одна база доработана, а другая является типовой), универсальная выгрузка по прямому дампу XML не подходит. В таком случае перенос следует выполнять через обработку «Универсальный обмен данными в формате XML» с использованием правил обмена, подготовленных в конфигурации «Конвертация данных»:

  1. Выгрузим описания метаданных обеих баз.
  2. В «Конвертации данных» настроим Правила конвертации объектов (ПКО) для нужных документов.
  3. Для реквизита перечисления создадим Правило конвертации свойств (ПКС) и сопоставим значения источника и приемника в таблице правил конвертации значений (ПКЗ).

4. Групповое восстановление реквизитов после загрузки

Если перенос уже выполнен в базу-приемник, а перечисления не заполнились, данные можно восстановить без повторной выгрузки:

  1. Используем стандартную обработку «Групповое изменение реквизитов» для массовой установки нужного значения перечисления в документах за выбранный период.
  2. При необходимости напишем внешнюю обработку для программного заполнения значения по условиям:

Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
    ДокументОбъект = Выборка.ПолучитьОбъект();
    ДокументОбъект.ОбменДанными.Загрузка = Истина;
    
    Для Каждого СтрТЧ Из ДокументОбъект.Товары Цикл
        Если Не ЗначениеЗаполнено(СтрТЧ.СпособУчетаНДС) Тогда
            СтрТЧ.СпособУчетаНДС = Перечисления.СпособыУчетаНДС.ПринимаетсяКВычету;
        КонецЕсли;
    КонецЦикла;
    
    ДокументОбъект.Записать();
КонецЦикла;
← На главную