В данной статье я свел воедино все, что на данный момент знаю о механизме XDTO. Материал носит достаточно ознакомительный характер, и предназначен в первую очередь для начинающих разработчиков. Рассмотрены основные составные части механизма XDTO, примеры использования XDTO и базовые приемы работы.
Содержание
Аббревиатура XDTO расшифровывается как XML Data Transfer Objects – и переводится как Объекты переноса данных XML. Это детище компании 1С, и нигде кроме экосистемы 1С данный механизм не используется. Предназначение XDTO – интеграция и обмен данными между 1С и другими системами в формате XML. Собственно, XDTO позволяет работать с xml в объектном стиле, “через точку”, не задумываясь об атрибутах, тегах, узлах и т.п.
Механизм XDTO включает в себя несколько объектов встроенного языка и объект конфигурации “XDTO-пакет”
XSD схемы и пакеты XDTO. Пространства имен
Объект метаданных XDTO-пакет предназначен для описания системы типов и значений для взаимодействия с внешними системами или обработки xml-данных. Для гарантированного обеспечения уникальности типов между различными пакетами, в свойствах XDTO-пакета задается пространство имен. Исторически сложилось, что пространство имен выглядит как url-адрес, но на деле это всего лишь строка, которая может быть абсолютно любой. Важно, чтобы в пределах конфигурации пространства имен в пакетах XDTO были уникальны.
XML схемы описывают структуру XML-документа на языке XSD – XML Schema Definition Language.
Схемы XSD предназначены для решения следующих задач:
- Перечисление элементов в документе XML и проверка наличия в документе только объявленных элементов.
- Объявление и определение атрибутов, модифицирующих элементы документа.
- Определение иерархических отношений между элементами – какой является родительским, а какой – дочерним.
- Определение состояний и моделей содержания для элементов и атрибутов.
- Задание типов данных.
- Установка значений по умолчанию.
- Поддержка использования пространств имен.
В свою очередь, XDTO пакеты помимо свойств, аналогичных свойствам XSD-схем, содержат еще ряд свойств, предназначенных для трансляции данных в объекты 1С и обратно. К этим свойствам относится, в частности свойство “Локальное имя”.
Стандартные пакеты XDTO
Даже если ни одного пакета XDTO в конфигураторе не создано, платформа будет предоставлять обширный список стандартных пакетов, описывающих все данные, предоставляемые платформой. Так, например, среди стандартных пакетов есть пакет для описания управляемого приложения, системы компоновки данных, двухфакторной аутентификации, и множество других. “Познакомиться” с ними можно, используя коллекцию глобальной фабрики XDTO “Пакеты”.
&НаСервере Процедура ВывестиВсеПакетыНаСервере() Для Каждого Пакет Из ФабрикаXDTO.Пакеты Цикл Сообщить(Пакет.URIПространстваИмен); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ВывестиВсеПакеты(Команда) ВывестиВсеПакетыНаСервере(); КонецПроцедуры
Создание, импорт и экспорт схем XSD
Пакеты XDTO можно экспортировать в XML-схемы в формате xsd, и наоборот – из xsd-файла можно импортировать пакет XDTO. Важно – не все схемы xsd успешно импортируются в пакеты XDTO, при том что сами схемы будут полностью валидны. Распространенная ошибка связана с отсутствием определения целевого пространства имен targetNamespace.
Кроме того, существует возможность выгрузить XML-схему данных конфигурации – в этом случае будет выгружена схема xml, соответствующая всем объектам конфигурации (кроме пакетов XDTO, созданных в дереве метаданных).
Также пакеты можно создавать средствами конфигуратора 1С, в специальном редакторе.
На первом уровне иерархии могут располагаться следующие элементы пакета:
-
Директивы импорта – перечень директив импорта – в них указываются внешние пространства имен, которые используются в данном пакете. При работе с данным пакетом XDTO средствами встроенного языка данный перечень директив импорта будет доступен в виде объекта КоллекцияПакетовXDTO, содержащегося в свойстве Зависимости пакета XDTO. Важно! Если указать пространство имен, не определенное в данной конфигурации (т.е. отсутствующее как среди стандартных пакетов, так и среди пакетов, созданных в конфигураторе), сохранить конфигурацию будет нельзя, т.к. платформа выдаст сообщение об ошибке: “Ошибка проверки модели XDTO: xdto-package-3.3 пакет: test
Импортируемый пакет типов ‘<тут имя пространства имен>’ не определен“
-
Типы значений – перечень типов значений XDTO, которые содержит пакет XDTO.
-
Типы объектов – перечень типов объектов XDTO, которые содержит пакет XDTO
-
Свойства – перечень свойств пакета XDTO. Представляет собой объявления объектов/значений, которые могут являться корневыми элементами документов XML, принадлежащих URI пространству имен пакета XDTO.
Типы значений XDTO
Объект ТипЗначенияXDTO используется для описания типов простых значений, в которых не могут быть выделены отдельные составляющие. Примерами простых значений являются разнообразные строки, числа, даты и т. п. Ссылки на объекты также относятся к простым значениям. Для указания ссылки в качестве типа значения XDTO следует указать базовый тип AnyRef (http://v8.1c.ru/8.1/data/enterprise), а также задать свойство “Вариант” – “Атомарный”.
Теперь разберем поподробнее свойства типа значений XDTO. Тип Значений XDTO соответствует типу symple type из схемы xml. Следовательно, и поля в редакторе пакета XDTO для типа значений во многом повторяют свойства symple type.
-
Имя – имя типа значения XDTO;
-
Базовый тип – базовый тип для данного типа значения XDTO. Базовые типы могут наследоваться от других типов значений XDTO, а самым верхним типом в иерархии наследования является тип anySimpleType
-
Вариант – вариант простого типа (атомарный тип, список, объединение).
-
Тип элемента – тип элемента списка в случае, когда тип значения XDTO определяется списком. При этом все фасеты и свойство Типы объединения должны быть пустыми;
-
Типы объединения – список типов, образующих объединение в случае, когда тип значения XDTO определяется объединением. Объединяться могут только типы значений XDTO. При этом все фасеты и свойство Тип Элемента должны быть пустыми;
-
Длина – фасет длины. Длина задается в единицах длины, которые зависят от типа значения. Для типа string и anyURI это будет количество символов в строке, а для двоичных данных (hexBinary и base64Binary) длина содержит количество байт.
-
Минимальная длина – фасет минимальной длины;
-
Максимальная длина – фасет максимальной длины;
-
Пробельные символы – фасет пробельных символов; позволяет описать ограничение – допустимы ли в строке любые пробельные символы, такие как неразрывный пробел, перенос строки, или табуляция;
-
Минимум, включающий границу – фасет минимума, включающего границу; Любое значение данного типа должно быть больше указанному значению;
-
Минимум, не включающий границу – фасет минимума, не включающего границу. Любое значение данного типа должно быть больше указанного значения;
-
Максимум, включающий границу – фасет максимума, включающего границу;
-
Максимум, не включающий границу – фасет максимума, не включающего границу;
-
Общее количество цифр – фасет общего количества цифр;
-
Количество цифр дробной части – фасет количества цифр дробной части.s
Фасеты – это набор значений, которые ограничивают множество допустимых значений по отношению к базовому типу. Соответственно, указывать их нужно только тогда, когда указан базовый тип. Список фасетов, которые можно указывать для того или иного типа, определяется по правилам XML Schema.
Типы объектов XDTO
В пакете XDTO тип объекта XDTO используется для описания типов сложных объектов, имеющих в составе набор свойств. Типы свойств таких объектов могут быть как типами значения XDTO, так и типами объектов XDTO. В частности, все прикладные объекты конфигурации, например, справочник “Номенклатура”, могут быть описаны как типы объектов XDTO.
Ввиду того, что типы объектов XDTO предназначены для описания самых различных структур данных, особое внимание следует уделить свойствам, а именно:
-
Открытый – признак, является ли тип объекта XDTO открытым. Данное свойство показывает, может ли экземпляр объекта XDTO содержать свойства, не определенные в его типе. Это соответствует реализации модели open content;
-
Абстрактный – признак, является ли тип объекта XDTO абстрактным; Абстрактные типы используются для реализации наследования и расширения дочерними типами;
-
Смешанный – показывает, имеет ли соответствующий объект XDTO смешанное содержание (mixed content в схеме XML). Если значение свойства Истина, то значение Последовательный обязательно равно Истина, так как смешанное содержание невозможно смоделировать без применения последовательности XDTO;
-
Упорядоченный – признак, является ли порядок следования элементов, представляющих значения свойств, строго соответствующим порядку следования свойств в типе объекта XDTO. Если Ложь, то на входе порядок следования элементов XML не контролируется, а на выходе определяется порядком следования свойств, если только свойство Последовательный не имеет значение Истина;
-
Последовательный – показывает, содержит ли экземпляр соответствующего объекта XDTO последовательность XDTO. Истина в тех случаях, когда порядок следования вложенных элементов XML не может однозначно определяться порядком следования свойств в типе или соответствующий объект XDTO имеет смешанное содержание. Последовательность XDTO позволяет задать в явном виде порядок следования элементов, как они будут представлены в документе XML. Для объектов типов, у которых свойство Ложь, порядок вложенных элементов соответствует порядку следования свойств.
Свойства XDTO
В редакторе пакета XDTO можно также настраивать свойства – как для всего пакета (т.н. корневые свойства), так и при описании типов объектов XDTO. Отдельно взятое свойство имеет следующие реквизиты:
-
Имя – имя свойства. Следует обеспечить уникальность имени свойства в пределах описания одного типа объекта XDTO.
-
Ссылка – ссылка на корневое определения свойств пакета
-
Тип – тип свойства. Может быть как типом значения XDTO, так и типом объекта XDTO;
-
Минимальное количество – минимальное количество значений свойства. Минимальное количество значений свойства может принимать значения <= 0;
-
Максимальное количество – свойство типа объекта XDTO может быть определено как содержащее одно или множество значений. Свойство считается содержащим одно значение, если Максимальное количество = 1. Для значений свойства > 1 считается, что свойство может принимать множество значений. Такое свойство в структуре объекта моделируется списком. Свойство Максимальное количество показывает максимальное количество значений свойства. Максимальное количество > 1 может быть задано только для свойств, представленных в виде элемента XML. Значение -1 соответствует unbounded в схеме XML, т.е. количество значений этого свойства может быть не ограниченным. Например, мы создаем свойство, описывающее табличную часть Товары. В этом случае мы можем указать максимальное количество -1, т.к. заранее не знаем, сколько строк будет в табличной части. Можно указать тип значения, соответствующий описанию содержимого одной строки ТЧ, либо создать описание типов (см. ниже)
-
Возможно пустое – показывает, может ли свойство принимать неопределенное значение. Истина может быть определено только для свойств с формой представления Элемент. Если Максимальное количество > 1, неопределенное значение является допустимым для элемента списка значений свойства;
-
Фиксированное – указывает, является ли значение свойства фиксированным. Истина – само фиксированное значение можно получить через свойство По умолчанию;
-
По умолчанию – значение свойства по умолчанию. Тип значения по умолчанию может быть только типом значения XDTO. При этом, данное значение должно быть совместимо с типом свойства (быть того же типа, что и тип свойства или же унаследованного типа). При создании объекта XDTO свойство, если оно допускает единственное значение, принимает значение по умолчанию. Для свойств с множеством значений список значения пуст, независимо от того, определено или нет значение по умолчанию;
-
Форма – форма представления свойства в XML. Это может быть Атрибут, Элемент или Текст. Если формой представления является Атрибут или Текст, то значение свойства Максимальное количество не может быть больше 1. Если свойство принимает значение Текст, то значение свойства Минимальное количество также должно быть равным 1. У одного типа только одно свойство может иметь форму представления Текст, при этом все остальные свойства должны иметь форму представления Атрибут;
-
Локальное имя – локальное имя, используемое для представления свойства. Для свойств с формой представления Текст – пустая строка.
Определения типов XDTO
Рассмотрим пример создания типа объекта XDTO, описывающего справочник Номенклатуры с реквизитами Наименование, Единица измерения (Справочник “Единицы измерения”)и Статья затрат (справочник “Статьи затрат”). В случае, если нам было бы достаточно ссылки на соответствующие справочники, мы могли бы создать два типа значения XDTO, например CatalogRef.ЕдиницыИзмерения и CatalogRef.СтатьиЗатрат.
Но предположим, мы хотим при выгрузке в XML получить не только ссылку, но и все содержимое, т.е. весь объект целиком. Сделать это можно двумя способами – создать отдельный тип объекта и указать его в качестве типа для свойства ЕдиницаИзмерения в объекте Номенклатура, либо создать описание типа непосредственно в свойстве. Описание типа может быть двух видов – для описания простых типов, и для описания комплексных типов. Отличить их можно по картинке-пиктограмме слева от текста “Определение типа”. Редактируются они таким же образом как самостоятельные типы объектов и типы значений. Выбор при этом может ввести в заблуждение (см. картинку)
Директивы импорта XDTO
В рамках создаваемого пакета XDTO (без использования директивы импорта) можно использовать:
- типы, определенные только в данном пакете (использующие текущее пространство имен)
- типы, стандартные для XML (пространство имен http://www.w3.org/2001/XMLSchema)
В случае, если нужно указать тип из другого пакета XDTO (из другого пространства имен) – необходимо его импортировать при помощи директивы импорта. Импортировать можно только существующие пакеты типов; кроме того, недопустимо делать циклические импорты – когда в импортируемом пакете есть директива импорта текущего пакета.
Фабрика XDTO и модель данных
Фабрика XDTO – это объект встроенного языка 1С, который позволяет создавать объекты XDTO нужного типа. Фабрика XDTO может создавать объекты только тех типов, которые входят в ее модель данных. Модель данных – это совокупность всех типов, которые можно записать в один XML документ. По сути, модель данных – это набор схем XML.
Существует единственная глобальная фабрика XDTO, доступная через свойство глобального контекста ФабрикаXDTO. Эта фабрика содержит в себе все встроенные пакеты XDTO, предоставляемые платформой; пакет “http://v8.1c.ru/8.1/data/enterprise/current-config”, описывающий метаданные текущей конфигурации; пакеты, созданные разработчиком в ветке Общие / XDTO-пакеты.
Кроме того, разработчик может средствами языка 1С создавать новые фабрики, включая в них только типы из нужных пакетов.
Простой пример создания документа XML
За основу возьмем пакет XDTO, рассмотренный выше, в разделе “Определения типов XDTO”. Для создания документа XML нам понадобится – создать нужные типы XDTO, далее на основе этих типов создать нужные объекты, и в завершение – сформировать XML средствами фабрики.
// Получим нужные типы данных XDTO ТипТестНоменклатура = ФабрикаXDTO.Тип("http://www.sample-package.org", "Номенклатура"); ТипТестЕдИзм = ФабрикаXDTO.Тип("http://www.sample-package.org", "ЕдиницаИзмерения"); // Обратите внимание, здесь мы получаем тип из определения типа для свойства СтатьяЗатрат ТипТестСтатья = ТипТестНоменклатура.Свойства.Получить("СтатьяЗатрат").Тип; //Сперва создаем объекты, которые затем поместим в свойства номенклатуры ЕдИзм = ФабрикаXDTO.Создать(ТипТестЕдИзм); ЕдИзм.Коэффициент = 1; ЕдИзм.Код = 123; ЕдИзм.Наименование = "Кг"; СтатьяЗатрат = ФабрикаXDTO.Создать(ТипТестСтатья); СтатьяЗатрат.Наименование = "Основная деятельность"; СтатьяЗатрат.СчетЗатрат = 26; Ном = ФабрикаXDTO.Создать(ТипТестНоменклатура); Ном.Наименование = "тестовая номенклатура"; //Помещаем в свойства соответствующие объекты XDTO Ном.ЕдиницаИзмерения = ЕдИзм; Ном.СтатьяЗатрат = СтатьяЗатрат; //Сформируем XML документ Запись = Новый ЗаписьXML; Запись.УстановитьСтроку(); ФабрикаXDTO.ЗаписатьXML(Запись, Ном); ДанныеXML = Запись.Закрыть(); Сообщить(ДанныеXML);
Пример создания фабрики XDTO c нужной моделью данных
Для создания своей собственной фабрики XDTO все равно придется воспользоваться глобальной фабрикой. В простейшем случае фабрика создается так: создаем модель данных XDTO, затем создаем массив нужных нам пакетов, и далее на основании модели и массива пакетов создаем конструктором новую фабрику.
Модель = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/xdto","Model")); СвояФабрика = Новый ФабрикаXDTO(Модель);
Полученная фабрика будет представлять собой объект XDTO, с которым можно работать так же как с любым аналогичным объектов. Но на деле такой подход используется редко. Гораздо чаще применяется формирование готовой модели, содержащей в себе нужные пакеты. Для этого используется метод фабрики ЭкспортМоделиXDTO.
Рассмотрим более сложный пример. Предположим, нашу модель мы должны передать из одной конфигурации в другую, и на ее основании создать фабрику во второй конфигурации. Реализовать это можно через файл, либо через веб- либо http-сервис, передав текст документа XML.
Сформируем текст XML, содержащий модель, в первой базе.
МассивПространствИмен = Новый Массив; МассивПространствИмен.Добавить("http://www.sample-package.org"); ВтораяМодель = ФабрикаXDTO.ЭкспортМоделиXDTO(МассивПространствИмен); Запись = Новый ЗаписьXML; Запись.УстановитьСтроку(); ФабрикаXDTO.ЗаписатьXML(Запись,ВтораяМодель,"Model","http://v8.1c.ru/8.1/xdto",,НазначениеТипаXML.Явное); МодельXML = Запись.Закрыть();
В базе-приемнике прочитаем модель из XML документа, и создадим фабрику:
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(МодельXML); ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); ВтораяФабрика = Новый ФабрикаXDTO(ОбъектModel);
В ней будет содержаться только один пакет, который мы указали при экспорте, и стандартный пакет “http://www.w3.org/2001/XMLSchema”. При этом не обязательно, чтобы в конфигурации-приемнике существовал данный пакет в дереве метаданных – все необходимое содержится в исходном XML документе, который мы прочитали.
Создание фабрики XDTO из схем XML
Схемы XML могут быть представлены в двух видах – в виде файлов XSD, либо в виде объекта НаборСхемXML. Сперва рассмотрим простой способ создания фабрики XDTO из набора схем.
МассивПространствИмен = Новый Массив; МассивПространствИмен.Добавить("http://www.sample-package.org"); НаборСхем = ФабрикаXDTO.ЭкспортСхемыXML(МассивПространствИмен); ТретьяФабрика = Новый ФабрикаXDTO(НаборСхем);
Часто при работе с XDTO разработчик получает от передающей стороны (например, веб-сервиса, внешнего приложения и др) готовый файл или несколько файлов с расширением .xsd. Но кроме того, можно написать выгрузку набора схем в набор xsd-файлов. За основу можно взять следующий код:
Для Счетчик = 0 по НаборСхем.Количество() - 1 Цикл Схема = НаборСхем.Получить(Счетчик); Схема.ОбновитьЭлементDOM(); ЗаписьDOM = Новый ЗаписьDOM; ЗаписьXMLСтрока = Новый ЗаписьXML; ЗаписьXMLСтрока.УстановитьСтроку(); ЗаписьXMLФайл = Новый ЗаписьXML; ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXMLСтрока); ЗаписьXMLФайл.ОткрытьФайл(ИмяФайла + "[" + Формат(Счетчик,"ЧЦ=10;ЧГ=0;ЧН=") + "].xsd"); ЗаписьXMLФайл.ЗаписатьБезОбработки(ЗаписьXMLСтрока.Закрыть()); ЗаписьXMLФайл.Закрыть(); КонецЦикла;
Вне зависимости от того, как были получены XSD схемы, для их чтения следует использовать метод СоздатьФабрикуXDTO.
Схемы = Новый Массив; Схемы.Добавить("d:testtest1.xsd"); Схемы.Добавить("d:testtest2.xsd"); ЧетвертаяФабрика = СоздатьФабрикуXDTO(Схемы);
XDTO сериализация
На основе механизмов XDTO платформа предоставляет средства для быстрой сериализации прикладных объектов (например, справочник ссылка или справочник объект) и объектов языка (например, структура или таблица значений). Рассмотрим несколько примеров:
//Простая сериализация в XML. Подходит только для загрузки в идентичную конфигурацию ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписатьXML(ЗаписьXML, Номенклатура.ПолучитьОбъект()); ИтоговаяСтрока = ЗаписьXML.Закрыть(); Сообщить(ИтоговаяСтрока); //Сериализация через глобальный сериализатор. В этом случае мы получаем пространства имен ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Номенклатура.ПолучитьОбъект(), НазначениеТипаXML.Явное); ИтоговаяСтрока = ЗаписьXML.Закрыть(); Сообщить(ИтоговаяСтрока); //Десериализация через СериализаторXDTO ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ИтоговаяСтрока); ОбъектНоменклатура = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
SOAP сервисы и XDTO
Разработка своего веб-сервиса
Данная статья не претендует на полный обзор технологии веб-сервисов, их разработки и публикации. SOAP-сервисы будут рассмотрены в контексте использования механизма XDTO.
При разработке web-сервиса типы параметров и возвращаемых значений Web-сервисов описываются с помощью типов объектов и типов значений XDTO. Подготовим пакет типов специально для нашего примера. У нас будет один тип значения для указания кода статьи затрат, один тип для описания списка строк, и один тип для описания строки.
Далее создадим Web-сервис. Укажем пространство имен (напомню, это вовсе не обязательно должно быть URL, строка может быть любой). Также укажем состав пакетов XDTO, типы из которых мы хотим использовать.
Создадим операцию с одним параметром – CostItem. Этот параметр отмечаем как входной, указываем тип значения. Также укажем тип возвращаемого значения. Обратите внимание – нам доступны только типы из тех пакетов XDTO, которые мы отметили, а также стандартные типы для XML:
Теперь осталось написать код для операции. Наш веб сервис будет получать остатки товаров запросом и формировать таблицу из трех колонок – Код, Наименование и Остаток. Т.к. мы делаем сервис, ориентированный на внешние системы, которые могут не поддерживать кириллицу, колонки назовем Code, Name и Quantity.
Функция goods(CostItem) ТипGoods = ФабрикаXDTO.Пакеты.Получить("http://www.sample-package.org").Получить("goods"); ТипgoodsRow = ФабрикаXDTO.Пакеты.Получить("http://www.sample-package.org").Получить("goodsRow"); Goods = ФабрикаXDTO.Создать(ТипGoods); Запрос = Новый Запрос("ВЫБРАТЬ | ОстаткиТоваровОстатки.Товар.Код КАК Code, | ОстаткиТоваровОстатки.Товар.Наименование КАК Name, | ОстаткиТоваровОстатки.КоличествоОстаток КАК Quantity |ИЗ | РегистрНакопления.ОстаткиТоваров.Остатки( | , | ВЫБОР | КОГДА &СтатьяЗатрат = НЕОПРЕДЕЛЕНО | ТОГДА ИСТИНА | ИНАЧЕ Товар.СтатьяЗатрат = &СтатьяЗатрат | КОНЕЦ) КАК ОстаткиТоваровОстатки"); НайденнаяСтатья = Справочники.СтатьиЗатрат.НайтиПоКоду("CostItem"); Если НайденнаяСтатья = Справочники.СтатьиЗатрат.ПустаяСсылка() Тогда НайденнаяСтатья = Неопределено; КонецЕсли; Запрос.УстановитьПараметр("СтатьяЗатрат", НайденнаяСтатья); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл goodsRow = ФабрикаXDTO.Создать(ТипgoodsRow); ЗаполнитьЗначенияСвойств(goodsRow, Выборка); Goods.goodsRow.Добавить(goodsRow); КонецЦикла; Возврат Goods; КонецФункции
Легко заметить, что код возвращает объект XDTO, а не готовый XML документ. В XML его преобразует сама платформа при возврате ответа web-сервиса. Т.е. по сути разработка операции для web-сервиса сводится к созданию и наполнению нужного объекта XDTO.
Веб сервис готов, и далее необходимо его опубликовать, чтобы внешние системы могли его использовать. После публикации проверим его работоспособность, написав несложный код.
// Получим WSОпределение WSОпределение = Новый WSОпределения("http://localhost/xdto/ws/ws1.1cws?wsdl"); // Создадим WSПрокси - специальный объект для вызова веб-сервиса // параметры конструктора можно посмотреть непосредственно в WSОпределение // там будут и списки сервисов с пространствами имен и названием самого сервиса, а также // имена точек подключения WSПроксиGoods = Новый WSПрокси(WSОпределение, "test", "ВыгрузкаНоменклатуры", "ВыгрузкаНоменклатурыSoap"); // вызовем операцию goods с параметром CostItem = "123" (это код элемента справочника Статьи затрат) ТаблицаОстатков = WSПроксиGoods.goods("123"); // Обойдем коллекцию строк, которую мы получили от сервиса, и выведем остатки Для Каждого СтрокаОстатка Из ТаблицаОстатков.goodsRow Цикл Сообщить(СтрШаблон("Код %1, Наименование %2, Остаток %3", СтрокаОстатка.Code, СтрокаОстатка.Name, СтрокаОстатка.Quantity)); КонецЦикла;
Использование внешних веб-сервисов через WS-ссылки
При работе с WS-ссылками, после загрузки WSDL схемы, в WS-ссылке становится доступной модель данных с теми пакетами, что содержатся в поставляемой схеме. Редактировать содержимое WS-ссылки нельзя, однако можно посмотреть структуру типов данных, доступных методов и их параметров.
Начнем с простого примера получения ответа от веб-сервиса. Сервис принимает на вход число, и конвертирует его в текст. Адрес WSDL схемы для создания WS-ссылки: https://www.dataaccess.com/webservicesserver/numberconversion.wso?WSDL
Прокси = WSСсылки.Converter.СоздатьWSПрокси("http://www.dataaccess.com/webservicesserver/", "NumberConversion", "NumberConversionSoap"); Результат = Прокси.NumberToWords(12345); Сообщить(Результат);
Теперь рассмотрим более сложный пример – получим курсы валют на дату, используя сервис ЦБР. Создадим WS-ссылку с адресом http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL
Как легко увидеть, и модель данных, и состав доступных операций у этого сервиса значительно больше:
В качестве примера используем операцию GetCursOnDate. У этой операции всего один параметр “parameters”, с типом значения GetCursOnDate (http://web.cbr.ru/). В составе модели данных есть корневое свойство GetCursOnDate, а в составе типов значений XDTO есть тип GetCursOnDate, с единственным свойством On_date. Зная все вышеперечисленное, напишем код получения ответа от веб-сервиса
//Создаем прокси для обращения к внешнему веб-сервису, // передаем в функцию URI пространства имен, имя сервиса, имя порта. Прокси = WSСсылки.WSСсылкаЦБР.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); //Получаем тип параметра, который передается в метод GetCursOnDate. // Для этого получаем сперва пакет по имени URI, а затем тип по имени этого типа ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://web.cbr.ru/").Получить("GetCursOnDate"); //Создаем параметр на основе типа и заполняем значение параметра On_Date. WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра); WSПараметр.On_Date= ТекущаяДата(); //Вызываем метод веб-сервиса, записываем результат в переменную КурсыВалют. КурсыВалют = Прокси.GetCursOnDate(WSПараметр);
Мы получили XDTO-объект КурсыВалют. Чтобы дальше знать, как нам его обработать, обратимся к отладчику. Сама таблица с курсами валют “закопана” достаточно глубоко:
КурсыВалют.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate. Пройдемся циклом по этому списку и выведем информацию о курсах валют:
Для Каждого Элемент Из КурсыВалют.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate Цикл Сообщить(СтрШаблон("Валюта %1; номинал %2; код %3; симв. код %4; курс %5", СокрЛП(Элемент.Vname) ,Элемент.Vnom, Элемент.Vcode, Элемент.VChCode, Элемент.Vcurs)); КонецЦикла;
Другие примеры использования XDTO
Помимо обменов данными в формате XML, а также использования в SOAP-сервисах, механизм XDTO имеет еще несколько интересных способов применения. Можно использовать сериализацию XDTO для изменения графических схем – тех самых, которые используются в бизнес-процессах. Графическая схема сериализуется в XDTO-объект со своим набором свойств, а дальше все в руках разработчика – можно добавлять элементы, менять описания, задавать связи, и т.д.
Аналогично можно программно управлять и многими другими объектами 1С, которые сериализуются в/из XDTO (об этом можно узнать из документации либо встроенной справки), например:
- Диаграммы
- Схемы компоновки данных
- Хранилища значений
и другие
28.11.19 — 15:31
День добрый.
ОбъектXDTO имеет 3 свойства: bic (Атрибут), name (Атрибут), __content (Текст).
Как ни пытался заполнить ОбъектXDTO, проверка объекта выводит сообщение вида:
«Проверка свойства ‘__content’:
форма: Текст
имя: Текст
тип: {<пространство имен>}AccNumType
Отсутствует обязательное свойство»
Подскажите, что я не учел?
1 — 28.11.19 — 15:33
При заполнении пробовал следующие конструкции:
«ЗаполнитьСвойствоXDTO(Account, «bic», БИК, Истина, ТекстОшибки);
ЗаполнитьСвойствоXDTO(Account, «name», НаименованиеБанка, , ТекстОшибки);
ЗаполнитьСвойствоXDTO(Account, «__content», НомерСчета, Истина, ТекстОшибки);»
2 — 28.11.19 — 15:34
«ЗаполнитьСвойствоXDTO(Account, «bic», БИК, Истина, ТекстОшибки);
ЗаполнитьСвойствоXDTO(Account, «name», НаименованиеБанка, , ТекстОшибки);
ИмяЭлемента = «__content»;
Свойство = Account.Свойства().Получить(ИмяЭлемента);
ТипНовогоЭлемента = Свойство.Тип;
НовыйЭлемент = ФабрикаXDTOИзФайла.Создать(ТипНовогоЭлемента, НомерСчета);
Account.__content = НовыйЭлемент;»
3 — 28.11.19 — 15:36
И еще множество вариантов, уже не сохранившихся.
После заполнения, проверяю объект следующей конструкцией:
«Account.Проверить();»
И стабильно получаю ошибку, что отсутствует обязательное свойство (а именно, свойство ‘__content’)
4 — 28.11.19 — 15:55
пип
5 — 28.11.19 — 16:43
ИнтеграцияВЕТИС.ЗаполнитьСвойствоXDTO(Штрихкод, «__content», ДанныеШтрихкода.Штрихкод, СообщениеXML);
6 — 28.11.19 — 16:49
ЗаполнитьСвойствоXDTO(ActiveOrHistoricCurrencyAndAmount, «__content», Сумма, , ТекстОшибки);
7 — 28.11.19 — 16:49
(5) а чуть выше там определение Штрихкод:
«Штрихкод = ИнтеграцияИС.ОбъектXDTOПоИмениТипа(ОписаниеУпаковки, «productMarks»);»
Подобное тоже пробовал. И чем платформе мой вариант не по нраву…
Но за еще один пример функционала спасибо!
8 — 28.11.19 — 16:52
ОбъектXDTO.__content = «123»
9 — 28.11.19 — 16:54
ибо __content — это же обычный текст
10 — 28.11.19 — 17:00
(8), (9) так тоже пробовал. Поведение не меняется.
Более того, при всех опробованных вариантах заполнения, в табло отладчика необходимое свойство стабильно заполнено.
Тут что-то еще, что-то, что я не учел.
Уверен, кто-то уже сталкивался
11 — 28.11.19 — 17:10
Предположительно, платформа использует не тот XDTO-пакет, который я ей подсовываю.
Я загружаю XDTO-пакет из общего макета, подобно этому примеру:
создание пакетов XDTO из файлов XSD
У моего XDTO-пакета пространство имен сходится с одним из уже имеющихся в конфигурации XDTO-пакетов. И в этом имеющемся в конфигурации XDTO-пакете, свойства __content в нужном мне месте нет.
Буду продолжать наблюдения, да
12 — 28.11.19 — 17:36
Эмпирическим путем было установлено: если при создании Фабрики XDTO конструктором (на базе своего XML файла со схемой), Вы используете пространство имен, которое уже задействовано в конфигурации (в имеющихся XDTO-пакетах конфигурации) — тогда ваш файл со схемой игнорируется. Используется имеющийся в конфигурации XDTO-пакет, совпавшим по пространству имен с вашим.
Вот тема коллеги по цеху, на партнерском форуме:
https://partners.v8.1c.ru/forum/topic/1767048?createDateAscOrder=true
13 — 28.11.19 — 19:04
(12) Только хотел напомнить про эту ссылку.
Не заметил в новой платформе обещанных доработок платформы, судя по описанию изменений.
Сталкивался с отличием схемы в 8.1 по сравнению с 8.2. Пришлось создать свою схему с отличающимся пространством имен, выгрузить в файл и там поменять пространство имен на 1С-овское, чтобы потом загрузить платформой 8.3.
Пип Пибип
14 — 28.11.19 — 19:10
(13) пока тоже думаем перед отправкой сообщения, подменить пространство имен на то, что нужно принимающей стороне. Что бы с нашей стороны пули все-таки вылетели
За тему на партнерском форуме спасибо, натолкнулся на нее благодаря этому:
Как с помощью расширения подменить XDTO пакет?
Ошибка при вводе БИК банка
Добрый день! Заполняем карточку Банковский счет контрагента. Вводим номер счета и БИК банка. В результате выходит ошибка: Деятельность прекращена. Ошибка в номере счета или в БИК банка. Не совпадает контрольное число. Если перейти по ссылке все банки и там в поиске вбить тот же самый БИК, то ошибка уходит. В чем может быть проблема, Программа ЗУП 3.1.23.63
Содержание:
1. Ошибка при установке значения атрибута контекста
2. Ошибка при получении значения атрибута контекста
Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.
1. Ошибка при установке значения атрибута контекста
Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута.
Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.
2. Ошибка при получении значения атрибута контекста
Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.
При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).
Специалист компании «Кодерлайн»
Александр Суворов