Файлы приложенные к статье, можно скачать по ссылке
Краткое описание
Механизм 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-схем.