Содержание:
Краткое описание
Механизм XDTO позволяет читать/писать данные XML/JSON используя XML-схемы (XDTO-пакеты), что структурирует и ускоряет работу с большими объемами данных. Так же используется при работе с web-сервисами. Более подробно из официальных источников, можно почитать на ИТС.
Файлы материала
Термины
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-схемы полученной при экспорте пакета в файл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<xs:schema xmlns:tns="https://www.myblog-1c.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.myblog-1c.ru" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:complexType name="ДанныеПоРабочемуВремени"> <xs:sequence> <xs:element name="Дата" type="xs:date"/> <xs:element name="ВремяПоТабелю" type="xs:int"/> </xs:sequence> </xs:complexType> <xs:complexType name="Сотрудник"> <xs:sequence> <xs:element name="ТабельныйНомер" type="xs:string"/> <xs:element name="ФИО" type="xs:string"/> <xs:element name="ДанныеПоРабочемуВремени" type="tns:ДанныеПоРабочемуВремени" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema> |
Обратите внимание, у типа объекта “Сотрудник” есть свойство “ДанныеПоРабочемуВремени” который имеет тип из этого же пакета. Оба этих типа находятся в пространстве имен “https://www.myblog-1c.ru”.
Так же в свойстве «ДанныеПоРабочемуВремени» было изменено “максимально количество” на “-1”, что означает, что в XML можно добавлять неограниченное количество тегов <ДанныеПоРабочемуВремени>. Минимальное количество “1” означает, что заполнение обязательно. Здесь же можно сделать из тега атрибут.
В состав пакета-XDTO могут входить “Типы объектов” (complexType) и “Типы значений” (simpleType). Они отличается тем, что тип объекта содержит несколько свойств , а тип значения одно.
XML файл полученный с помощью данной схемы
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Файлы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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
ФайлыXSD = Новый Массив(); ФайлыXSD.Добавить("\\Serv1c\XML-Схема.xsd"); МояФабрика = СоздатьФабрикуXDTO(ФайлыXSD); Данные = Новый ЧтениеXML; Данные.ОткрытьФайл("\\Serv1c\Результат.xml"); Сотрудник = МояФабрика.ПрочитатьXML(Данные, МояФабрика.Тип("https://www.myblog-1c.ru","ДанныеПоРабочемуВремени")); Данные.Закрыть(); Сообщить(Сотрудник.ФИО+"("+Сотрудник.ТабельныйНомер+")"); Для Каждого ТекущийЭлемент Из Сотрудник.ДанныеПоРабочемуВремени Цикл Сообщить(Строка(ТекущийЭлемент.Дата)+" "+Строка(ТекущийЭлемент.ВремяПоТабелю)); КонецЦикла; |
Дополнение
Так же существует специализированный софт для создания более сложных XML-схем.