При переносе данных между информационными базами с помощью стандартной обработки Выгрузка и загрузка данных XML разработчики нередко сталкиваются с падением процесса на этапе чтения файла. Ошибка сопровождается исключением платформы Ошибка при вызове метода контекста (ПрочитатьXML) со ссылкой на сбой десериализации XDTO объекта DocumentObject.ОперацияБух и его табличной части ТаблицаРегистровСведений.
Выясним причину такого поведения платформы 1С:Предприятие, разберем ключевые технические нюансы работы XDTO-сериализатора и рассмотрим практические способы решения возникшей проблемы.
Проанализируем механику работы метода Сериализатор.ПрочитатьXML(). Обработка Выгрузка и загрузка данных XML опирается на стандартный механизм платформенной сериализации в пространстве имен http://v8.1c.ru/8.1/data/enterprise/current-config. Этот механизм предъявляет жесткие требования к структуре передаваемого файла:
ТаблицаРегистровСведений).ТаблицаРегистровСведений, хранящую перечень имен регистров, по которым включены движения. Если в базе-источнике в операцию включен регистр, отсутствующий в базе-приемнике, либо табличная часть в приемнике имеет иной порядок полей, возникает ошибка десериализации строки DocumentTabularSectionRow.ОперацияБух.ТаблицаРегистровСведений.Разберем по шагам наиболее быстрый способ исправления файла без изменения конфигурации баз данных:
ОперацияБух. Заполним его минимальными данными и сохраним.DocumentObject.ОперацияБух и проанализируем блок строк внутри тега ТаблицаРегистровСведений. Обратим внимание на точные имена тегов, наличие дополнительных реквизитов и, самое главное, порядок их следования.Рассмотрим действия по нормализации информационной базы перед повторной выгрузкой:
AppData\Local\1C\1cv8 и AppData\Roaming\1C\1cv8. В клиент-серверном режиме перезапустим службу сервера 1С:Предприятия.Обратим особое внимание на фундаментальное ограничение документа ОперацияБух. У данного документа отсутствует процедура ОбработкаПроведения: он не формирует проводки динамически при проведении. Все проводки и движения записываются напрямую в наборы записей соответствующих регистров.
Если мы выгрузим только сам объект DocumentObject.ОперацияБух, в базе-приемнике документ появится, но будет полностью «пустым» — без сумм, счетов и проводок. Чтобы документ перенесся корректно со всеми данными, в обработке Выгрузка и загрузка данных XML необходимо обязательно включить в состав выгрузки:
ОперацияБух;Хозрасчетный (с отбором по регистратору);Если структуры баз имеют неизбежные различия, использование прямой XDTO-сериализации теряет смысл. В такой ситуации эффективнее применить программный перенос через COM-соединение или правила обмена (Конвертация данных 2.1). Посмотрим на пример программного создания документа и заполнения его движений через COM:
// Устанавливаем подключение к базе-приемнику
Подключение = Новый COMОбъект("V83.COMConnector");
БазаПриемник = Подключение.Connect("Srvr=""Server1C"";Ref=""AccountingBase"";Usr=""Admin"";Pwd=""Password"";");
// Создаем документ в базе-приемнике
НоваяОперация = БазаПриемник.Документы.ОперацияБух.СоздатьДокумент();
НоваяОперация.Дата = ТекущаяОперация.Дата;
НоваяОперация.Организация = БазаПриемник.Справочники.Организации.НайтиПоКоду(ТекущаяОперация.Организация.Код);
НоваяОперация.Содержание = ТекущаяОперация.Содержание;
НоваяОперация.Записать();
// Переносим проводки регистра бухгалтерии
НаборЗаписейПриемник = БазаПриемник.РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписейПриемник.Отбор.Регистратор.Установить(НоваяОперация.Ссылка);
НаборЗаписейИсточник = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписейИсточник.Отбор.Регистратор.Установить(ТекущаяОперация.Ссылка);
НаборЗаписейИсточник.Прочитать();
Для Каждого Проводка Из НаборЗаписейИсточник Цикл
НоваяПроводка = НаборЗаписейПриемник.Добавить();
НоваяПроводка.Период = Проводка.Период;
НоваяПроводка.Организация = НоваяОперация.Организация;
НоваяПроводка.СчетДт = БазаПриемник.ПланыСчетов.Хозрасчетный.НайтиПоКоду(Проводка.СчетДт.Код);
НоваяПроводка.СчетКт = БазаПриемник.ПланыСчетов.Хозрасчетный.НайтиПоКоду(Проводка.СчетКт.Код);
НоваяПроводка.Сумма = Проводка.Сумма;
НоваяПроводка.Содержание = Проводка.Содержание;
КонецЦикла;
НаборЗаписейПриемник.Записать();
Рассмотренный программный подход полностью исключает влияние расхождений в XSD-схемах и гарантирует корректный перенос проводок между конфигурациями с разным составом метаданных.