Базовые положения
Общие объекты
Общие метаданные
Прикладные объекты
Базовые положения
Общие объекты
Общие метаданные
Прикладные объекты
Это старая версия документа!
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-пакетов как с помощью конструктора, так и путём импорта существующих файлов .xsd. Эти пакеты могут служить основой для получения типов объектов XDTO. Выглядит это так:
ТипОбъектаНоменклатура = ФабрикаXDTO.Тип("http://www.wiki-1c.ru/xdto", "Номенклатура");
Здесь ФабрикаXDTO - это особый глобальный объект, который знает всё обо всех объектах XDTO, описанного в имеющихся в конфигурации XDTO-пакетах. Метод Тип() возвращает искомый тип объекта XDTO (ТипОбъектаXDTO). Он принимает 2 параметра - пространство имён и имя типа (оба - строки). Результат полезно запомнить в переменной, в дальнейшем её можно использовать для создания объектов XDTO произвольное количество раз.
Заметим, что в параметре передаётся не имя пакета, а его пространство имён. Имя пакета вообще нигде не используется и задаётся только для удобства поиска в дереве конфигурации.
Такие файлы традиционно имеют расширение .xsd. Преимущество данного метода в том, что он работает независимо от конфигурации. И если первому методу обязательно требуется отдельный объект конфигурации, этот требует только наличия файла со схемой. Вот код создания соответствующего объекта-фабрики и получение типа объекта XDTO:
МояФабрикаXDTO = СоздатьФабрикуXDTO("D:\Temp\goods.xsd"); ТипОбъектаНоменклатура = МояФабрикаXDTO.Тип("http://www.wiki-1c.ru/xdto", "Номенклатура");
Здесь мы использовали глобальную функцию СоздатьФабрикуXDTO, которая считывает файл со схемой (параметр функции) и создаёт объект-фабрику. Этот объект в будущем может произвольное число раз использоваться для создания любых доступных в схеме типов объектов. Если требуется загрузить несколько файлов со схемами, можно передать массив строк с именами файлов. Дальнейшая работа с фабрикой объектов не отличается от описанного в 1 способе.
Сами объекты XDTO также создаются фабрикой объектов. Причём той же самой, которая использовалась при получении типа. Но используется уже другой метод - Создать():
Номенклатура = МояФабрикаXDTO.Создать(ТипОбъектаНоменклатура);
В результате в переменной Номенклатура окажется объект XDTO, описанный в файле-схеме. К его реквизитам можно обращаться наподобие реквизитов фиксированной структуры. Естественно, нельзя добавлять или удалять реквизиты. В отличие от фиксированной структуры, каждый реквизит имеет определённый тип, поэтому произвольное присваивание не получится.
Прежде чем записать объект, его нужно заполнить. Принципы заполнения схожи с заполнением фиксированной структуры для реквизитов базовых типов, и с созданием объекта XDTO для прочих реквизитов.
Использование фабрики объектов на этом не закончится. Ведь у переменной Номенклатура есть несколько реквизитов, и каждый из реквизитов относится к какому-то типу. К счастью, простые типы можно использовать без подобных преобразований простым присваиванием:
Номенклатура.Наименование = "Носки суровые";
Более сложные типы требуют обращения к фабрике объектов:
ТипОбъектаЕдиницаИзмерения = МояФабрикаXDTO.Тип("http://www.wiki-1c.ru/xdto", "ЕдиницаИзмерения"); ЕдиницаИзмерения = МояФабрикаXDTO.Создать(ТипОбъектаЕдиницаИзмерения); ЕдиницаИзмерения.ОКЕИ = 796; ЕдиницаИзмерения.Наименование = "шт"; Номенклатура.ЕдиницаИзмерения = ЕдиницаИзмерения;
Стандарт позволяет создавать реквизиты-списки и реквизиты-структуры без создания отдельных типов. Заполнять такие реквизиты можно следующим образом:
// Список элементов простых типов Штрихкоды = Номенклатура.ПолучитьСписок("Штрихкоды"); Штрихкоды.Добавить("4601546124937"); Штрихкоды.Добавить("4601546093981"); // Список элементов сложных типов, описанных в схеме ПрочиеЕдиницыИзмерения = Номенклатура.ПолучитьСписок("ПрочиеЕдиницыИзмерения"); ЕдиницаИзмерения = МояФабрикаXDTO.Создать(ТипОбъектаЕдиницаИзмерения); ЕдиницаИзмерения.ОКЕИ = 166; ЕдиницаИзмерения.Наименование = "кг"; ПрочиеЕдиницыИзмерения.Добавить(ЕдиницаИзмерения);
Получение типа элементов-структур немного напоминает работу с метаданными конфигурации. Используем метод Свойства() для получения списка реквизитов (КоллекцияСвойствXDTO). Далее получаем параметры реквизита методом списка Получить() (СвойствоXDTO). В его реквизите Тип и находится искомый тип значения.
// Список элементов-структур Характеристики = Номенклатура.ПолучитьСписок("Характеристики"); ТипЭлементаХарактеристика = Номенклатура.Свойства().Получить("Характеристики").Тип; Характеристика = МояФабрикаXDTO.Создать(ТипЭлементаХарактеристика); Характеристика.Код = 1; Характеристика.Наименование = "Жёлтые"; Характеристики.Добавить(Характеристика); // Реквизиты-структуры ТипОбъектаСчетаУчета = Номенклатура.Свойства().Получить("СчетаУчета").Тип; Номенклатура.СчетаУчета = МояФабрикаXDTO.Создать(ТипОбъектаСчетаУчета); Номенклатура.СчетаУчета.СчетУчетаОстатков = "10.01"; Номенклатура.СчетаУчета.СчетУчетаРасходов = "26";
Сейчас объект заполнен и его можно записать.