В прошлой статье я рассказывал о том, что такое XDTO в 1С, для чего этот механизм нужен и как его использовать.
Сегодня я попробую рассказать о еще одном применении механизма XDTO, а именно об XDTO-сериализации.
Для начала рассмотрим простой случай: предположим у нас есть две конфигурации, и эти две конфигурации имеют одинаковые по структуре объекты, например, справочники (одинаковыми должны быть названия объектов, а также названия, количество и типы реквизитов).

В этом случае передать данные из одной конфигурации в другую достаточно просто.
Сериализация:
1 2 3 4 5 6 7 8 9 | &НаСервере Процедура СериализироватьВXMLНаСервере(); тСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); тЗаписьXML = Новый ЗаписьXML; тЗаписьXML.ОткрытьФайл("C:\test.xml"); тСериализаторXDTO.ЗаписатьXML(тЗаписьXML, Справочники.Тест.НайтиПоНаименованию("Тест 1").ПолучитьОбъект(), НазначениеТипаXML.Явное); КонецПроцедуры |
Десериализация:
1 2 3 4 5 6 7 8 9 | &НаСервере Процедура ДесериализоватьИзXMLНаСервере() тСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); тЧтениеXML = Новый ЧтениеXML; тЧтениеXML.ОткрытьФайл("C:\test.xml"); тСсылка = тСериализаторXDTO.ПрочитатьXML(тЧтениеXML); КонецПроцедуры |
После сериализации у нас получается вот такой файл:

А после десериализации у нас будет ссылка на тот же самый объект в другой конфигурации.
Нужно заметить, что XDTO-сериализации подвергаются не только объекты конфигурации (документы, справочники), но и многие объекты встроенного языка (структуры например):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | &НаСервере Процедура СериализироватьВXMLНаСервере(); тСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); тЗаписьXML = Новый ЗаписьXML; тЗаписьXML.ОткрытьФайл("C:\test.xml"); тСтруктура = Новый Структура; тСтруктура.Вставить("Тест1", "Тест1"); тСтруктура.Вставить("Тест2", "Тест2"); тСтруктура.Вставить("Тест3", "Тест3"); тСериализаторXDTO.ЗаписатьXML(тЗаписьXML, тСтруктура, НазначениеТипаXML.Явное); КонецПроцедуры |
Если же у нам не нужно сериализировать все реквизиты или в принимающей конфигурации нет копии объекта отдающей конфигурации, то тут работает несколько более сложная схема.
На самом деле, я не знаю, как выполнить эту задачу при помощи объекта «СериализаторXDTO», я пользуюсь только фабрикой, но продолжаю считать этот процесс XDTO-сериализацией. Если Вы знаете более правильный способ, то я с удовольствием его изучу. А сейчас продолжим.
Во-первых нам потребуется XDTO-пакет (или соответствующий XSD-файл) описывающий данные которые мы хотим сериализировать. Для своего справочника я сделал вот такой XDTO-пакет:

Как видно, я хочу чтобы в сериализации участвовали только «Код», «Наименование» и «Реквизит1».
Сама XDTO-сериализация выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | &НаСервере Процедура СериализироватьВXMLНаСервере(); тНаборСхем = ФабрикаXDTO.ЭкспортСхемыXML("http://1c-programmer-blog.ru/testsr"); тФабрика = Новый ФабрикаXDTO(тНаборСхем); тЗаписьXML = Новый ЗаписьXML; тЗаписьXML.ОткрытьФайл("C:\test.xml"); тТип = тФабрика.Тип("http://1c-programmer-blog.ru/testsr", "Тест"); тТипXDTO = тФабрика.Создать(тТип); ЗаполнитьЗначенияСвойств(тТипXDTO, Справочники.Тест.НайтиПоНаименованию("Тест 1").ПолучитьОбъект()); тФабрика.ЗаписатьXML(тЗаписьXML, тТипXDTO); тЗаписьXML.Закрыть(); КонецПроцедуры |
В коде выше на основании XDTO-пакета создается фабрика, затем тип объекта XDTO, а после этого и сам объект XDTO нужного типа. После заполнения всех нужных свойств, объект записывается в XML-файл:

По очень похожему алгоритму происходит и десериализация объекта:
1 2 3 4 5 6 7 8 9 10 11 12 | &НаСервере Процедура ДесериализоватьИзXMLНаСервере() тНаборСхем = ФабрикаXDTO.ЭкспортСхемыXML("http://1c-programmer-blog.ru/testsr"); тФабрика = Новый ФабрикаXDTO(тНаборСхем); тТип = тФабрика.Тип("http://1c-programmer-blog.ru/testsr", "Тест"); тЧтениеXML = Новый ЧтениеXML; тЧтениеXML.ОткрытьФайл("C:\test.xml"); тОбъектXDTO = тФабрика.ПрочитатьXML(тЧтениеXML, тТип); КонецПроцедуры |
На выходе мы получаем объект XDTO со свойствами заполненными из файла, дальше мы можем делать с этим объектом все, что нам нужно.
На этом все, буду рад услышать любые дополнения и замечания.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Здравствуйте! Ваш блог нашла поиском по ошибке, кот возникает в конфигурации Витязь (достроенная БГУ) при загрузке комплекта отчетности.
Если Вы так просто рассказываете о непонятной сериализации, то:
Помогите разобраться что происходит и как выпутаться из этой ситуации!
Вот проблема:
[2016-07-28 12:49:51 (•)]: Начало загрузки существующего объекта.
— Объект: «ф.0503178\стр. 02\гр. 3»
— Метаданные: «Справочник.ОперандыПоказателей»
[EESE0000] [SDXC0200] Объект XDTO ‘/assertionGroup[4]/assertionGroup[1]/assertionDef[63]/operand[2]’ не может быть прочитан.
Модуль: , Номер строки:
причина:
[EESE0000] Поле объекта не обнаружено (СпособыВычисленияПараметровОперандов)
Модуль: Обработка.СериализацияУниверсальнаяОтчетностьМета.МодульОбъекта, Номер строки: 1 514
Модуль: Обработка.ДиспетчерСериализации.МодульОбъекта, Номер строки: 1 042
Добрый день, не уверен, но возможно, что это связанно с тем, что в конфигурации (куда загружаются данные) у справочника «ОперандыПоказателей» нет реквизита «СпособыВычисленияПараметровОперандов».
Я бы добавил этот реквизит справочнику (перенес из выгружаемой конфигурации)
Елена, помог ли совет Тимура?
Несмотря на одинаковое название реквизитов в разных базах,
Очень важна одинаковая последовательность.
При разной последовательности будет/может выдавать подобные ошибки.
Спасибо!!! Только это помогло. Порядок реквизитов. И ещё если во второй базе больше реквизитов, то их тоже нужно добавить
Для разовых переносов можете воспользоваться адаптивной выгрузкой загрузкой в формате XML https://infostart.ru/1c/tools/1964833/. Она игнорирует небольшие различия в структуре идентичных конфигураций.