Обновлено: 15.11.2007

Использование объектов XDTO в web-сервисах

Механизм 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-сервиса.