При переносе документов и справочников между информационными базами с помощью стандартной обработки «Выгрузка и загрузка данных XML» разработчики нередко сталкиваются с ситуацией, когда табличные части или шапки документов переносятся без значений перечислений. В результате документы в базе-приемнике невозможно провести или пересчитать, так как ключевые реквизиты (например, СпособУчетаНДС, СтавкаНДС) остаются пустыми.
Разберем детально, как устроен механизм сериализации данных, по каким причинам перечисления не загружаются и как решить эту проблему.
Обработка «Выгрузка и загрузка данных XML» построена на платформенном механизме СериализаторXDTO (методы ЗаписатьXML и ПрочитатьXML). При экспорте данных ссылки на элементы перечислений выгружаются в файл в виде строкового значения, соответствующего системному имени значения перечисления в дереве метаданных конфигурации, например:
<СпособУчетаНДС>ПринимаетсяКВычету</СпособУчетаНДС>
При импорте в базу-приемник платформа сопоставляет прочитанное имя значения с перечислением, указанным в описании типа реквизита. Если структура данных полностью идентична, значение подставляется автоматически без ошибок.
xsi:type). Если состав типов в двух базах различается, сериализатор не сможет однозначно определить тип и пропустит заполнение.ОбменДанными.Загрузка = Истина. Этот режим отключает типовые проверки платформы, однако он не отключает выполнение кода в обработчиках событий ПередЗаписью, ПриЗаписи и в подписках на события, если в них разработчиком не прописана соответствующая проверка. Если в коде документа выполняется автозаполнение реквизитов при записи, перенесенное перечисление может затираться алгоритмами конфигурации.Выполним сравнение конфигураций базы-источника и базы-приемника через механизм «Конфигурация — Сравнить, объединить с конфигурацией из файла». Обратим внимание на следующие моменты:
Проанализируем модуль объекта загружаемого документа и назначенные подписки на события. Убедимся, что во всех процедурах записи присутствует проверка режима загрузки данных:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Алгоритмы автозаполнения реквизитов при интерактивной работе
КонецПроцедуры
Если условие отсутствует, алгоритмы конфигурации при записи объекта перезаполнят или очистят перенесенный реквизит.
Если конфигурации баз различаются (например, одна база доработана, а другая является типовой), универсальная выгрузка по прямому дампу XML не подходит. В таком случае перенос следует выполнять через обработку «Универсальный обмен данными в формате XML» с использованием правил обмена, подготовленных в конфигурации «Конвертация данных»:
Если перенос уже выполнен в базу-приемник, а перечисления не заполнились, данные можно восстановить без повторной выгрузки:
Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
Для Каждого СтрТЧ Из ДокументОбъект.Товары Цикл
Если Не ЗначениеЗаполнено(СтрТЧ.СпособУчетаНДС) Тогда
СтрТЧ.СпособУчетаНДС = Перечисления.СпособыУчетаНДС.ПринимаетсяКВычету;
КонецЕсли;
КонецЦикла;
ДокументОбъект.Записать();
КонецЦикла;