XDTO - это просто

18.02.13

Разработка - Механизмы платформы 1С

С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко - XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты. Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше.

XDTO - это просто

 

upd 09.01.2012. Это первая статья про XDTO. Продолжение здесь и здесь.

Введение

С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко - XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты.

В результате, не всегда можно разобраться - что за зверь такой - XDTO. Кроме того, даже разобравшись немного и осмелев, специалисты сталкиваются с проблемами, когда начинают использовать его более активно и в более сложных сценариях. За несколько лет плотной работы с XDTO я набил массу шишек и, как мне кажется, достаточно близко подошел к постижению дао :). С моей подачи в механизме XDTO даже было исправлено несколько серьезных ошибок, нарушавших стандарты XML.

Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше, чем это делает стандартная документация.

Надеюсь, что данный материал поможет специалистам, начинающим знакомство с XDTO избежать моих ошибок, а значит более эффективно решить поставленные задачи.

Кроме того, я часто сталкиваюсь с тем, что уже достаточно опытные специалисты в сфере “1С” довольно слабо знают язык XML. Как правило, в повседневной деятельности им хватает базовых знаний синтаксиса, и погружение в более сложные моменты им не нужно. Поэтому, в данной статье будут затронуты темы не только напрямую касающиеся XDTO, но и обсуждаются некоторые синтаксические моменты XML-стандартов.

Что такое XDTO

Для начала, давайте определимся - что же это за зверь такой - XDTO?

Как я уже говорил, это сокращение от XML Data Transfer Objects, что по-русски означает “XML-объекты переноса данных”.

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

Зачем оно надо?

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

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

Что в итоге?

XDTO - это механизм, разработанный фирмой “1С” для обмена данными с другими программными системами посредством XML, позволяющий на уровне языка 1С оперировать не узлами XML, а прикладными понятиями “Сотрудник”, “Счет” и привычными встроенными типами (“ТаблицаЗначений”, “СправочникСсылка” и т.п.).

Начнем знакомство

Для начала, давайте обратимся к концепции XML документа, как такового. Как правило, документ содержит некоторую структурированную информацию, которую можно условно представить в виде набора объектов. Например, документ “СписокСотрудников.xml” содержит узел “Сотрудники”, внутри которого имеются элементы с типом “Сотрудник”.

 

 

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

Схема однозначно указывает, какие узлы и в каком порядке должны располагаться в документе. Кроме того, она представляет наборы узлов в виде функциональных типов данных, таких, как “Сотрудник”. Что еще более приятно - типы могут наследоваться и составлять иерархии типов.

А теперь, вспомним, зачем нужен XDTO - представление XML в виде объектов бизнес-логики. Если у нас будет набор бизнес-объектов, которые нужно передать по сети в виде XML, то мы можем создать XML-документ с помощью стандартного средства записи - объекта ЗаписьXML и поэлементно создать структуру, постаравшись ничего не напутать в структуре документа. Либо, мы можем создать XML-документ c помощью XDTO, используя более простой код:

 

Сотрудник.ФИО = “Иванов Иван Иванович”;
Сотрудники.Добавить(Сотрудник);

 

Низкоуровневые вопросы формирования XML и размещения его в документе возьмет на себя платформа.

Здесь я заранее хочу попросить прощения за такое длинное вступление у тех, кто хорошо знаком с XML и с XDTO. Мне хочется, чтобы рассказ шел от самых начал, т.к. я не могу заранее предсказать квалификацию читателя. Если все вышесказанное вам и так известно, пролистайте ниже :).

Вернемся к приведенному примеру кода. Видно, что есть некий объект сотрудник со свойством “ФИО”, которому присваивается строка. Далее этот сотрудник помещается в коллекцию. После записи коллекции, мы получим готовый XML документ, что явно проще, чем ручное создание элементов и атрибутов с помощью ЗаписьXML.

Закономерный вопрос - как платформа узнает о том, какие свойства есть у сотрудника и как его записывать в XML-файл? Ответ только один - из схемы XML документа. Платформа знает какие свойства могут быть у объекта, потому, что этот объект описан в схеме будущего документа. Закономерный вывод - XDTO без схемы документа работать не может. Система типов обязательно должна быть известна, только тогда мы сможем создавать объекты этих типов, присваивать им свойства, записывать и читать их из XML потока.

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

Типы, объекты и фабрики

Пространства имен

На свете существует огромное количество программистов, которые создают те или иные XML-документы. При этом, очень часто они оперируют одинаковыми понятиями, например “Дата”, “Цена” и “Сотрудник”. Если вдруг две системы имен (созданных разными программистами) встретятся в рамках одной информационной системы, то произойдет конфликт имен.

Например, Вася создал тип данных “Сотрудник” со свойством “ФИО” и Петя создал объект "Сотрудник" со свойствами “Фамилия”, “Имя”, “Отчество” и “ИНН”. Объекты разные, а имя типа одно, возникает путаница. Чтобы этого избежать, используются пространства имен. Все имена должны быть уникальны в рамках одного пространства имен. Имена в разных пространствах запросто могут повторять друг друга.

По традиции (и по многим другим соображениям), пространства именуются в виде URL-подобных строк. Например, “http://vasya.org/xml/sotrudniki”. Причем, это не ссылка в сети, это просто строка-идентификатор. Документы пестрят этими “ссылками” и ,сталкиваясь с ними, начинающий специалист впадает в ступор - “что это за адреса, что по ним расположено, а что, если нет интернета...” Так вот, это не адреса, это уникальные идентификаторы пространств имен. Строка может быть любой.

Теперь, все типы, которые изобретет Вася, он поместит в свое пространство имен и творчество Пети ему не страшно. Всегда можно отличить одного “Сотрудника” от другого.

Типы данных

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

Модель данных и Фабрика XDTO

При построении системы типов XDTO используется понятие Модели данных. Модель представляет собой совокупность всех типов, которые можно записать в один XML документ. С понятием модели неразрывно связано понятие Фабрики XDTOФабрика, это объект платформы 1С:Предприятие, который позволяет создавать те самые объекты “Сотрудник”, к которым можно обращаться “через точку”. Именно фабрика создает объект встроенного языка и наделяет его свойствами “ФИО” и “ИНН”, позволяя виртуальной машине обращаться к этим свойствам. Перечень возможных типов и их свойств фабрика берет из модели данных, которая в конечном итоге представляет собой просто набор схем XML.

Что в итоге?

Представьте, что у нас есть большая система взаимосвязанных типов. Каждый тип входит в определенный логический блок типов, а блоки для удобства разнесены по разным схемам XML. Например, у нас есть блок “Коллекции”, представляющий абстрактные списки объектов и есть блок “Сотрудники”, представляющий типы объектов, описывающие сотрудников, их зарплату, должности и т.п.

Нам нужно выгрузить и передать куда-то XML документ со списком сотрудников.

Для этого, нам удобно взять тип “Список” из схемы списков и наполнить его “Сотрудниками” из схемы “Сотрудники”. В результате, наша модель типов включает в себя 2 схемы (2 пакета) типов - “Списки” и “Сотрудники”. На основании данной модели типов мы можем создать Фабрику, которая будет “строить” объекты, к которым мы сможем обращаться из встроенного языка.

Меньше слов, ближе к делу

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

Для разработки схем я использую Liquid XML Studio. Отличный инструмент позволяющий построить схему посредством тыкания мышкой. Я пользуюсь версией 2008, она бесплатная, но слегка глючная. Более старшие версии мощны, но за деньги.

Liquid XML Studio позволяет строить схемы в виде вот-таких картинок:

 

 

Создаваемая схема описывает типы данных, которые мы можем использовать. Обязательно задается пространство имен, которому наши типы будут принадлежать. Сами типы подразделяются на простые и составные (simple и complex). Соответственно, простые типы, это те, которые можно представить одним значением - строка, дата, булево и т.п. Составные объекты - те, которые содержат несколько значений, а стало быть одной строчкой представлены быть не могут.

В конфигураторе, каждая схема XML может быть представлена в виде ПакетаXDTO, а вся совокупность типов, имеющихся в конфигурации составляет Модель данных конфигурации. Соответственно, все типы Модели (включая созданные нами Пакеты) могут создаваться глобальным объектом ФабрикаXDTO.

Простые типы XML представляются в виде объектов языка 1С с типом “ЗначениеXDTO”. Составные типы XML представляются в виде объектов языка 1С с типом “ОбъектXDTO”.

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

Что со всем этим делать?

Давайте еще раз подведем краткий итог и воспользуемся полученной информацией. Итак, у нас есть 2 пакета типов (2 схемы XML). Первая - разные коллекции, списки, соответствия и т.п. Вторая - сотрудники. Нам нужно сформировать список сотрудников.

 

1. Предположим, что пакет коллекций имеет пространство имен “http://super-puper/collections”, а пакет сотрудников - “http://super-puper/employees”.

2. В конфигураторе раскрываем ветку ПакетыXDTO и в контекстном меню выбираем “Импорт схемы XML”. Указываем файлы со схемами.

3. В ветке пакетов появятся наши пакеты. Зададим им осмысленные имена (любые)

4. Теперь конфигурация “знает” о наших типах данных и они включены в модель типов конфигурации

 

Применение в коде

Как уже говорилось, для создания объектов XDTO применяется ФабрикаXDTO. Чтобы создать объект, фабрика должна знать его тип. Делается это следующим образом:

 

// Создается объект языка 1С с типом “ТипОбъектаXDTO”
// Первый параметр пространство имен, второй - имя типа в пространстве имен.

ТипОбъектаСписок = ФабрикаXDTO.Тип(“http://super-puper/collections”, “Список”);

// Создаем объект списка

ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);

// обход сотрудников для выгрузки
Пока Выборка.Следующий() Цикл
ТипОбъектаСотрудник = ФабрикаXDTO.Тип(“http://super-puper/employees”, “Сотрудник”);
Сотрудник = ФабрикаXDTO.Создать(ТипОбъектаСотрудник);

// Свойство “ФИО” объявлено в схеме
Сотрудник.ФИО = Выборка.Наименование;

// Добавление “Сотрудников” в “Список”
ОбъектСписок.Добавить(Сотрудник);

КонецЦикла;


// А теперь, запись в поток XML

Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку(); // запись в строку

ФабрикаXDTO.Записать(Запись, ОбъектСписок);
ДанныеXML = Запись.Закрыть(); // документ готов!

 

Резюме

 

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

Далее мы рассмотрим программное создание модели типов, собственных фабрик, а также нюансы работы с объектами XDTO.

Если данная тема вам интересна, отпишитесь в комментариях, продолжение обязательно последует.

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4509    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5287    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18470    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8816    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15982    SeiOkami    31    

103
Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
91. Evil Beaver 8107 06.01.13 10:21 Сейчас в теме
(89) hame1e00n, Смогу перезалить только после НГ каникул.
hame1e00n; +1 Ответить
90. sikuda 673 06.01.13 09:31 Сейчас в теме
86. Обычно XMLReader или типа XmlStreamReader относят по теории к SAX. Потому, что функция ПриВстречеВФайлеНекоторогоАтрибута() легко превращается в ПриВстречеСледующегоАтрибута() или точнее ПриВстречеСледующегоУзла().
93. dimk@a 06.01.13 18:21 Сейчас в теме
Evil Beaver, спасибо за статью! Очень хороший пинок чтоб разобраться с }{DTO. Ждем продолжения.
94. hame1e00n 524 07.01.13 19:39 Сейчас в теме
Автор, большое спасибо за статью! Ждем продолжения :-)
95. dyak84 08.01.13 00:21 Сейчас в теме
спасибо за статью.Она написана простим и доступным языком. "Учится никогда не поздно" .Автор так держать.
96. dyak84 08.01.13 00:22 Сейчас в теме
спасибо за статью.Она написана простим и доступным языком .Автор так держать.
97. Flashback1979SE 09.01.13 08:36 Сейчас в теме
98. DownloadMASTER 10.01.13 08:55 Сейчас в теме
Как я уже говорил, это сокращение от XML Data Transfer Objects, что по-русски означает “XML-объекты переноса данных”.
Оказывается, это не какой-то всемирно принятый стандарт, поддерживаемый платформой 1С. Наоборот, аббревиатура XDTO родилась в недрах фирмы 1С и представляет собой ее собственный креатив. Нигде, кроме как в сфере 1С, вы не встретите данного сочетания букв.
Мне не ведомы истинные мотивы создания целой подсистемы, но кажется, что основная цель - это создание простой объектной модели доступа к XML документам

XDTO-пакет это изобретение 1С для того, чтобы создавать/импортировать/редактировать XML схемы.
То есть 1С реализовала у себя редактор всемирно принятого стандарта - XML schema.
99. Evil Beaver 8107 10.01.13 09:43 Сейчас в теме
(98) DownloadMASTER, Нет. Редактор пакета XDTO позволяет создавать модели данных. Разница есть. Например, во второй части статьи приведен пример со свойством "Форма" и "Локальное имя". В стандартах XML такого понятия нет, а в пакете XDTO (а значит в модели данных) - есть. Подробности позже, отдельной статьей, или, если будет конкретный вопрос, то здесь.
101. DownloadMASTER 10.01.13 18:42 Сейчас в теме
(99)
Разница есть. Например, во второй части статьи приведен пример со свойством "Форма" и "Локальное имя". В стандартах XML такого понятия нет, а в пакете XDTO (а значит в модели данных) - есть.

Сделайте "Экспорт XML-схемы..."
На выходе получите XML-схему по стандарту.
Evil Beaver, что я в данном случае не улавливаю?
100. ZLENKO 398 10.01.13 13:36 Сейчас в теме
Странно... Почему-то всех больше интересует "форма" чем "содержание" по данному вопросу.
103. Ksu 16.01.13 09:04 Сейчас в теме
Здорово! Тема интересная и статья очень полезная!
105. pass_developer 16.01.13 20:41 Сейчас в теме
Спасибо за статьи. Да, ссылка в начале не на продолжение...
106. sa1m0nn 28 18.01.13 13:10 Сейчас в теме
107. expert.1c8 22.01.13 23:51 Сейчас в теме
Будет и третья часть еще?
108. CratosX 112 10.02.13 02:52 Сейчас в теме
У кого трудности в понимании XML - яндекс выложил неплохое видео http://events.yandex.ru/events/shri/msk-2012/talks/555/
avmironov; zzz14; Dr.ZIG; +3 Ответить
109. Alex_1066 09.03.13 01:57 Сейчас в теме
Статья хорошая. Автору - респект! Некоторые трения в комментах тоже полезны. Главное не переходить на личности. У каждого "свой" уровень - и не обязательно выше, или ниже. Просто другой. Давайте уважительно относиться друг к другу. Это же хорошо, что все разные. Короче всем респект - особенно автору за особенный :) читательский интерес. Жаль не могу задать хорошего вопроса - пока ещё не в теме :)
avmironov; +1 Ответить
111. Evil Beaver 8107 27.03.13 18:59 Сейчас в теме
ТипОбъектаСписок = ФабрикаXDTO.Тип(“http://super-puper/collections”, “Список”);


А в конфигурации пакет у вас такой есть? Фрагмент текста показывает методику работы, приемы. Он не является самодостаточным в стиле "вбил-заработало".

Полноценный пример во вложениях к статье №3
112. rfcor 75 30.04.13 10:05 Сейчас в теме
Ставлю заслуженный плюс! Во многом благодаря статьям автора я освоил веб-сервисы и успешно реализовал нужный функционал на практике.
avmironov; +1 Ответить
113. пользователь 08.08.13 23:40
Сообщение было скрыто модератором.
...
114. nick_krsk 19 11.10.13 11:53 Сейчас в теме
Очень хорошая статья!
До этого с XDTO не был знаком вообще.
Обязательно прочитаю остальные части :)
avmironov; +1 Ответить
115. MakcTLT63 5 18.11.13 14:01 Сейчас в теме
Спасибо. Отличная статья.
avmironov; +1 Ответить
116. kruglay 110 07.02.14 08:26 Сейчас в теме
Тема огонь)) Спасибо автору!
avmironov; +1 Ответить
117. kote 536 07.02.14 16:29 Сейчас в теме
Все это хорошо, но больно муторно работать с этим хозяйством (в контексте web-сервисов)..
В общем - "фтопку" XDTO - даешь REST сервисы!
119. Evil Beaver 8107 07.02.14 17:44 Сейчас в теме
(117) kote, думаете, будет проще? А меня вот терзают смутные сомнения, что проще не станет))
118. lesenoklenok 35 07.02.14 16:51 Сейчас в теме
Спасибо за интересную статью.
avmironov; +1 Ответить
120. RustamTurn 11.03.14 13:20 Сейчас в теме
Отличная статья, спасибо
avmironov; +1 Ответить
121. Andrey@ 16.03.14 12:17 Сейчас в теме
Спасибо автору статьи за информацию!Никогда не интересовало, что такое XDTO.Теперь появился интерес.
avmironov; +1 Ответить
122. zakov 02.04.14 10:49 Сейчас в теме
Для меня пока это темный лес... Добавлю в закладки, спасибо, буду изучать...
avmironov; +1 Ответить
123. Gonja 22.06.14 23:41 Сейчас в теме
Внакомился с этим «зверем» XDTO вскользь, но так и оставил напоследок, а данная статья приоткрыла завесу. Ставлю жирный плюс.
avmironov; +1 Ответить
124. OBEH 26.07.14 23:42 Сейчас в теме
По моему, сейчас появились более компактные и более понятные для пользователя форматы.
О них, для сравнения, хотелось бы узнать. Ну и перспективы.
Уж слишком муторный формат XDTO. В топку его. И на больших объемах, вообще, беда. Приходится руками писать что-то свое.
125. Evil Beaver 8107 27.07.14 09:18 Сейчас в теме
(124) OBEH, писать что-то свое?? Эта фраза выдает в вас строителя велосипедов. XDTO - это не формат, а библиотека классов. Формат это XML. Да, он избыточен и многословен, но объемы это несущественно. В 1С можно заменить XML на FastInfoset, получится меньший объем без переписывания кода. А XDTO - это не формат. Теоретически, можно реализровать запись XDTO в JSON.
126. baracuda 2 03.02.15 11:14 Сейчас в теме
Применение в коде

Как уже говорилось, для создания объектов XDTO применяется ФабрикаXDTO. Чтобы создать объект, фабрика должна знать его тип. Делается это следующим образом:


// Создается объект языка 1С с типом “ТипОбъектаXDTO”
// Первый параметр пространство имен, второй - имя типа в пространстве имен.
ТипОбъектаСписок = ФабрикаXDTO.Тип(“http://super-puper/collections”, “Список”);

// Создаем объект списка
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);

// обход сотрудников для выгрузки
Пока Выборка.Следующий() Цикл
ТипОбъектаСотрудник = ФабрикаXDTO.Тип(“http://super-puper/employees”, “Сотрудник”);
Сотрудник = ФабрикаXDTO.Создать(ТипОбъектаСотрудник);

// Свойство “ФИО” объявлено в схеме
Сотрудник.ФИО = Выборка.Наименование;

// Добавление “Сотрудников” в “Список”
ОбъектСписок.Добавить(Сотрудник);

КонецЦикла;

// А теперь, запись в поток XML

Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку(); // запись в строку

ФабрикаXDTO.Записать(Запись, ОбъектСписок);
ДанныеXML = Запись.Закрыть(); // документ готов!
Показать


Я правильно понимаю, что это тоже самое что и создать пакетXDTO вручную??
127. Evil Beaver 8107 03.02.15 15:49 Сейчас в теме
(126) baracuda, э... нет, неправильно. В вашем примере кода никаких ПакетовXDTO вообще не создается. Не понял вопроса...
128. Alexei_fox 46 17.02.15 07:30 Сейчас в теме
Как с помощью XDTO получить вот такую строку в xml ? <Картинка Описание="Описание">путь к картинки относительно xml файла.jpg</Картинка>

Так то не проблема !!!
<Картинка>
<Описание>import_files/88/8868f46e-9d44-11e4-acb8-001e90f93bad_6098c20e-a850-11e4-85dc-001e90f93bad.jpeg</Описание>
</Картинка>

А разработчик приемника хочет именно <Картинка Описание="Описание">путь к картинки относительно xml файла.jpg</Картинка> ...

Есть мысли у кого ?
129. vlad.frost 186 19.02.15 11:53 Сейчас в теме
(128) Для того, чтобы выполнить требование разработчика приёмника, для поля "Описание" свойство "Форма" установите в значение "Атрибут", а не "Элемент"

kasper076; +1 Ответить
131. Infector 199 01.01.16 22:24 Сейчас в теме
Коллеги, а реально ли соорудить XML, не записывая результат в файл? Мне, например, сразу к сайту нужно обращаться через XML (конкретнее - уже небезызвестный ВЕТИС).
132. Evil Beaver 8107 02.01.16 14:38 Сейчас в теме
(131) Infector, см. метод ЗаписьXML.УстановитьСтроку()
133. Infector 199 02.01.16 20:02 Сейчас в теме
(132)

ЗаписьXML 	= Новый ЗаписьXML;
		
ЗаписьXML.УстановитьСтроку("windows-1251"); 
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ЗапросСписокСтран_XDTO, "getAllCountryListRequest");
    


Ошибок нет. Однако же как из "ЗаписьXML" теперь выдрать XML-файл в текстовом его представлении? Как через временный файл - понятно, но плодить файловые операции не хочется, быстродействию они обычно не способствуют.
134. pablo_escobar 02.01.16 22:58 Сейчас в теме
(133) Infector,
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Запись документа XML
...
СтрXML = ЗаписьXML.Закрыть();
avmironov; Infector; +2 Ответить
135. Infector 199 03.01.16 12:48 Сейчас в теме
(134) pablo_escobar, Спасибо за подсказку, работает.
avmironov; +1 Ответить
136. Evil Beaver 8107 03.01.16 17:50 Сейчас в теме
(134) pablo_escobar, дай человеку рыбу и он будет сыт один день. Научи его пользоваться синтакс-помощником и он будет сыт всегда.
avmironov; axelerleo; necropunk; +3 Ответить
137. jokereinherjar 28.01.16 09:33 Сейчас в теме
(131) Infector, я например так делаю
Фабрика = ПроксиПодсистемаОбработкиЗаявок.ФабрикаXDTO;
SubmitApplicationRequest = Фабрика.Создать(Фабрика.Тип(
										"http://api.vetrf.ru/schema/cdm/application/ws-definitions",
										"submitApplicationRequest"));
138. Infector 199 28.01.16 17:04 Сейчас в теме
(137) smaximaa,

Ну про это понятно.
Я вот про эту часть (пример заимствовал в одной из публикаций, если знаете другой метод - в студию):
ВысылаемыйЗапрос - здесь тело XML в строковом виде, до этого приходилось XML только в файлы писать.
	
	MSXML = Новый COMОбъект("MSXML2.XMLHTTP.4.0");
	
	MSXML.open("POST", ИмяСервера, 0,ПараметрыПодключения_ВЕТИС.Login,ПараметрыПодключения_ВЕТИС.Password);
	MSXML.setRequestHeader("Accept", "text/xml; charset=utf-8");
		
	MSXML.setRequestHeader("SOAPAction", ИмяСервиса);
		
	Попытка
		MSXML.send(ВысылаемыйЗапрос);
		Ответ = MSXML.responseText;
	Исключение
		Сообщить("Ошибка выполнения запроса",СтатусСообщения.Важное);
		Ответ = "";
	КонецПопытки;	
	
Показать


Ну с общей помощью в этом моменте разобрался. А так да, пакетов у ВЕТИСа накачал, примерно так запросы и собираю
141. Spade 17.05.16 12:01 Сейчас в теме
Отличная статья! Очень познавательно. Спасибо. Продолжайте в том же духе!
avmironov; +1 Ответить
142. NikVit 31.05.16 21:05 Сейчас в теме
а в семерке кто-нибудь занимался?

143. Evil Beaver 8107 31.05.16 21:24 Сейчас в теме
144. user_2010 871 24.06.16 16:54 Сейчас в теме
Подскажите, плз!
Разрабатываю веб-сервис, который будет добавлять запись в справочник.
При вызове веб-сервиса передаются параметры - значения полей добавляемой записи.
Полей много, все их перечислять в параметрах метода веб-сервиса - это нормально? Или можно как-то использовать пакет XDTO, который мы настроили для записи справочника?
145. user_2010 871 24.06.16 17:34 Сейчас в теме
(144) user_2010, кажется, я поспешила с вопросом... для параметра метода выбрала тип из моего XDTO.
146. AlexanderKai 28.06.16 11:44 Сейчас в теме
Нужно постоянно переделывать схемы XSD, чтобы они "вписались" в XDTO.
Да и чтение не особо удобно.
148. user_2010 871 28.06.16 14:18 Сейчас в теме
подскажите, плз...
1. создали свой пакет XDTO, в нем описали свой тип данных Kontr - например запись справочника Контрагенты (поля: Code, Name, INN, KPP).
2. в веб-сервисе мне передают в качестве параметра Kontr.
Вопрос: как мне обратиться, например, к INN в процедуре веб-сервиса? Kontr.INN?
149. vpaoli 26 25.08.16 21:01 Сейчас в теме
По поводу "Наоборот, аббревиатура XDTO родилась в недрах фирмы 1С и представляет собой ее собственный креатив. Нигде, кроме как в сфере 1С, вы не встретите данного сочетания букв."

Вы скорее ошибаетесь. В мире java уже давно есть понятие DTO (data transfer object) . Сам лично использовал такие объекты для того чтобы отображать java- классы базы данных в объекты интерфейса. Есть и технологии представления таких объектов в XML, например здесь - http://www.tsjensen.com/blog/post/2006/12/27/Simple+XML+To+DTO+And+Back+Again
150. Evil Beaver 8107 05.09.16 11:50 Сейчас в теме
(149) vpaoli, я не ошибаюсь. Термин "XDTO" именно в таком написании и такой семантике - это креатив 1С, а не некий международный стандарт.
А DTO - да, общепринятый профессиональный термин.
151. user629541_79276140580 16.12.16 09:02 Сейчас в теме
152. NAlex 6 12.01.17 12:53 Сейчас в теме
Респект автору! Качественная, хорошая статья.
avmironov; +1 Ответить
153. Jivchic 94 09.02.17 06:39 Сейчас в теме
Здравствуйте,
столкнулся с задачей,

читаю xml ФабрикаXDTO, без использования ПакетовXDTO

для элементов со значением все в порядке:
<Роль>Покупатель</Роль> //вернет "Покупатель"

а там где пустые элементы засада...
<ИНН/> //вернет ОбъектXDTO
<Роль></Роль> //вернет ОбъектXDTO

1) подскажите пожалуйста как определить что там пусто?

2) или принять так что если это тип ОбъектXDTO (т.е. конечный объект, не список, то и нету там ничего... ?)
155. Evil Beaver 8107 31.08.17 11:29 Сейчас в теме
(153) Если чтение нетипизированное, то проверять на пустоту или список надо будет постоянно и вручную. Через методы Установлено() и проверку на ТипЗнч() = Тип("СписокXDTO")

Без "подсказки" в виде СхемыXML парсер XDTO преобразовывает xml в дерево объектов, как может и как умеет.
154. Vhett 29.08.17 14:34 Сейчас в теме
Я наверное даун. Но куда код то писать?
156. Vhett 01.09.17 13:09 Сейчас в теме
Как написать правильно, чтоб отчёт в XML выгрузил?

ЗаписьXML = Новый ЗаписьXML;
	  ЗаписьXML.ОткрытьФайл("c:\test\file.xml");
	  СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Отчеты.ОтчетПоПродажамВXLS.Создать(), "(Не совсем понял, что за НазначениеТипа, название XDTO-пакета?)", "http://www.sample-package.org");
	  ЗаписьXML.Закрыть();
157. Трактор 1246 16.01.18 12:12 Сейчас в теме
Ошибка в строке:
ФабрикаXDTO.Записать(Запись, ОбъектСписок);

У объекта ФабрикаXDTO есть только метод ЗаписатьXML
158. user986487 07.06.18 23:09 Сейчас в теме
Всем кто интересуется данной темой, советую почитать вот эту статью Механизм XDTO. Очень хорошо все расписано и разобраны все свойства из Типа значения, Типа объекта, Свойства.
159. Evil Beaver 8107 09.06.18 18:47 Сейчас в теме
(158) да, неплохая статья. Но есть ощущение, что я ее уже видел на другом ресурсе, а тут - перепечатка. Могу ошибаться, конечно.
186. axelerleo 338 28.07.22 13:48 Сейчас в теме
(159) Увы, это действительно перепечатка, причем с официального руководства разработчика. Проверить легко через ИТС :)
https://its.1c.ru/db/v8322doc#bookmark:dev:TI000000762
например
187. Evil Beaver 8107 28.07.22 13:58 Сейчас в теме
(186) Ну-ка приведите-ка прямую цитату с ИТС, милейший. Статья написана в 2012 году, и является первой на тот момент документацией на механизм XDTO. Я допускаю, что авторы ИТС сверялись с моим текстом, но вряд-ли они переписали его слово-в-слово. Докажите ваш наброс конкретными цитатами, которые я "перепечатал с ИТС" или извинитесь.
188. axelerleo 338 28.07.22 14:03 Сейчас в теме
(187) Речь не о вашей статье :), а вот об этой:
Всем кто интересуется данной темой, советую почитать вот эту статью Механизм XDTO. Очень хорошо все расписано и разобраны все свойства из Типа значения, Типа объекта, Свойства.

Собственно, ваш комментарий (158) да, неплохая статья. Но есть ощущение, что я ее уже видел на другом ресурсе, а тут - перепечатка. Могу ошибаться, конечно.

Ну там собственно даже из адреса ссылки все понятно)))
https://master1c8.ru/platforma-1s-predpriyatie-8/rukovodstvo-razrabottchika/glava-16-rabota-s-razlitchnmi-formatami-dannh/mehanizm-xdto/
bgazobeton; +1 Ответить
189. Evil Beaver 8107 28.07.22 14:07 Сейчас в теме
(188) аа, тогда это я зря гневаюсь. Прошу прощения
avmironov; axelerleo; +2 Ответить
160. FilatovRA 168 25.06.18 17:52 Сейчас в теме
Может кому-нибудь упростит задачу полный работающий код для записи:
ТипОбъектаСписок = ФабрикаXDTO.Тип("http://www.sample-package.org", "Сотрудники");

// Создаем объект списка
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);
Запрос = новый запрос;
Запрос.Текст = "ВЫБРАТЬ
|	Сотрудники.Наименование КАК Наименование
|ИЗ
|	Справочник.Сотрудники КАК Сотрудники";

ВЫборка = Запрос.Выполнить().Выбрать();
СписокОбъекта = ОбъектСписок.ПолучитьСписок("Сотрудник");
// обход сотрудников для выгрузки
Пока Выборка.Следующий() Цикл
ТипОбъектаСотрудник = ФабрикаXDTO.Тип("http://www.sample-package.org", "Сотрудник");
Сотрудник = ФабрикаXDTO.Создать(ТипОбъектаСотрудник);

// Свойство "ФИО" объявлено в схеме
Сотрудник.Наименование = Выборка.Наименование;

// Добавление "Сотрудников" в "Список"
СписокОбъекта.Добавить(Сотрудник);

КонецЦикла;

// А теперь, запись в поток XML

Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку(); // запись в строку

ФабрикаXDTO.ЗаписатьXML(Запись, ОбъектСписок);
ДанныеXML = Запись.Закрыть(); // документ готов!
Показать
avmironov; Valador; +2 Ответить
161. olezhe 21 01.12.18 20:28 Сейчас в теме
Автор, спасибо за подробную статью.

Но в статье слетели иллюстрации!
avmironov; +1 Ответить
162. serko8547 110 11.12.18 13:50 Сейчас в теме
АВТОР! ОТДЕЛЬНАЯ тебе благодарность за ДОСТУПНОЕ пояснение про страшного? непонятного и зубастого зверя XDTO!
avmironov; +1 Ответить
163. koln 16.12.18 20:18 Сейчас в теме
Спасибо за статью. Довольно многое прояснилось.
avmironov; +1 Ответить
164. Jacki 04.03.19 14:39 Сейчас в теме
Спасибо, статья замечательная!
Но картинки на внешних ресурсах не отображаются
avmironov; +1 Ответить
165. user642695_crocus.vladikina 27.06.19 09:58 Сейчас в теме
почему не работают владеющие свойства ? вроде похоже на xdto - нигде не написано про владеющие свойства, но на инфостарте есть статья. Расскажите пожалуйста - почему они не работают ?
166. user642695_crocus.vladikina 27.06.19 10:01 Сейчас в теме
почему свойства то есть то нет ? как это манипулирует данными ?
167. user642695_crocus.vladikina 27.06.19 10:02 Сейчас в теме
кстати, забыла написать - не все примеры здесь на сайте работающие ....
168. Evil Beaver 8107 27.06.19 20:45 Сейчас в теме
(167) Вы когда спрашиваете, вы не забывайте уточнять. Что такое "не работают владеющие свойства"? Как именно они у вас не работают? Какой именно пример "здесь на сайте" не работает? Статьям этим 7 лет и прочло их много людей. У них как-то работало... Дайте больше деталей, пожалуйста, что вы делаете, что именно не получается, как выглядят сообщения об ошибках...
zurapa; vlad.frost; +2 Ответить
169. user642695_crocus.vladikina 28.06.19 12:24 Сейчас в теме
да. приходится смотреть сколько им лет ! спасибо
(168)
170. user642695_crocus.vladikina 28.06.19 12:25 Сейчас в теме
вопрос решен без статей
171. zurapa 01.08.19 09:41 Сейчас в теме
Шикарнейшая статья.
А вы ещё где-то публикуетесь? Или только на этом ресурсе?
У этой статьи протухли картинки, что портит впечатление от статьи. Не самое лучшее решение - размещать картинки на сторонних сервисах картинок, которые не имеют перспектив долгожителей типа itmage.ru.
172. user811769 13 18.01.20 11:39 Сейчас в теме
Спасибо автору из 2019! Очень понятное для новичка описание механизма. Жаль, что слетели картинки.
+ спасибо за пример в комментарии https://forum.infostart.ru/forum9/topic76907/#message822176
173. user811769 13 28.01.20 12:34 Сейчас в теме
В схеме, загружаемой в пакет XDTO может быть описан такой тип

<xs:complexType name="POCD_MT000040.PatientRole">
		<xs:sequence>
			<xs:element name="realmCode" type="CS" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="typeId" type="POCD_MT000040.InfrastructureRoot.typeId" minOccurs="0"/>
			<xs:element name="templateId" type="II" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="id" type="II" maxOccurs="unbounded"/>
			<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="addr" type="AD" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="telecom" type="TEL" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="patient" type="POCD_MT000040.Patient" minOccurs="0"/>
			<xs:element name="providerOrganization" type="POCD_MT000040.Organization" minOccurs="0"/>
		</xs:sequence>
		<xs:attribute name="nullFlavor" type="NullFlavor" use="optional"/>
		<xs:attribute name="classCode" type="RoleClass" use="optional" fixed="PAT"/>
		<xs:anyAttribute namespace="##other"/>
</xs:complexType>
Показать


при заполнении элементов типа addr или telecom не возникает никаких проблем, но вот как правильно добавить свой элемент, не описанный в схеме? Строчка <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> говорит. что это можно сделать, но когда я добавляю в 1С patientRole.f88:IdentityDoc.f88:IdentityCardTypeId.@xsi:type, возникает ошибка
Прикрепленные файлы:
175. ivangrant 10 30.11.20 07:21 Сейчас в теме
Жаль, что автор забыл про статью - картинки бы обновить :(
А так - всё супер!
176. Evil Beaver 8107 30.11.20 19:11 Сейчас в теме
(175)автор не забыл про то, что нет картинок, но забыл, что было на этих картинках, поэтому не знает, как именно их обновлять (
axelerleo; Valador; ivangrant; +3 Ответить
177. ivangrant 10 02.12.20 22:41 Сейчас в теме
178. amozita 17.03.21 10:35 Сейчас в теме
Бесполезная статья. Очень много воды, много личных абстракций "..представьте то, представьте это" и все это крутится вокруг "Я" писателя. В итоге - нулевой выхлоп. Буря в стакане. На другом сайте нашел статейку которая в 4 раза короче и там человек по делу, "на пальцах" все разъяснил..
179. user705522_constantin_h 35 17.03.21 11:12 Сейчас в теме
(178)Ссылочку на эту статья можете дать?
bgazobeton; +1 Ответить
180. Evil Beaver 8107 17.03.21 17:19 Сейчас в теме
(178) что я могу сказать... на всех не угодишь. Статья написана в 2012 году. На тот момент это была лучшая информация по XDTO, имеющаяся в интернете. Допускаю, что за 9 лет люди накопили бОльший опыт и описали его более качественно.

А раз уж Вы нашли более качественную статью - не худо было бы поделиться ею с людьми, а не просто высраться понегодовать в каментах 9-летнего материала )
bgazobeton; @Fancy; ubnkfl; headMade; olegtymko; nixel; tormozit; user705522_constantin_h; +8 Ответить
181. ubnkfl 01.04.21 15:27 Сейчас в теме
(178) бесполезный комментарий. Очень много воды. В итоге - нулевой выхлоп. Буря в стакане.
bgazobeton; avmironov; Bukaska; swolf256; user705522_constantin_h; +5 Ответить
182. user1559734 04.04.21 08:34 Сейчас в теме
Вопрос зачем, ведь есть же популярный форма JSON, все рест запросы, работают через него, зачем изобретать велосипед? Разве JSON не похоронил остальные форматы передачи?
183. ubnkfl 05.04.21 13:02 Сейчас в теме
184. Funtik90 28.09.21 16:41 Сейчас в теме
Картинки куда-то делись из статьи, теперь какие схемы нарисовать чтобы их загрузить не знаю. обновите картинки. а то только начал разбираться с XDTO и тупик
Не понял как создать список, схемы нет на картинке, (картинок в статье вообще нет - не прогружаются) объясните кто-нить, как сделать описание списка и где?
185. Funtik90 28.09.21 21:05 Сейчас в теме
не понял как создать список, схемы нет на картинке, (картинок в статье вообще нет - не прогружаются) объясните кто-нить, как сделать описание списка и где?
190. user1654599 02.01.23 13:57 Сейчас в теме
Из Вашей статьи непонятно следующее. Есть документ с табличной частью и реквизитами. Реквизит 1. Реквизит2. Реквизит3 и табличной частью с реквизитами Реквизит табличной части1. Реквизит ТабличнойЧасти2. Реквизит табличной части 3 и.т.д. Надо содержимое этого документа записать в виде xml файла, так чтобы реквизиты соответствии ствовали узлам XML. Как это сделать я не понял.
191. user1654599 02.01.23 13:59 Сейчас в теме
При этом в документ xml должны быть записаны соответствующие данные из строк табличной части документа в соответствующие узлы xml. Как это сделать
192. user1654599 02.01.23 18:48 Сейчас в теме
Разработчик и все кто пишут про механизм XDTO должны понять очень простую вещь. Реквизит документа ( справочника)=узел xml файла
Поэтому по сути дела речь идёт о печати данных документа в соответствующие узлы XML. И тогда никакого механизма XDTO не нужно вообще. Данные справочников и документов согласно из реквизитам записываются в соответствующие узлы и им присваиваются в конструкторе соотвествующие атрибуты. И все. Нужен не дуратский механизм XDTO, а нормальный конструктор xml файла, по аналогии с конструктором печати, где нужные реквизиты записываются в соответствующие узлы. И все. И не нужен никакой механизм xdto, для создания XML файла.
193. пользователь 21.03.23 15:08
Сообщение было скрыто модератором.
...
195. Dima123456 05.04.23 15:51 Сейчас в теме
1. То же самое, что у 102 и 110. А можно по подробнее в виде скринов ? По первому скрину работает. По второму нет. Я так понял, что ОбъектСписок не имеет тип СписокXDTO. Поэтому в коде

ОбъектСписок.Добавить(Сотрудник);

выскакивает ошибка.

2. Вы пишите: 2. В конфигураторе раскрываем ветку ПакетыXDTO и в контекстном меню выбираем “Импорт схемы XML”. Указываем файлы со схемами.

А где эти файлы взять ? В вашей статье их нет. Поэтому ветку XDTO сотрудник, список делал сам интуитивно. Спасибо.
Прикрепленные файлы:
196. KrakoZyabl 77 08.06.23 14:56 Сейчас в теме
Понятная статья, без лишних прибамбасов .Спасибо!!!
197. yurazyuraz 13.07.23 17:05 Сейчас в теме
Интересно программно создать XSD по указанным метаданным
198. yurazyuraz 13.07.23 17:18 Сейчас в теме
Очень полезная статься, помогла расширить знания.
199. Oruzeynik 28.11.23 16:35 Сейчас в теме
Тема интересная но изложение корявое - НЕ ДЛЯ ЛЮДЕЙ.. Мне в свое время XDTO + веб сервис передачу данных туда и обратно в фомате XML объяснили по нормальному по человечески за 15 минут. То что вы расписали "дохтерскую диссертацию" не оставляет даже желания прочесть.
Оставьте свое сообщение