Пример обмена через XDTO в 1С 8.3

Механизм XDTO

XDTO (XML Data Transfer Objects) — это специальный механизм, разработанный фирмой 1С для универсального представления данных, используемый при взаимодействии с внешними системами.

С помощью механизма XDTO можно описать систему типов и значений, с помощью которой можно легко выполнить сериализацию/десериализацию в XML/JSON.

XDTO можно сравнить со схемой XML. С помощью механизма XDTO можно создать XML-схему, а потом на основании этой схемы сформировать XML-документ.

XDTO может применяться в следующих случаях:

  • Для описания типов параметров и возвращаемых значений Web-сервисов.
  • Для описания структуры данных, используемой при обмене с внешними системами (в том числе с другими базами на платформе 1С).
  • Для создания собственных типов и значений, используемых внутри конфигурации 1С.

Создание XDTO-пакета

В качестве примера рассмотрим следующую задачу: нужно настроить обмен документами между двумя различными конфигурациями на 1С. В обеих конфигурациях используются 2 типа документов: приходные и расходные накладные. Состав и наименование реквизитов в разных конфигурациях отличается.

Для обмена будет использоваться определенный формат следующего вида:

XDTO

Есть корневой элемент Документ, который имеет 2 свойства: Тип и Состав. Состав включает в себя массив строк со свойствами: Номенклатура, Количество и Сумма.

Для описания данного формата будем использовать XDTO-пакет. XDTO-пакет можно сравнить со схемой XML, в нем мы укажем какие типы будут использоваться внутри пакета и каким образом они должны быть сериализованы в XML.

В дереве метаданных в узле Общие — XDTO-пакеты добавим новый пакет. В свойствах нового пакета нужно указать URI пространства имен. Здесь нужно указать произвольный идентификатор, как правило он указывается в формате URL, например http://www.program1s.com/test-document:

URI пространства имен

На вопрос «Произвести изменение URI пространства имен для ссылок на типы данного пакета» ответим Нет, так как наш пакет еще нигде не использовался:

URI пространства имен

Добавим в пакет новый Тип объекта:

Тип объекта

В свойствах укажем Имя Документ:

Тип объекта

Это корневой узел нашего формата.

Теперь нужно добавить для него 2 свойства: Тип и Состав. Для этого выделим в пакете тип Документ и выберем Добавить — Свойство:

Свойство

В свойствах укажем Имя Тип:

Свойство

В данном свойстве будет строкой храниться тип выгружаемого документа. Поэтому нужно заполнить свойство Тип, чтобы при записи в XML платформа знала как нужно его сериализовать.

Чтобы заполнить тип сначала нужно нажать на зеленую галочку возле свойства:

Тип

Появится кнопка с тремя точками для выбора типа. Нужно нажать на нее. Будет открыто окно для выбора пакетов XDTO. В самом низу нужно найти пакет с пространством имен http://www.w3.org/2001/XMLSchema, развернуть его и найти тип string:

Тип
Тип

Данный тип соответствует типу 1С Строка.

Тип

Добавим для объекта Документ еще одно свойство Состав, но тип пока заполнять не будем. Должно получиться так:

Тип объекта

Теперь добавим новый тип объекта Состав. Он будет использоваться для сериализации табличной части документа. Добавим для него одно свойство Строка, тип пока не будем указывать:

Тип объекта

Так как в табличной части может быть несколько строк, то для свойства Строка в свойстве Максимальное количество нужно указать -1 (предварительно нужно нажать на зеленую галку):

Максимальное количество

Это означает, что в данном свойстве может храниться неограниченное количество значений (аналогично массиву).

Теперь для свойства Документа Состав в качестве типа укажем только что созданный объект Состав. Чтобы его выбрать нужно развернуть пространство имен созданного нами XDTO-пакета:

Тип объекта

Добавим в пакет еще один тип объекта — Строка, а у него 3 свойства: Номенклатура, Количество и Сумма:

Тип объекта

Для свойства Номенклатура в качестве типа укажем тип string из пространства имен http://www.w3.org/2001/XMLSchema. Для свойств Количество и Сумма выберем тип decimal из того же пространства имен. Тип decimal соответствует типу Число в 1С:

