Обновлено: 15.11.2007
Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.
Центральным понятием механизма XDTO является понятие объекта переноса данных. Объект переноса данных можно представить как одиночный объект или замкнутый граф объектов, который может быть перенесен с одного компьютера на другой. Объект переноса данных характеризуется двумя основными свойствами: возможностью сериализации/десериализации в формат передачи данных (как правило, в XML) и свойством замкнутости.
Способность сериализоваться/десериализоваться в формат переноса данных позволяет объекту переноса данных мигрировать с одного компьютера на другой. Между разными компьютерами и даже разными процессами одного компьютера нет единого адресного пространства и нет возможности передавать объект по ссылке. Поэтому сериализация является единственным способом взаимодействия между этими процессами. Сериализация позволяет представить объект в некоторой промежуточной форме, например в виде xml, передать эту промежуточную форму заданному процессу заданного компьютера и обратно десериализовать объект в вид, пригодный для программного использования.
Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.
Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.
Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.
Строки моделируются типами-значениями. Строковый тип имеет имя: {http://www.w3.org/2001/XMLSchema}string. В фигурных скобках здесь задается пространство имен типа. В XDTO как и в XML схеме, на которой он основан, все типы имеют пространство имен и локальное имя.
Для создания строкового значения нужно:
Копировать в буфер обменастроковыйТип = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"); значение = ФабрикаXDTO.Создать(строковыйТип, "Hello world!");
Строка при передаче представляется в виде текста xml тега:
Копировать в буфер обмена<param>Hello world!</param>
Следует учесть, что строки конвертируются в UTF-8 при сериализации.
Целые числа моделируются типами-значениями. Целочисленный тип имеет имя: {http://www.w3.org/2001/XMLSchema}int.
Для создания целочисленного значения нужно:
Копировать в буфер обменацелыйТип = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "int"); значение = ФабрикаXDTO.Создать(целыйТип, 10);
Число при передаче представляется в виде текста xml тега:
Копировать в буфер обмена<param>10</param>
Дробные числа моделируются типами-значениями. Дробный тип с фиксированной точкой имеет имя: {http://www.w3.org/2001/XMLSchema}decimal, дробный тип с плавающей точкой имеет имя: {http://www.w3.org/2001/XMLSchema}float, дробный тип с плавающей точкой двойной точности имеет имя: {http://www.w3.org/2001/XMLSchema}double.
Для создания дробного значения нужно:
Копировать в буфер обменадробныйТип = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "decimal"); значение = ФабрикаXDTO.Создать(дробныйТип, "123.11");
Число при передаче представляется в виде текста xml тега:
Копировать в буфер обмена<param>123.11</param>
Даты моделируются типами-значениями. Тип даты без времени имеет имя: {http://www.w3.org/2001/XMLSchema}date, тип времени без даты имеет имя: {http://www.w3.org/2001/XMLSchema}time, тип даты и времени имеет имя: {http://www.w3.org/2001/XMLSchema}dateTime.
Для создания значения даты нужно:
Копировать в буфер обменатипДаты = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"); значение = ФабрикаXDTO.Создать(типДаты, "2007-11-12T12:58:00");
Число при передаче представляется в виде текста xml тега:
Копировать в буфер обмена<param>2007-11-12T12:58:00</param>
Лексическое представление даты задается в формате:
Копировать в буфер обменаГод-Месяц-День ВременнаяЗона
Временная зона может быть не указана.
Лексическое представление времени задается в формате:
Копировать в буфер обменаЧас:Минута:Секунда ВременнаяЗона
Временная зона может быть не указана.
Лексическое представление даты вместе со временем задается в формате:
Копировать в буфер обменаГод-Месяц-ДеньTЧас:Минута:Секунда ВременнаяЗона
Дата от времени разделяется символом T. Временная зона может быть не указана.
Структуры моделируются типами-объектами. Перед тем как использовать структуру необходимо создать пакет XDTO, описываающий тип-объект структуры (например, через редактор XDTO). Тип-объект может содержать свойства, котрые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом.
Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:
Копировать в буфер обменаструктурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "Номенклатура"); номенклатура = ФабрикаXDTO.Создать(структурныйТип); номенклатура.Наименование = "Ботинки женские"; номенклатура.ЗакупочнаяЦена = 1000;
Структура при передаче представляется в виде xml структуры:
Копировать в буфер обмена<Номенклатура xmlns="http://www.1c.ru/demos/products"> <Наименование>Ботинки женские</Наименование> <ЗакупочнаяЦена>1000</ЗакупочнаяЦена> </Номенклатура>
Массивы моделируются свойствами типов-объектов. Тип массива нельзя создать напрямую, но на определенном свойстве типа-объекта можно указать минимальное количество и максимальное количество элементов массива. Если оба значения равны 1, то это единичное свойство, если максимальное количество больше 1, то - множественное свойство. Свойства-массивы реализованы в XDTO через СписокXDTO.
Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:
Копировать в буфер обменаструктурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "НоменклатураГруппа"); номенклатураГруппа = ФабрикаXDTO.Создать(структурныйТип); номенклатураГруппа.Элементы.Добавить(номенклатура);
Массив при передаче представлятся в виде xml структуры:
Копировать в буфер обмена<НоменклатураГруппа xmlns="http://www.1c.ru/demos/products"> Копировать в буфер обмена<Элементы> <Наименование>Ботинки женские</Наименование> <ЗакупочнаяЦена>1000</ЗакупочнаяЦена> </Элементы>Копировать в буфер обмена<Элементы> <Наименование>Ботинки детские</Наименование> <ЗакупочнаяЦена>500</ЗакупочнаяЦена> </Элементы></НоменклатураГруппа>
Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.
Каждый клиентский прокси (клиентская часть web-сервиса - объект WSПрокси) содержит ссылку на фабрику XDTO, которая может использоваться для создания объектов и значений XDTO для передачи в качестве параметров и возвращаемых значений операций web-сервисов. Заметим, что глобальная XDTO фабрика (получаемая через свойство глобального контекста ФабрикаXDTO) не может быть использована для создания объектов и значений для передачи через прокси, даже если она содержит типы с такой же структурой и именами. Эти типы все равно будут считаться несовместимыми с типами данных web-сервиса.
Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.