Фасет xdto 1с что это
Механизм XDTO
Аббревиатура XDTO расшифровывается как XML Data Transfer Objects. XDTO является механизмом объектного моделирования данных, описываемых с помощью схемы XML.
Основные возможности использования XDTO
XDTO пакет
Механизм XDTO реализован с помощью набора объектов встроенного языка и объекта конфигурации XDTO пакет.
Возможно выполнение следующих действий:
Также система 1С:Предприятие 8 поддерживает возможность экспорта набора XML схем данных конфигурации.
Редактирование XDTO пакета осуществляется в специальном окне, отображающем иерархическую структуру XDTO пакета:
XDTO- сериализация
В системе 1С:Предприятие 8 реализована сериализация данных на основе механизма XDTO, которая позволяет сериализовать в/из XML:
XDTO-сериализация предназначена для сохранения данных объекта в файл XML и создания объекта на основе данных, хранящихся в файле XML:
Пример обмена через XDTO в 1С 8.3
Механизм XDTO
XDTO (XML Data Transfer Objects) — это специальный механизм, разработанный фирмой 1С для универсального представления данных, используемый при взаимодействии с внешними системами.
С помощью механизма XDTO можно описать систему типов и значений, с помощью которой можно легко выполнить сериализацию/десериализацию в XML/JSON.
XDTO можно сравнить со схемой XML. С помощью механизма XDTO можно создать XML-схему, а потом на основании этой схемы сформировать XML-документ.
XDTO может применяться в следующих случаях:
Создание XDTO-пакета
В качестве примера рассмотрим следующую задачу: нужно настроить обмен документами между двумя различными конфигурациями на 1С. В обеих конфигурациях используются 2 типа документов: приходные и расходные накладные. Состав и наименование реквизитов в разных конфигурациях отличается.
Для обмена будет использоваться определенный формат следующего вида:
Есть корневой элемент Документ, который имеет 2 свойства: Тип и Состав. Состав включает в себя массив строк со свойствами: Номенклатура, Количество и Сумма.
Для описания данного формата будем использовать XDTO-пакет. XDTO-пакет можно сравнить со схемой XML, в нем мы укажем какие типы будут использоваться внутри пакета и каким образом они должны быть сериализованы в XML.
В дереве метаданных в узле Общие — XDTO-пакеты добавим новый пакет. В свойствах нового пакета нужно указать URI пространства имен. Здесь нужно указать произвольный идентификатор, как правило он указывается в формате URL, например http://www.program1s.com/test-document:
На вопрос «Произвести изменение URI пространства имен для ссылок на типы данного пакета» ответим Нет, так как наш пакет еще нигде не использовался:
Добавим в пакет новый Тип объекта:
В свойствах укажем Имя Документ:
Это корневой узел нашего формата.
Теперь нужно добавить для него 2 свойства: Тип и Состав. Для этого выделим в пакете тип Документ и выберем Добавить — Свойство:
В свойствах укажем Имя Тип:
В данном свойстве будет строкой храниться тип выгружаемого документа. Поэтому нужно заполнить свойство Тип, чтобы при записи в XML платформа знала как нужно его сериализовать.
Чтобы заполнить тип сначала нужно нажать на зеленую галочку возле свойства:
Появится кнопка с тремя точками для выбора типа. Нужно нажать на нее. Будет открыто окно для выбора пакетов XDTO. В самом низу нужно найти пакет с пространством имен http://www.w3.org/2001/XMLSchema, развернуть его и найти тип string:
Данный тип соответствует типу 1С Строка.
Добавим для объекта Документ еще одно свойство Состав, но тип пока заполнять не будем. Должно получиться так:
Теперь добавим новый тип объекта Состав. Он будет использоваться для сериализации табличной части документа. Добавим для него одно свойство Строка, тип пока не будем указывать:
Это означает, что в данном свойстве может храниться неограниченное количество значений (аналогично массиву).
Теперь для свойства Документа Состав в качестве типа укажем только что созданный объект Состав. Чтобы его выбрать нужно развернуть пространство имен созданного нами XDTO-пакета:
Добавим в пакет еще один тип объекта — Строка, а у него 3 свойства: Номенклатура, Количество и Сумма:
Для свойства Номенклатура в качестве типа укажем тип string из пространства имен http://www.w3.org/2001/XMLSchema. Для свойств Количество и Сумма выберем тип decimal из того же пространства имен. Тип decimal соответствует типу Число в 1С:
И наконец для свойства Строка объекта Состав укажем тип Строка (только что созданный нами тип объекта):
На этом создание XDTO-пакета завершено. Для удобства переименуем его в Документ (нужно щелкнуть по пакету правой кнопкой, выбрать Свойства и изменить свойство Имя):
Сериализация XDTO в XML
Теперь напишем простую процедуру для сериализации приходного документа в XML через механизм XDTO.
Сначала рассмотрим некоторые понятия, которые будут использоваться в процессе сериализации:
Фабрика XDTO — это описание всех типов, которые есть в текущей конфигурации. В том числе она будет включать в себя типы из созданного нами XDTO-пакета, так как пакет входит в состав конфигурации.
Тип XDTO — это один из описанных типов в XDTO-пакетах. В нашем случае это будут типы: Документ, Состав и Строка.
Объект XDTO — это программный объект, соответствующий одному из типов XDTO. В нашем случае это будут объекты Документ, Состав и Строка. У каждого объекта могут быть свойства, например для объекта Документ это будут свойства Тип и Состав, для объекта Строка — Номенклатура, Количество и Сумма и т.д.
Алгоритм сериализации будет выглядеть следующим образом:
Объект 1С «XDTO-пакеты»
ВАЖНО! Схема обязательно должна содержать описание пространства имен в виде URL-подобной строки. Если пространство имен не задано, то стороннюю XML-схему импортировать не удастся.
XDTO-пакет является своеобразным переводчиком между разными информационными системами, с помощью которого можно описать, например, структуру (схему) будущего xml-файла.
В конфигурацию может быть добавлено произвольное количество XDTO-пакетов.
Типы данных в 1С чаще всего соответствуют типам данных в других языках, но бывают и исключения, которые проще всего описывать в этом объекте конфигурации.
Механизм XDTO
Механизм XDTO позволяет на уровне языка 1С оперировать не узлами XML, а прикладными понятиями «Накладная», «Сотрудник», «Счет» и т.д., а также встроенными типами 1С (“ТаблицаЗначений”, “СправочникСсылка” и т.п.).
Основные возможности XDTO:
ФабрикаXDTO
Работу механизма XDTO обеспечивает объект встроенного языка ФабрикаXDTO: именно она отвечает за сериализацию XDTO-объектов в XML и обратно. Причем, за преобразование объектов XDTO в прикладные объекты и встроенные типы отвечает механизм XDTO-сериализации. То есть, процедура приведения объектов 1С к объектам XML схемы двухэтапная.
Особенности ФабрикиXDTO:
Свойства XDTO-пакета 1С:
Система 1С позволяет выполнить следующие действия:
Редактирование XDTO-пакета 1С
Редактирование XDTO-пакета 1С осуществляется в специальном окне, отображающем его иерархическую структуру:
Особенности использования XDTO-пакетов в 1С:
Сериализация в 1С с помощью XDTO-пакета
Сериализованы могут быть не все объекты, а те, которые имеют соответствующую запись в Синтакс-помощнике: «Данный объект может быть сериализован в/из XML».
В системе 1С:Предприятие 8 реализована сериализация данных на основе механизма XDTO, которая позволяет сериализовать в/из XML:
Таким образом, с точки зрения XML-сериализации, например, значение типа «ДокументСсылка.ИмяДокумента» относится к простым типам.
XDTO для чайников
По пакетам XDTO уже существует достаточно много статей, прочитав которые я потратил еще достаточно много времени чтобы разобраться как написать обмен, используя эту технологию. Сейчас я уверенно могу сказать, что все достаточно просто и покажу это на примере.
В примере мы выгрузим из демо базы БП 3 документ «Реализация (акты, накладные)» в самописную конфигурацию.
Конфигурация, в которую будем загружать данные будет состоять из следующих объектов:
Справочники: Номенклатура, Контрагенты. Перечисления: СтавкиНДС. Документы: РеализацияТоваровУслуг.
Оказывается, в демо базе БП 3 есть расширение «ФормированиеТестовыхДанных», значит им и воспользуемся, не будем создавать собственное.
Добавим пакет XDTO. Имя: ВыгрузкаРеализаций. URI пространство имен: infostart.
В пакете добавим тип объекта «ДокументРеализация».
В объект добавим свойства: Ссылка, Дата, Номер, Контрагент.
Создадим обработку «Выгрузка реализаций»
Код команды выгрузки:
Изменим форму представления для свойств объекта XDTO
Переходим к загрузке данных. Создадим обработку загрузки.
Проверяем загрузку. Выполнение прерывается ошибкой. Через отладку можно увидеть, что значения свойств объекта РеализацияXDTO имеют строковый тип, конкретно дата в таком виде преобразуется к пустому значению.
В пакете XDTO укажем свойству «Дата» тип
Проверим еще раз загрузку, все должно было пройти успешно.
Отдельно обращу внимание на эту строчку кода
При чтение объекта XDTO я принудительно указал его тип, хотя параметр не является обязательным. И сделал я это не просто так, для корневого элемента тип объекта не выгружается, это хорошо видно в xml файле, где все свойства выгружали в форме элементов. Для объекта ДокументРеализация не указан атрибут xsi:type.
В свойство «контрагент» мы помещали наименование контрагента. Добавим новый тип объекта в пакет XDTO «СправочникКонтрагенты» со свойствами: Ссылка, Код, Наименование, НаименованиеПолное. Для свойства «Контрагент» в типе объекта «ДокументРеализация» укажем форму хранения в виде элемента. Внесем изменения в код выгрузки.
Думаю, здесь все понятно.
Дольше всего я не мог разобраться, как выгружать табличные части.
Создадим тип объекта «ТабличнаяЧасть» со свойством «Строки».
И посмотрим его свойства в отладчике.
Дальше, думаю, уже все понятно. Изменения в коде обработки выгрузки.
Для создания примера использовались программные файлы 1С:Предприятие 8.3 (8.3.14.1694).
Введение
Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше, чем это делает стандартная документация.
Надеюсь, что данный материал поможет специалистам, начинающим знакомство с XDTO избежать моих ошибок, а значит более эффективно решить поставленные задачи.
Кроме того, я часто сталкиваюсь с тем, что уже достаточно опытные специалисты в сфере “1С” довольно слабо знают язык XML. Как правило, в повседневной деятельности им хватает базовых знаний синтаксиса, и погружение в более сложные моменты им не нужно. Поэтому, в данной статье будут затронуты темы не только напрямую касающиеся XDTO, но и обсуждаются некоторые синтаксические моменты XML-стандартов.
Что такое XDTO
Как я уже говорил, это сокращение от XML Data Transfer Objects, что по-русски означает “XML-объекты переноса данных”.
Оказывается, это не какой-то всемирно принятый стандарт, поддерживаемый платформой 1С. Наоборот, аббревиатура XDTO родилась в недрах фирмы 1С и представляет собой ее собственный креатив. Нигде, кроме как в сфере 1С, вы не встретите данного сочетания букв.
Зачем оно надо?
Что в итоге?
Начнем знакомство
Для того, чтобы корректно прочитать данный документ, мы должны знать структуру того, как в документе расположены данные. Для этого существует такая вещь, как Схема XML. Схема XML представляет собой документ, в котором описаны все типы, которые могут встретиться в документе. Строго говоря, это не совсем точное определение схемы, но для XDTO его вполне достаточно.
Сотрудник.ФИО = “Иванов Иван Иванович”;
Сотрудники.Добавить(Сотрудник);
Низкоуровневые вопросы формирования XML и размещения его в документе возьмет на себя платформа.
Здесь я заранее хочу попросить прощения за такое длинное вступление у тех, кто хорошо знаком с XML и с XDTO. Мне хочется, чтобы рассказ шел от самых начал, т.к. я не могу заранее предсказать квалификацию читателя. Если все вышесказанное вам и так известно, пролистайте ниже :).
Вернемся к приведенному примеру кода. Видно, что есть некий объект сотрудник со свойством “ФИО”, которому присваивается строка. Далее этот сотрудник помещается в коллекцию. После записи коллекции, мы получим готовый XML документ, что явно проще, чем ручное создание элементов и атрибутов с помощью ЗаписьXML.
Типы, объекты и фабрики
На свете существует огромное количество программистов, которые создают те или иные XML-документы. При этом, очень часто они оперируют одинаковыми понятиями, например “Дата”, “Цена” и “Сотрудник”. Если вдруг две системы имен (созданных разными программистами) встретятся в рамках одной информационной системы, то произойдет конфликт имен.
Например, Вася создал тип данных “Сотрудник” со свойством “ФИО” и Петя создал объект «Сотрудник» со свойствами “Фамилия”, “Имя”, “Отчество” и “ИНН”. Объекты разные, а имя типа одно, возникает путаница. Чтобы этого избежать, используются пространства имен. Все имена должны быть уникальны в рамках одного пространства имен. Имена в разных пространствах запросто могут повторять друг друга.
Теперь, все типы, которые изобретет Вася, он поместит в свое пространство имен и творчество Пети ему не страшно. Всегда можно отличить одного “Сотрудника” от другого.
Типы данных
Модель данных и Фабрика XDTO
При построении системы типов XDTO используется понятие Модели данных. Модель представляет собой совокупность всех типов, которые можно записать в один XML документ. С понятием модели неразрывно связано понятие Фабрики XDTO. Фабрика, это объект платформы 1С:Предприятие, который позволяет создавать те самые объекты “Сотрудник”, к которым можно обращаться “через точку”. Именно фабрика создает объект встроенного языка и наделяет его свойствами “ФИО” и “ИНН”, позволяя виртуальной машине обращаться к этим свойствам. Перечень возможных типов и их свойств фабрика берет из модели данных, которая в конечном итоге представляет собой просто набор схем XML.
Что в итоге?
Представьте, что у нас есть большая система взаимосвязанных типов. Каждый тип входит в определенный логический блок типов, а блоки для удобства разнесены по разным схемам XML. Например, у нас есть блок “Коллекции”, представляющий абстрактные списки объектов и есть блок “Сотрудники”, представляющий типы объектов, описывающие сотрудников, их зарплату, должности и т.п.
Нам нужно выгрузить и передать куда-то XML документ со списком сотрудников.
Меньше слов, ближе к делу
Для разработки схем я использую Liquid XML Studio. Отличный инструмент позволяющий построить схему посредством тыкания мышкой. Я пользуюсь версией 2008, она бесплатная, но слегка глючная. Более старшие версии мощны, но за деньги.
Liquid XML Studio позволяет строить схемы в виде вот-таких картинок:
В конфигураторе, каждая схема XML может быть представлена в виде ПакетаXDTO, а вся совокупность типов, имеющихся в конфигурации составляет Модель данных конфигурации. Соответственно, все типы Модели (включая созданные нами Пакеты) могут создаваться глобальным объектом ФабрикаXDTO.
Простые типы XML представляются в виде объектов языка 1С с типом “ЗначениеXDTO”. Составные типы XML представляются в виде объектов языка 1С с типом “ОбъектXDTO”.
Что со всем этим делать?
2. В конфигураторе раскрываем ветку ПакетыXDTO и в контекстном меню выбираем “Импорт схемы XML”. Указываем файлы со схемами.
3. В ветке пакетов появятся наши пакеты. Зададим им осмысленные имена (любые)
4. Теперь конфигурация “знает” о наших типах данных и они включены в модель типов конфигурации
Применение в коде
Как уже говорилось, для создания объектов XDTO применяется ФабрикаXDTO. Чтобы создать объект, фабрика должна знать его тип. Делается это следующим образом:
// Создаем объект списка
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);
// обход сотрудников для выгрузки
Пока Выборка.Следующий() Цикл
ТипОбъектаСотрудник = ФабрикаXDTO.Тип(“http://super-puper/employees”, “Сотрудник”);
Сотрудник = ФабрикаXDTO.Создать(ТипОбъектаСотрудник);
// Свойство “ФИО” объявлено в схеме
Сотрудник.ФИО = Выборка.Наименование;
// Добавление “Сотрудников” в “Список”
ОбъектСписок.Добавить(Сотрудник);
// А теперь, запись в поток XML
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку(); // запись в строку
ФабрикаXDTO.Записать(Запись, ОбъектСписок);
ДанныеXML = Запись.Закрыть(); // документ готов!
Резюме
Далее мы рассмотрим программное создание модели типов, собственных фабрик, а также нюансы работы с объектами XDTO.
Если данная тема вам интересна, отпишитесь в комментариях, продолжение обязательно последует.
СРОЧНО!
Успейте разобраться в ФСБУ 5/2019 «Запасы», пока вас не оштрафовали. Самый простой способ – короткий, но полный курс повышения квалификации от гуру бухгалтерского учета Сергея Верещагина