Свойства
Свойства
Свойства

И наконец для свойства Строка объекта Состав укажем тип Строка (только что созданный нами тип объекта):

Свойства

На этом создание XDTO-пакета завершено. Для удобства переименуем его в Документ (нужно щелкнуть по пакету правой кнопкой, выбрать Свойства и изменить свойство Имя):

XDTO-пакет

Сериализация XDTO в XML

Теперь напишем простую процедуру для сериализации приходного документа в XML через механизм XDTO.

Сначала рассмотрим некоторые понятия, которые будут использоваться в процессе сериализации:

Фабрика XDTO — это описание всех типов, которые есть в текущей конфигурации. В том числе она будет включать в себя типы из созданного нами XDTO-пакета, так как пакет входит в состав конфигурации.

Тип XDTO — это один из описанных типов в XDTO-пакетах. В нашем случае это будут типы: Документ, Состав и Строка.

Объект XDTO — это программный объект, соответствующий одному из типов XDTO. В нашем случае это будут объекты Документ, Состав и Строка. У каждого объекта могут быть свойства, например для объекта Документ это будут свойства Тип и Состав, для объекта Строка — Номенклатура, Количество и Сумма и т.д.

Алгоритм сериализации будет выглядеть следующим образом:

  1. Сначала определим все типы, которые будут использованы в процессе выгрузки. Для создания типа XDTO используется метод Тип фабрики XDTO, которому параметрами нужно передать URI пространства имен и имя типа из данного пространства. При этом сама фабрика доступна через глобальное свойство ФабрикаXDTO:

  1. Затем на основании типов создадим объекты XDTO: Документ, Состав и Строка. Объект XDTO создается методом Создать, которому параметром нужно передать тип создаваемого объекта:

  1. Заполним свойства всех созданных объектов XDTO, взяв значения из документа.
  2. И наконец с помощью метода фабрики XDTO ЗаписатьXML сериализуем заполненный объект XDTO в XML:

Весь код для сериализации будет выглядеть так:

В результате при сериализации будет получен следующий XML:

Десериализация XML в XDTO

Для загрузки в другую конфигурацию нужно создать в ней такой же XDTO-пакет. Можно скопировать его, но правильней будет экспортировать из текущей конфигурации в XML-схему, а потом импортировать в другую конфигурацию.

Для экспорта XDTO-пакета в XML-схему нужно щелкнуть по пакету правой кнопкой и выбрать Экспорт XML-схемы:

Экспорт XML-схемы

Затем выбрать XSD-файл, в который будет экспортирован XDTO-пакет. В результате будет создан файл со следующим содержимым:

Для импорта XDTO-пакета нужно щелкнуть правой кнопкой по ветке XDTO-пакеты и выбрать Импорт XML-схемы:

Импорт XML-схемы

И выбрать XSD-файл с выгруженным ранее пакетом. В результате в конфигурации появится такой же XDTO-пакет. Сразу переименуем его в Документ.

Для десериализации объекта XDTO из XML нужно вызвать метод ПрочитатьXML у фабрики XDTO. Параметром нужно передать тип XDTO, который должен быть прочитан из XML. Данный метод вернет объект XDTO. Через точку можно обращаться к его свойствам. В отладчике прочитанный объект будет выглядеть так:

объект XDTO

Свойство Строка имеет тип СписокXDTO внутри которого будет 2 объекта XDTO для строк:

СписокXDTO

Так выглядит код десериализации XML в XDTO:

В результате в базе будет создан документ Поступление товаров с двумя строками.

Хранение XDTO-пакета в макете

Чтобы не хранить XDTO-пакет в конфигурации можно создать внешнюю обработку, у обработки добавить макет с типом Двоичные данные и загрузить туда XSD-файл с XDTO-пакетом.

Затем из макета сохранить XSD-файл во временный файл и на основании файла создать фабрику XDTO.

Фабрика XDTO создается методом СоздатьФабрикуXDTO, куда параметром нужно передать путь к XSD-файлу. Стоит отметить, что в этом случае фабрика будет включать в себя только типы из XSD-файла.

Пример выгрузки через внешнюю обработку:

Пример загрузки:

Пример обработки можно скачать здесь.

Содержание курса


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok