Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

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