Фабрика 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 необходимо осветить получше, чем это делает стандартная документация.
Надеюсь, что данный материал поможет специалистам, начинающим знакомство с 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.
Если данная тема вам интересна, отпишитесь в комментариях, продолжение обязательно последует.
УСПЕЙТЕ ДО НГ!
Самый посещаемый курс «Клерка» про управленческий учет проходят уже более 100 ваших коллег. Успейте записаться на курс по старой цене 2021 года. Потом – дороже. Оплатите сейчас, учитесь в 2022 году в удобном потоке.
Использование объектов XDTO в web-сервисах
Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.
Способность сериализоваться/десериализоваться в формат переноса данных позволяет объекту переноса данных мигрировать с одного компьютера на другой. Между разными компьютерами и даже разными процессами одного компьютера нет единого адресного пространства и нет возможности передавать объект по ссылке. Поэтому сериализация является единственным способом взаимодействия между этими процессами. Сериализация позволяет представить объект в некоторой промежуточной форме, например в виде xml, передать эту промежуточную форму заданному процессу заданного компьютера и обратно десериализовать объект в вид, пригодный для программного использования.
Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.
Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.
Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.
Строки
Для создания строкового значения нужно:
Строка при передаче представляется в виде текста xml тега:
Следует учесть, что строки конвертируются в UTF-8 при сериализации.
Целые числа
Для создания целочисленного значения нужно:
Число при передаче представляется в виде текста xml тега:
Дробные числа
Для создания дробного значения нужно:
Число при передаче представляется в виде текста xml тега:
Для создания значения даты нужно:
Число при передаче представляется в виде текста xml тега:
Лексическое представление даты задается в формате:
Временная зона может быть не указана.
Лексическое представление времени задается в формате:
Временная зона может быть не указана.
Лексическое представление даты вместе со временем задается в формате:
Структуры
Структуры моделируются типами-объектами. Перед тем как использовать структуру необходимо создать пакет XDTO, описываающий тип-объект структуры (например, через редактор XDTO). Тип-объект может содержать свойства, котрые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом.
Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:
Структура при передаче представляется в виде xml структуры:
Массивы
Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:
Массив при передаче представлятся в виде xml структуры:
Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.
Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.
XDTO для чайников
По пакетам XDTO уже существует достаточно много статей, прочитав которые я потратил еще достаточно много времени чтобы разобраться как написать обмен, используя эту технологию. Сейчас я уверенно могу сказать, что все достаточно просто и покажу это на примере.
В примере мы выгрузим из демо базы БП 3 документ «Реализация (акты, накладные)» в самописную конфигурацию.
Конфигурация, в которую будем загружать данные будет состоять из следующих объектов:
Справочники: Номенклатура, Контрагенты. Перечисления: СтавкиНДС. Документы: РеализацияТоваровУслуг.
Оказывается, в демо базе БП 3 есть расширение «ФормированиеТестовыхДанных», значит им и воспользуемся, не будем создавать собственное.
Добавим пакет XDTO. Имя: ВыгрузкаРеализаций. URI пространство имен: infostart.
В пакете добавим тип объекта «ДокументРеализация».
В объект добавим свойства: Ссылка, Дата, Номер, Контрагент.
Создадим обработку «Выгрузка реализаций»
Код команды выгрузки:
Изменим форму представления для свойств объекта XDTO
Переходим к загрузке данных. Создадим обработку загрузки.
Проверяем загрузку. Выполнение прерывается ошибкой. Через отладку можно увидеть, что значения свойств объекта РеализацияXDTO имеют строковый тип, конкретно дата в таком виде преобразуется к пустому значению.
В пакете XDTO укажем свойству «Дата» тип
Проверим еще раз загрузку, все должно было пройти успешно.
Отдельно обращу внимание на эту строчку кода
При чтение объекта XDTO я принудительно указал его тип, хотя параметр не является обязательным. И сделал я это не просто так, для корневого элемента тип объекта не выгружается, это хорошо видно в xml файле, где все свойства выгружали в форме элементов. Для объекта ДокументРеализация не указан атрибут xsi:type.
В свойство «контрагент» мы помещали наименование контрагента. Добавим новый тип объекта в пакет XDTO «СправочникКонтрагенты» со свойствами: Ссылка, Код, Наименование, НаименованиеПолное. Для свойства «Контрагент» в типе объекта «ДокументРеализация» укажем форму хранения в виде элемента. Внесем изменения в код выгрузки.
Думаю, здесь все понятно.
Дольше всего я не мог разобраться, как выгружать табличные части.
Создадим тип объекта «ТабличнаяЧасть» со свойством «Строки».
И посмотрим его свойства в отладчике.
Дальше, думаю, уже все понятно. Изменения в коде обработки выгрузки.
Для создания примера использовались программные файлы 1С:Предприятие 8.3 (8.3.14.1694).
XDTO в 1С
В этой статье попробую рассказать о механизме XDTO, рассказать постараюсь только суть — без воды.
XDTO (XML Data Transfer Objects) — это разработка фирмы 1С и ни в каком другом языке программирования эту аббревиатуру не встретишь.
Основное назначение этого механизма — обмен данными, как с другой конфигурацией 1С, так и со сторонними приложениями. Кроме этого XDTO используется для описания параметров и возвращаемых значений web-сервисов, а также для произвольной обработки данных.
Основная «полезность» механизма XDTO заключается в том, что он позволяет работать (чтение и запись) с XML-файлом как с объектом 1С — «через точку» и не думать при этом о тегах и атрибутах XML.
Реализован механизм XDTO при помощи объекта конфигурации «Пакет XDTO». Этот объект в действительности является обычной XML-схемой (XSD) т.е. описывает структуру какого-либо XML-документа.
Средствами 1С мы можем:
Для успешного импорта XML-схемы (XSD) в XDTO пакет, необходимо наличие в XSD-файле атрибута «targetNamespace» с указанием пространства имен, иначе импортировать схему не удастся.
Пространство имен обычно указывается URL-подобной строкой (хотя на самом деле это может быть любая строка) и служит для того, чтобы избежать путаницы в том случае, если в разных XDTO пакетах у нас имеются объекты с одинаковым названием.
Таким образом понятно, что названия объектов должны быть уникальны в пределах одного пространства имен (по сути в пределах одного XDTO пакета)
XSD-файл можно сделать самому — написать руками в блокноте или сделать XDTO пакет прямо в конфигураторе, кроме этого можно воспользоваться какой-нибудь специализированной программой (например Liquid XML Studio) или онлайн сервисом (Google в помощь) которые умеют создавать XSD-файлы из XML. При использовании программ и сервисов нужно быть осторожным, так как по моему опыту результат их работы (XSD-файл) очень часто не подходит для использования в 1С — неправильно указываются типы данных и, как следствие, записать XML-файл при помощи такого XDTO пакета не удастся. В качестве примера приведу два XDTO пакета для одного и того же XML-файла.
Слева тот, что создан руками, справа — программой.
Работа с XDTO в 1С неразрывно связана с объектом «ФабрикаXDTO». Именно этот объект читает и записывает данные из/в XML-файл(а), а также создает все нужные объекты с которыми можно привычно работать «через точку».
Перейдем к практике.
Допустим у нас есть файл заказ вот такого вида: