Механизм XDTO является универсальным способом представления данных для интеграции с другими системами. Аббревиатура XDTO расшифровывается как XML Data Transfer Objects. XDTO является механизмом объектного моделирования данных, описываемых с помощью схемы XML.
Можно выделить несколько задач, для решения которых используется механизм XDTO:
В данном разделе мы остановимся на вопросе сериализации данных на основе механизма XDTO. Использование механизма для описания типов параметров и возвращаемых значений Web-сервисов рассмотрено в главе «».
В настоящее время обмен с различными программными системами реализуется с использованием XML. Механизм XDTO позволяет создавать требуемые для обмена схемы XML и формировать XML-документы, удовлетворяющие этим схемам.
Основным понятием, на котором строится механизм XDTO, является фабрика XDTO. Фабрика XDTO содержит описание всех типов, с которыми оперирует система. В частности, при создании новой информационной базы «1С:Предприятия» автоматически создается глобальная фабрика XDTO, которая описывает все типы, используемые в конфигурации. Эта фабрика доступна через свойство глобального контекста ФабрикаXDTO.
В общем случае фабрика XDTO создается на основании описаний всех типов, которые зарегистрированы в фабрике. Для создания фабрики XDTO средствами встроенного языка используется конструктор объекта ФабрикаXDTO, которому передается набор схем XML, содержащийся в объекте НаборСхемXML.
В системе «1С:Предприятие» реализована сериализация данных на основе механизма XDTO, которая позволяет сериализовать в/из XML все типы данных, хранящиеся в базе данных.
XDTO-сериализация предназначена для сохранения данных объекта в файл XML и создания объекта на основе данных, хранящихся в файле XML. Для этого используется объект СериализаторXDTO, который может быть получен с помощью конструктора на основе существующей фабрики XDTO.
Например, сериализация ссылки на элемент справочника Товары в файл XML может быть выполнена с помощью следующего программного кода (листинги 6.116, 6.117). При этом так же, как это подробно описано в разделе «», передача XML-документа между клиентом и сервером происходит через временное хранилище, поэтому мы не будем еще раз на этом останавливаться.
Листинг 6.116. Сериализация ссылки на элемент справочника «Товары» в файл XML
&НаКлиенте
Процедура СериализацияВXML(Команда)
АдресДокументаВХранилище = СериализацияВXMLНаСервере();
НачатьПолучениеФайлаССервера(, АдресДокументаВХранилище, "c:\temp\exchange.xml");
КонецПроцедуры
Листинг 6.117. Функция «СериализацияВXMLНаСервере()»
&НаСервереБезКонтекста
Функция СериализацияВXMLНаСервере()
// Создать сериализатор XDTO для глобальной фабрики XDTO.
НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
// Создать объект записи XML и открыть файл.
ИмяФайлаXML = КаталогВременныхФайлов() + "temp.xml";
НоваяЗаписьXML = Новый ЗаписьXML;
НоваяЗаписьXML.ОткрытьФайл(ИмяФайлаXML);
// Получить ссылку на элемент справочника Товары.
СсылкаНаЭлементСправочника = Справочники.Товары.НайтиПоКоду("000000003");
// Сериализовать ссылку в XML.
НовыйСериализаторXDTO.ЗаписатьXML(НоваяЗаписьXML, СсылкаНаЭлементСправочника, НазначениеТипаXML.Явное);
НоваяЗаписьXML.Закрыть();
Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаXML));
КонецФункции
В функции СериализацияВXMLНаСервере() создается объект СериализаторXDTO и методом этого объекта ЗаписатьXML() производится сериализация ссылки на элемент справочника Товары во временный файл, адрес которого во временном хранилище функция возвращает на клиент.
Сериализация ссылки на элемент справочника Товары из файла XML может быть выполнена с помощью следующего программного кода (листинги 6.118, 6.119).
Листинг 6.118. Сериализация ссылки на элемент справочника «Товары» из файла XML
&НаКлиенте
Процедура СериализацияИзXML(Команда)
АдресВременногоХранилища = "";
ОповещениеОЗавершении = Новый ОписаниеОповещения("СериализацияИзXMLЗавершение", ЭтотОбъект);
НачатьПомещениеФайлаНаСервер(ОповещениеОЗавершении, , , АдресВременногоХранилища, "c:\temp\exchange.xml",
УникальныйИдентификатор);
КонецПроцедуры
Листинг 6.119. Обработчик оповещения «СериализацияИзXMLЗавершение()»
&НаКлиенте
Процедура СериализацияИзXMLЗавершение(ОписаниеПомещенногоФайла, Дополнительно) Экспорт
СериализацияИзXMLНаСервере(ОписаниеПомещенногоФайла.Адрес);
КонецПроцедуры
В обработчике оповещения СериализацияИзXMLЗавершение() вызывается серверная процедура СериализацияИзXMLНаСервере(), в которую передается адрес помещенного файла, содержащего сериализованное значение ссылки на элемент справочника Товары (листинг 6.120).
Листинг 6.120. Процедура «СериализацияИзXMLНаСервере()»
&НаСервереБезКонтекста
Процедура СериализацияИзXMLНаСервере(АдресДокументаВХранилище)
// Создать сериализатор XDTO для глобальной фабрики XDTO.
НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
// Прочитать данные объекта XDTO из файла XML
ДанныеДокумента = ПолучитьИзВременногоХранилища(АдресДокументаВХранилище);
ИмяФайлаXML = КаталогВременныхФайлов() + "temp.xml";
ДанныеДокумента.Записать(ИмяФайлаXML);
НовоеЧтениеXML = Новый ЧтениеXML;
НовоеЧтениеXML.ОткрытьФайл(ИмяФайлаXML);
// Сериализовать ссылку из XML.
СсылкаНаЭлементСправочника = НовыйСериализаторXDTO.ПрочитатьXML(НовоеЧтениеXML);
ЭлементСправочника = СсылкаНаЭлементСправочника.ПолучитьОбъект();
ЭлементСправочника.Наименование = ЭлементСправочника.Наименование + " - сериализован из XML " + Строка(ТекущаяДата());
ЭлементСправочника.Записать();
НовоеЧтениеXML.Закрыть();
КонецПроцедуры
В этой процедуре данные файла получаются из временного хранилища, сохраняются во временный файл и происходит чтение сериализованного значения методом ПрочитатьXML() объекта СериализаторXDTO. После этого по прочитанной ссылке получается объект ? элемент справочника. И затем этот элемент редактируется и записывается.