Найти тему

Работа с XML через механизм XDTO с примерами

Файлы приложенные к статье, можно скачать по ссылке

Краткое описание

Механизм XDTO позволяет читать/писать данные XML/JSON используя XML-схемы (XDTO-пакеты), что структурирует и ускоряет работу с большими объемами данных. Более подробно можно почитать на ИТС – “Механизм XDTO”.

Термины

XDTO – XML Data Transfer Objects в переводе “XML-объекты переноса данных”, термин придуман в 1С.

XDTO-пакет – прикладной объект метаданных 1С, описывающих XML-схемы – типы данных, по средством которых будет формироваться XML. Можно импортировать/экспортировать через xsd файл, соответственно вместо XDTO-пакета можно использовать XML-схему описанную в xsd файле.

Фабрика XDTO – создает объекты XDTO в 1С, т.е. объекты тех типов которые описаны в модели данных, а модель данных – это массив XDTO-пакетов (XML-схем). Фабрика XDTO позволяет осуществлять чтения/запись данных XDTO в XML и JSON.

Сериализатор XDTO – преобразует объекты XDTO в объекты 1С и наоборот.

Пример XDTO-пакета и соответствующей ему XML-схемы полученной при экспорте пакета в файл

Обратите внимание, у типа объекта “Сотрудник” есть свойство “ДанныеПоРабочемуВремени” который имеет тип из этого же пакета. Оба этих типа находятся в пространстве имен “https://www.myblog-1c.ru”.

Добавьте описание
Добавьте описание

Так же в свойстве «ДанныеПоРабочемуВремени» было изменено “максимально количество” на “-1”, что означает, что в XML можно добавлять неограниченное количество тегов <ДанныеПоРабочемуВремени>. Здесь же можно сделать из тега атрибут.

В состав пакета-XDTO могут входить “Типы объектов” (complexType) и “Типы значений” (simpleType). Они отличается тем, что тип объекта содержит несколько свойств , а тип значения одно.

XML файл полученный с помощью данной схемы

<?xml version="1.0" encoding="UTF-8"?>

<Сотрудник xmlns="https://www.myblog-1c.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<ТабельныйНомер>11111</ТабельныйНомер>

<ФИО>Иванов И.И.</ФИО>

<ДанныеПоРабочемуВремени>

<Дата>2022-01-01</Дата>

<ВремяПоТабелю>8</ВремяПоТабелю>

</ДанныеПоРабочемуВремени>

<ДанныеПоРабочемуВремени>

<Дата>2022-01-02</Дата>

<ВремяПоТабелю>7</ВремяПоТабелю>

</ДанныеПоРабочемуВремени>

</Сотрудник>

Пример записи XML через XDTO

ФайлыXSD = Новый Массив();

ФайлыXSD.Добавить("\\Serv1c\XML-Схема.xsd");

МояФабрика = СоздатьФабрикуXDTO(ФайлыXSD);

// Кроме того есть голобальная ФабрикаXDTO содержащая все пакеты XDTO, имеющиеся в конфигурации, а также предопределенные пакеты (например, пакет типов XML схемы).

// <Сотрудник>

Сотрудник = МояФабрика.Создать(МояФабрика.Тип("https://www.myblog-1c.ru","Сотрудник"));

// Аналогиченый пример, через глобалбную фабрику, если бы пакет-XDTO был добавлен в конфигурацию

// Сотрудник = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("https://www.myblog-1c.ru", "Сотрудник"));

Сотрудник.ТабельныйНомер = "11111";

Сотрудник.ФИО = "Иванов И.И.";

// <ДанныеПоВремени> (1)

ДанныеПоРабочемуВремени = МояФабрика.Создать(МояФабрика.Тип("https://www.myblog-1c.ru","ДанныеПоРабочемуВремени"));

ДанныеПоРабочемуВремени.Дата = Дата(2022,1,1);

ДанныеПоРабочемуВремени.ВремяПоТабелю = 8;

Сотрудник.ДанныеПоРабочемуВремени.Добавить(ДанныеПоРабочемуВремени);

// <ДанныеПоВремени> (2)

ДанныеПоРабочемуВремени = МояФабрика.Создать(МояФабрика.Тип("https://www.myblog-1c.ru","ДанныеПоРабочемуВремени"));

ДанныеПоРабочемуВремени.Дата = Дата(2022,1,2);

ДанныеПоРабочемуВремени.ВремяПоТабелю = 7;

Сотрудник.ДанныеПоРабочемуВремени.Добавить(ДанныеПоРабочемуВремени);

Данные = Новый ЗаписьXML;

Данные.ОткрытьФайл("\\Serv1c\Результат.xml");

Данные.ЗаписатьОбъявлениеXML();

МояФабрика.ЗаписатьXML(Данные, Сотрудник);

Данные.Закрыть();

Пример чтения XML через XDTO

ФайлыXSD = Новый Массив();

ФайлыXSD.Добавить("\\Serv1c\XML-Схема.xsd");

МояФабрика = СоздатьФабрикуXDTO(ФайлыXSD);

Данные = Новый ЧтениеXML;

Данные.ОткрытьФайл("\\Serv1c\Результат.xml");

Сотрудник = МояФабрика.ПрочитатьXML(Данные, МояФабрика.Тип("https://www.myblog-1c.ru","ДанныеПоРабочемуВремени"));

Данные.Закрыть();

Сообщить(Сотрудник.ФИО+"("+Сотрудник.ТабельныйНомер+")");

Для Каждого ТекущийЭлемент Из Сотрудник.ДанныеПоРабочемуВремени Цикл

Сообщить(Строка(ТекущийЭлемент.Дата)+" "+Строка(ТекущийЭлемент.ВремяПоТабелю));

КонецЦикла;

Дополнение

Так же существует специализированный софт для создания более сложных XML-схем.