Использование объектов XDTO в web-сервисах
Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.
Центральным понятием механизма XDTO является понятие объекта переноса данных . Объект переноса данных можно представить как одиночный объект или замкнутый граф объектов, который может быть перенесен с одного компьютера на другой. Объект переноса данных характеризуется двумя основными свойствами: возможностью сериализации/десериализации в формат передачи данных (как правило, в XML) и свойством замкнутости.
Способность сериализоваться/десериализоваться в формат переноса данных позволяет объекту переноса данных мигрировать с одного компьютера на другой. Между разными компьютерами и даже разными процессами одного компьютера нет единого адресного пространства и нет возможности передавать объект по ссылке. Поэтому сериализация является единственным способом взаимодействия между этими процессами. Сериализация позволяет представить объект в некоторой промежуточной форме, например в виде xml, передать эту промежуточную форму заданному процессу заданного компьютера и обратно десериализовать объект в вид, пригодный для программного использования.
Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.
Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.
Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.
Строки
Строки моделируются типами-значениями. Строковый тип имеет имя:
Для создания строкового значения нужно:
Строка при передаче представляется в виде текста xml тега:
Следует учесть, что строки конвертируются в UTF-8 при сериализации.
Целые числа
Целые числа моделируются типами-значениями. Целочисленный тип имеет имя:
Для создания целочисленного значения нужно:
Число при передаче представляется в виде текста xml тега:
Дробные числа
Дробные числа моделируются типами-значениями. Дробный тип с фиксированной точкой имеет имя:
Для создания дробного значения нужно:
Число при передаче представляется в виде текста xml тега:
Даты моделируются типами-значениями. Тип даты без времени имеет имя:
Для создания значения даты нужно:
Число при передаче представляется в виде текста xml тега:
Лексическое представление даты задается в формате:
Временная зона может быть не указана.
Лексическое представление времени задается в формате:
Временная зона может быть не указана.
Лексическое представление даты вместе со временем задается в формате:
Дата от времени разделяется символом T . Временная зона может быть не указана.
Структуры
Структуры моделируются типами-объектами. Перед тем как использовать структуру необходимо создать пакет XDTO, описываающий тип-объект структуры (например, через редактор XDTO). Тип-объект может содержать свойства, котрые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом.
Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:
Структура при передаче представляется в виде xml структуры:
Массивы
Массивы моделируются свойствами типов-объектов. Тип массива нельзя создать напрямую, но на определенном свойстве типа-объекта можно указать минимальное количество и максимальное количество элементов массива. Если оба значения равны 1 , то это единичное свойство, если максимальное количество больше 1 , то — множественное свойство. Свойства-массивы реализованы в XDTO через СписокXDTO.
Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:
Массив при передаче представлятся в виде xml структуры:
Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.
Каждый клиентский прокси (клиентская часть web-сервиса — объект WSПрокси ) содержит ссылку на фабрику XDTO, которая может использоваться для создания объектов и значений XDTO для передачи в качестве параметров и возвращаемых значений операций web-сервисов. Заметим, что глобальная XDTO фабрика (получаемая через свойство глобального контекста ФабрикаXDTO) не может быть использована для создания объектов и значений для передачи через прокси, даже если она содержит типы с такой же структурой и именами. Эти типы все равно будут считаться несовместимыми с типами данных web-сервиса.
Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.
XDTO — выгрузка загрузка данных
XDTO-пакет — это объект метаданных, который хранит схему данных. Аббревиатура расшифровывается как XML Data Transfer Objects. Схему данных можно описать в xml файле, а затем подгрузить в созданный XDTO-пакет. Для программной работы с пакетами-xdto предназначен объект глобального контекста ФабрикаXDTO.
Текст схемы
<xs:schema xmlns:tns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="Выгрузка" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="Список">
<xs:sequence>
<xs:element name="Номенклатура" type="tns:Номенклатура" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Номенклатура">
<xs:sequence>
<xs:element name="ГУИД" type="xs:string" minOccurs="0"/>
<xs:element name="Наименование" type="xs:string" minOccurs="0"/>
<xs:element name="Код" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
ФабрикаXDTO с использованием XDTO-пакетов
ФабрикаXDTO содержит xml-схемы всех XDTO-пакетов, которые есть в конфигурации, и обладает набором методов для работы с данными. Для того чтобы схема стала доступна в объекте ФабрикаXDTO, её необходимо добавить в дереве метаданных в ветку с названием "XDTO-пакеты". Добавить можно двумя способами, либо загрузить из файла с расширением (*.xsd), либо добавить вручную узлы пакета.
Выгрузка данных в XML файл
Если схема хранится в метаданных Общие->XDTO-пакеты, то обращение к ней возможно только на сервере.
Загрузка данных из XML файла
ФабрикаXDTO с использованием схемы из файла
Создать объект ФабрикаXDTO на основании файла схемы. Для этого существует глобальный метод СоздатьФабрикуXDTO(<Путь>, <Пакеты>). Если работа с ФабрикойXDTO происходит во внешней обработке, то схему можно хранить в макете с типом "Текстовый документ". Но для создания объекта ФабрикиXDTO все равно необходимо чтобы схема лежала во внешнем файле. Для этого можно создать временный файл и поместить в него содержимое макета.
Выгрузка данных в XML файл
Загрузка данных из XML файла
Комментарии (0)
Для того чтобы добавить сообщение, необходимо Войти или Зарегистрироваться
Работа с XML, HTTP и WEB-Сервисами
ФабрикаXDTO — Создает Объекты XDTO и записывает их в XML. Читает XML и создает из него Объекты XDTO.
СериализаторXDTO — Читает Объекты XDTO и превращает их в объекты встроенного языка 1С. Выполняет обратную операцию преобразования объекта встроенного языка в Объект XDTO.
ФабрикаXDTO ничего не знает о метаданных конфигурации, и вообще о конфигурации. Для нее нет ни ссылок, ни таблиц значений, ничего, связанного с прикладными типами среды исполнения 1С. Фабрика оперирует только XML-типами. Эти типы похожи на «родные» и их легко спутать, т.к. они описывают те же самые объекты, но в терминах XML. Тем не менее, важно понимать, что это именно разные объекты. XML-документ, содержащий таблицу значений и универсальная коллекция ТаблицаЗначений — это разные вещи. Фабрика знает только про XML.
Сериализатор XDTO — это как раз связующее звено между средой исполнения языка и фабрикой. Он знает, как прочитать узлы XML (свойства объекта XDTO) и как их интерпретировать, превращая XML в объект среды исполнения.
1с через XDTO работает не со всякими схемами, если схема загружается в конфигураторе в XDTO-пакет, значит работать с ней можно.
Простые типы XML представляются в виде объектов языка 1С с типом “ЗначениеXDTO”. Составные типы XML представляются в виде объектов языка 1С с типом “ОбъектXDTO”.
Запись и чтение объекта 1С в XML через сериализацию
Запись объекта 1С (справочник Контрагенты, с наименованием "Некое наименование" и полным наименованием "Полное имя") в XML через создание в фабрике XDTO
Объекты записаны списком с разделителем
и читаются при загрузке блоками с помощью:
ИспользованиеСхемы XSD для экспорта-испорта объектов 1С
Создание фабрики XDTO из схемы XSD (текстовая переменная "XSD")
Другой способ создания фабрики XDTO из схемы XSD (текстовая переменная "XSD")
Выгрузка списка полученных запросом объектов из базы в XML (текстовая переменная "XML", в схеме для Фабрики XDTO созданы типы "Объект" и "СписокОбъектов")
Загрузка XML (текстовая переменная "XML", в схеме для Фабрики XDTO созданы типы "Объект" и "СписокОбъектов")
Свою фабрику XDTO можно также создать непосредственно из файла схемы
процедура создания временного файла, содержащего текст XSD
Если мы создаем ОбъектXDTO из XML файла вслепую (не используя XSD и, следовательно, Фабрика не знает, что там в ОбъектеXDTO «Объект», а что «Список») можно использовать следующий прием:
WEB и HTTP сервисы
Обращение к WEB-Сервису
Функция (Операция) "GetData" WEB-Сервиса "SellData"
Функция возвращает XDTO-объект, сформированный на основании документа «Реализация товаров и Услуг» по номеру документа.
XDTO — это просто
С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко — XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты.
Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше.
XDTO — это просто
Введение
С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко — XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты.
В результате, не всегда можно разобраться — что за зверь такой — XDTO. Кроме того, даже разобравшись немного и осмелев, специалисты сталкиваются с проблемами, когда начинают использовать его более активно и в более сложных сценариях. За несколько лет плотной работы с XDTO я набил массу шишек и, как мне кажется, достаточно близко подошел к постижению дао :). С моей подачи в механизме XDTO даже было исправлено несколько серьезных ошибок, нарушавших стандарты XML.
Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше, чем это делает стандартная документация.
Надеюсь, что данный материал поможет специалистам, начинающим знакомство с XDTO избежать моих ошибок, а значит более эффективно решить поставленные задачи.
Кроме того, я часто сталкиваюсь с тем, что уже достаточно опытные специалисты в сфере “1С” довольно слабо знают язык XML. Как правило, в повседневной деятельности им хватает базовых знаний синтаксиса, и погружение в более сложные моменты им не нужно. Поэтому, в данной статье будут затронуты темы не только напрямую касающиеся XDTO, но и обсуждаются некоторые синтаксические моменты XML-стандартов.
Что такое XDTO
Для начала, давайте определимся — что же это за зверь такой — XDTO?
Как я уже говорил, это сокращение от XML Data Transfer Objects, что по-русски означает “XML-объекты переноса данных”.
Оказывается, это не какой-то всемирно принятый стандарт, поддерживаемый платформой 1С. Наоборот, аббревиатура XDTO родилась в недрах фирмы 1С и представляет собой ее собственный креатив. Нигде, кроме как в сфере 1С, вы не встретите данного сочетания букв.
Зачем оно надо?
Мне не ведомы истинные мотивы создания целой подсистемы, но кажется, что основная цель — это создание простой объектной модели доступа к XML документам. Причем, под объектной моделью должно пониматься не абстрактное дерево узлов XML, а именно прикладные классы данных, полезные с точки зрения бизнес-логики..
И вот эти объекты должны участвовать в таких механизмах взаимодействия, где нужно передать с машины на машину удобный для использования объект. Как пример — объекты XDTO используются для обмена с веб-сервисами.
Что в итоге?
XDTO — это механизм, разработанный фирмой “1С” для обмена данными с другими программными системами посредством XML, позволяющий на уровне языка 1С оперировать не узлами XML, а прикладными понятиями “Сотрудник”, “Счет” и привычными встроенными типами (“ТаблицаЗначений”, “СправочникСсылка” и т.п.).
Начнем знакомство
Для начала, давайте обратимся к концепции XML документа, как такового. Как правило, документ содержит некоторую структурированную информацию, которую можно условно представить в виде набора объектов. Например, документ “СписокСотрудников.xml” содержит узел “Сотрудники”, внутри которого имеются элементы с типом “Сотрудник”.
Для того, чтобы корректно прочитать данный документ, мы должны знать структуру того, как в документе расположены данные. Для этого существует такая вещь, как Схема XML. Схема XML представляет собой документ, в котором описаны все типы, которые могут встретиться в документе. Строго говоря, это не совсем точное определение схемы, но для XDTO его вполне достаточно.
Схема однозначно указывает, какие узлы и в каком порядке должны располагаться в документе. Кроме того, она представляет наборы узлов в виде функциональных типов данных, таких, как “Сотрудник”. Что еще более приятно — типы могут наследоваться и составлять иерархии типов.
А теперь, вспомним, зачем нужен XDTO — представление XML в виде объектов бизнес-логики. Если у нас будет набор бизнес-объектов, которые нужно передать по сети в виде XML, то мы можем создать XML-документ с помощью стандартного средства записи — объекта ЗаписьXML и поэлементно создать структуру, постаравшись ничего не напутать в структуре документа. Либо, мы можем создать XML-документ c помощью XDTO, используя более простой код:
Сотрудник.ФИО = “Иванов Иван Иванович”;
Сотрудники.Добавить(Сотрудник);
Низкоуровневые вопросы формирования XML и размещения его в документе возьмет на себя платформа.
Здесь я заранее хочу попросить прощения за такое длинное вступление у тех, кто хорошо знаком с XML и с XDTO. Мне хочется, чтобы рассказ шел от самых начал, т.к. я не могу заранее предсказать квалификацию читателя. Если все вышесказанное вам и так известно, пролистайте ниже :).
Вернемся к приведенному примеру кода. Видно, что есть некий объект сотрудник со свойством “ФИО”, которому присваивается строка. Далее этот сотрудник помещается в коллекцию. После записи коллекции, мы получим готовый XML документ, что явно проще, чем ручное создание элементов и атрибутов с помощью ЗаписьXML.
Закономерный вопрос — как платформа узнает о том, какие свойства есть у сотрудника и как его записывать в XML-файл? Ответ только один — из схемы XML документа. Платформа знает какие свойства могут быть у объекта, потому, что этот объект описан в схеме будущего документа. Закономерный вывод — XDTO без схемы документа работать не может. Система типов обязательно должна быть известна, только тогда мы сможем создавать объекты этих типов, присваивать им свойства, записывать и читать их из XML потока.
Теперь все вместе: Платформа позволяет оперировать фрагментами XML-документов, как обыкновенными объектами, к которым можно, например, обращаться “через точку”. При этом, сами объекты описываются в XML-схеме, и именно из нее платформа узнает — как выглядит тот или иной объект. То, как выглядит объект, называется типом. То есть, чтобы получить объект мы должны знать его тип.
Типы, объекты и фабрики
Пространства имен
На свете существует огромное количество программистов, которые создают те или иные XML-документы. При этом, очень часто они оперируют одинаковыми понятиями, например “Дата”, “Цена” и “Сотрудник”. Если вдруг две системы имен (созданных разными программистами) встретятся в рамках одной информационной системы, то произойдет конфликт имен.
Например, Вася создал тип данных “Сотрудник” со свойством “ФИО” и Петя создал объект «Сотрудник» со свойствами “Фамилия”, “Имя”, “Отчество” и “ИНН”. Объекты разные, а имя типа одно, возникает путаница. Чтобы этого избежать, используются пространства имен. Все имена должны быть уникальны в рамках одного пространства имен. Имена в разных пространствах запросто могут повторять друг друга.
По традиции (и по многим другим соображениям), пространства именуются в виде URL-подобных строк. Например, “http://vasya.org/xml/sotrudniki”. Причем, это не ссылка в сети, это просто строка-идентификатор. Документы пестрят этими “ссылками” и ,сталкиваясь с ними, начинающий специалист впадает в ступор — “что это за адреса, что по ним расположено, а что, если нет интернета. ” Так вот, это не адреса, это уникальные идентификаторы пространств имен. Строка может быть любой.
Теперь, все типы, которые изобретет Вася, он поместит в свое пространство имен и творчество Пети ему не страшно. Всегда можно отличить одного “Сотрудника” от другого.
Типы данных
Как уже было сказано выше, тип данных обязан принадлежать пространству имен. Пространство это задается в схеме XML и однозначно определяет все типы, которые в него входят. Отсюда же следует простой вывод — тип данных всегда дополняется пространством имен, в котором этот тип нужно искать.
Модель данных и Фабрика XDTO
При построении системы типов XDTO используется понятие Модели данных. Модель представляет собой совокупность всех типов, которые можно записать в один XML документ. С понятием модели неразрывно связано понятие Фабрики XDTO. Фабрика, это объект платформы 1С:Предприятие, который позволяет создавать те самые объекты “Сотрудник”, к которым можно обращаться “через точку”. Именно фабрика создает объект встроенного языка и наделяет его свойствами “ФИО” и “ИНН”, позволяя виртуальной машине обращаться к этим свойствам. Перечень возможных типов и их свойств фабрика берет из модели данных, которая в конечном итоге представляет собой просто набор схем XML.
Что в итоге?
Представьте, что у нас есть большая система взаимосвязанных типов. Каждый тип входит в определенный логический блок типов, а блоки для удобства разнесены по разным схемам XML. Например, у нас есть блок “Коллекции”, представляющий абстрактные списки объектов и есть блок “Сотрудники”, представляющий типы объектов, описывающие сотрудников, их зарплату, должности и т.п.
Нам нужно выгрузить и передать куда-то XML документ со списком сотрудников.
Для этого, нам удобно взять тип “Список” из схемы списков и наполнить его “Сотрудниками” из схемы “Сотрудники”. В результате, наша модель типов включает в себя 2 схемы (2 пакета) типов — “Списки” и “Сотрудники”. На основании данной модели типов мы можем создать Фабрику, которая будет “строить” объекты, к которым мы сможем обращаться из встроенного языка.
Меньше слов, ближе к делу
Для того, чтобы воспользоваться механизмом XDTO нам потребуется модель типов. Модель типов — это набор схем XML, а сами схемы можно сделать любым текстовым редактором, но лучше воспользоваться специализированным инструментом.
Для разработки схем я использую Liquid XML Studio. Отличный инструмент позволяющий построить схему посредством тыкания мышкой. Я пользуюсь версией 2008, она бесплатная, но слегка глючная. Более старшие версии мощны, но за деньги.
Liquid XML Studio позволяет строить схемы в виде вот-таких картинок:
Создаваемая схема описывает типы данных, которые мы можем использовать. Обязательно задается пространство имен, которому наши типы будут принадлежать. Сами типы подразделяются на простые и составные (simple и complex). Соответственно, простые типы, это те, которые можно представить одним значением — строка, дата, булево и т.п. Составные объекты — те, которые содержат несколько значений, а стало быть одной строчкой представлены быть не могут.
В конфигураторе, каждая схема XML может быть представлена в виде ПакетаXDTO, а вся совокупность типов, имеющихся в конфигурации составляет Модель данных конфигурации. Соответственно, все типы Модели (включая созданные нами Пакеты) могут создаваться глобальным объектом ФабрикаXDTO.
Простые типы XML представляются в виде объектов языка 1С с типом “ЗначениеXDTO”. Составные типы XML представляются в виде объектов языка 1С с типом “ОбъектXDTO”.
Подобно тому, как в конфигурации есть метаданные, предоставляющие информацию о типах, в XDTO тоже есть подобные объекты — ТипЗначенияXDTO и ТипОбъектаXDTO. Эти объекты позволяют узнать информацию о типе данных — размер, число знаков после запятой, неотрицательность и т.п.
Что со всем этим делать?
Давайте еще раз подведем краткий итог и воспользуемся полученной информацией. Итак, у нас есть 2 пакета типов (2 схемы XML). Первая — разные коллекции, списки, соответствия и т.п. Вторая — сотрудники. Нам нужно сформировать список сотрудников.
1. Предположим, что пакет коллекций имеет пространство имен “http://super-puper/collections”, а пакет сотрудников — “http://super-puper/employees”.
2. В конфигураторе раскрываем ветку ПакетыXDTO и в контекстном меню выбираем “Импорт схемы XML”. Указываем файлы со схемами.
3. В ветке пакетов появятся наши пакеты. Зададим им осмысленные имена (любые)
4. Теперь конфигурация “знает” о наших типах данных и они включены в модель типов конфигурации
Применение в коде
Как уже говорилось, для создания объектов XDTO применяется ФабрикаXDTO. Чтобы создать объект, фабрика должна знать его тип. Делается это следующим образом:
// Создается объект языка 1С с типом “ТипОбъектаXDTO”
// Первый параметр пространство имен, второй — имя типа в пространстве имен.
ТипОбъектаСписок = ФабрикаXDTO.Тип(“http://super-puper/collections”, “Список”);
// Создаем объект списка
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);
// обход сотрудников для выгрузки
Пока Выборка.Следующий() Цикл
ТипОбъектаСотрудник = ФабрикаXDTO.Тип(“http://super-puper/employees”, “Сотрудник”);
Сотрудник = ФабрикаXDTO.Создать(ТипОбъектаСотрудник);
// Свойство “ФИО” объявлено в схеме
Сотрудник.ФИО = Выборка.Наименование;
// Добавление “Сотрудников” в “Список”
ОбъектСписок.Добавить(Сотрудник);
// А теперь, запись в поток XML
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку(); // запись в строку
ФабрикаXDTO.Записать(Запись, ОбъектСписок);
ДанныеXML = Запись.Закрыть(); // документ готов!
Резюме
На этом хочется завершить первую вводную статью. И безо всяких тонкостей она получилось довольно большой. Мы рассмотрели самые основы-основ — создание модели типов и загрузка ее в конфигурацию, а также создание XML документа на основании модели типов.
Далее мы рассмотрим программное создание модели типов, собственных фабрик, а также нюансы работы с объектами XDTO.
Если данная тема вам интересна, отпишитесь в комментариях, продолжение обязательно последует.