Инструменты пользователя

Инструменты сайта


playground:playground

Это старая версия документа!


Что это такое

XDTO - это аббревиатура, обозначающая обмен данными посредством XML (XML Data Transfer Objects). Аббревиатура придумана разработчиками 1с и вряд ли встретится где-то ещё. Но реализует она вполне стандартизированный механизм обмена информацией с помощью файлов XML, известный как XML Schema.

Суть этого механизма заключается в том, что создаётся специальный файл, называемый схемой. Этот файл описывает структуру XML-файла. Если XML-файл соответствует этой структуре, то он считается корректным. Отдающей стороне достаточно сформировать корректный XML-файл для успешного обмена. Принимающая сторона должна гарантировать, что любой корректный XML-файл будет загружен без ошибок. В результате достаточно легко можно обеспечить обмен между двумя и более закрытыми информационными системами. Каждая схема характеризуется пространством имён, которое должно быть уникальным. Оно связывает XML-файл со своей схемой.

Самым ярким примером использования такого механизма обмена являются различного рода декларации (налоговые и прочее). На сайтах соответствующих ведомств всегда можно найти файл со схемой. Другой распространённый пример - обмен данными с сайтом.

С точки зрения программиста 1с, объект XDTO очень похож на Фиксированную структуру, созданную на основе файла со схемой. Эта псевдоструктура может быть загружена из XML-файла и использована для загрузки сторонних данных. А может быть заполнена данными и записана в корректный XML-файл. Который впоследствии будет использован для загрузки в другую информационную систему. В любом случае работа с объектом состоит из 3 основных этапов: получение типа объекта, создание объекта XDTO требуемого типа, использование объекта XDTO для выгрузки или загрузки данных.

Получение типа объекта

Это наиболее трудный для понимания этап т.к. он не соответствует обычной работе с переменными 1с. Но для работы с объектами XDTO он обязателен. Прежде чем создать объект XDTO, необходимо получить его тип. Для этого используются специальные объекты - фабрики типов XDTO.

Платформа позволяет использовать 2 вида схем - встроенные в конфигурацию XDTO-пакеты или внешние файлы с расширением .xsd и оформленные в соответствии со стандартами w3c. Соответственно, существует 2 способа получения объекта-фабрики типов.

Использование XDTO-пакетов

XDTO-пакет - это отдельный объект конфигурации, расположенный в ветке Общие дерева конфигурации. Платформа позволяет создавать неограниченное количество XDTO-пакетов как с помощью конструктора, так и путём импорта существующих файлов .xsd. Эти пакеты могут служить основой для получения типов объектов XDTO. Выглядит это так:

ТипОбъектаНоменклатура = ФабрикаXDTO.Тип("http://www.wiki-1c.ru/xdto", "Номенклатура"); 

Здесь ФабрикаXDTO - это особый глобальный объект, который знает всё обо всех объектах XDTO, описанного в имеющихся в конфигурации XDTO-пакетах. Метод Тип() возвращает искомый тип объекта XDTO. Он принимает 2 параметра - пространство имён и имя типа (оба - строки). Результат полезно запомнить в переменной, в дальнейшем её можно использовать для создания объектов XDTO произвольное количество раз.

Заметим, что в параметре передаётся не имя пакета, а его пространство имён. Имя пакета вообще нигде не используется и задаётся только для удобства поиска в дереве конфигурации.

Использование файлов с описанием схемы XML

Такие файлы традиционно имеют расширение .xsd. Преимущество данного метода в том, что он работает независимо от конфигурации. И если первому методу обязательно требуется отдельный объект конфигурации, этот требует только наличия файла со схемой. Вот код создания соответствующего объекта-фабрики и получение типа объекта XDTO:

МояФабрикаXDTO = СоздатьФабрикуXDTO("D:\Temp\goods.xsd");
ТипОбъектаНоменклатура = МояФабрикаXDTO.Тип("http://www.wiki-1c.ru/xdto", "Номенклатура");

Здесь мы использовали глобальную функцию СоздатьФабрикуXDTO, которая считывает файл со схемой (параметр функции) и создаёт объект-фабрику. Этот объект в будущем может произвольное число раз использоваться для создания любых доступных в схеме типов объектов. Если требуется загрузить несколько файлов со схемами, можно передать массив строк с именами файлов. Дальнейшая работа с фабрикой объектов не отличается от описанного в 1 способе.

Создание объекта XDTO

Сами объекты XDTO также создаются фабрикой объектов. Причём той же самой, которая использовалась при получении типа. Но используется уже другой метод - Создать():

Номенклатура = МояФабрикаXDTO.Создать(ТипОбъектаНоменклатура); 

В результате в переменной Номенклатура окажется объект XDTO, описанный в файле-схеме. К его реквизитам можно обращаться наподобие реквизитов фиксированной структуры. Естественно, нельзя добавлять или удалять реквизиты. В отличие от фиксированной структуры, каждый реквизит имеет определённый тип, поэтому произвольное присваивание не получится.

Запись объектов XDTO в файл

Использование фабрики объектов на этом не закончится. Ведь у переменной Номенклатура есть несколько реквизитов, и каждый из реквизитов относится к какому-то типу. К счастью, простые типы можно использовать без подобных преобразований простым присваиванием:

Номенклатура.Наименование = "Носки суровые"; 

Более сложные типы требуют обращения к фабрике объектов:

ТипОбъектаЕдиницаИзмерения = МояФабрикаXDTO.Тип("http://www.wiki-1c.ru/xdto", "ЕдиницыИзмерения");
ЕдиницаИзмерения = МояФабрикаXDTO.Создать(ТипОбъектаЕдиницаИзмерения);
ЕдиницаИзмерения.ОКЕИ = 796;
ЕдиницаИзмерения.Наименование = "шт";
Номенклатура.ЕдиницаИзмерения = ЕдиницаИзмерения; 

Стандарт позволяет создавать реквизиты-списки и реквизиты-структуры без создания отдельных типов. Заполнять такие реквизиты можно следующим образом:

// Список элементов простых типов
Штрихкоды = Номенклатура.ПолучитьСписок("Штрихкоды");
Штрихкоды.Добавить("4601546124937");
Штрихкоды.Добавить("4601546093981");
 
// Список элементов сложных типов, описанных в схеме
ПрочиеЕдиницыИзмерения = Номенклатура.ПолучитьСписок("ПрочиеЕдиницыИзмерения");
ЕдиницаИзмерения = МояФабрикаXDTO.Создать(ТипОбъектаЕдиницаИзмерения);
ЕдиницаИзмерения.ОКЕИ = 166;
ЕдиницаИзмерения.Наименование = "кг";
ПрочиеЕдиницыИзмерения.Добавить(ЕдиницаИзмерения);

Получение типа элементов-структур немного напоминает работу с метаданными конфигурации:

// Список элементов-структур
Характеристики = Номенклатура.ПолучитьСписок("Характеристики");
ТипЭлементаХарактеристика = Номенклатура.Свойства().Получить("Характеристики").Тип;
Характеристика = МояФабрикаXDTO.Создать(ТипЭлементаХарактеристика);
Характеристика.Код = 1;
Характеристика.Наименование = "Жёлтые";
Характеристики.Добавить(Характеристика);
 
// Реквизиты-структуры
Только авторизованные участники могут оставлять комментарии.
playground/playground.1477465355.txt.gz · Последнее изменение: 2016/10/26 10:02 — alex