1С 8.3 XDTO
Данные > Примеры кода 1С > 1С 8.3 XDTO
XML Data Transfer Objects (XDTO) в 1С 8.3 - это механизм обмена данными (с определенной структурой) с различными конфигурациями, сторонними приложениями, веб-сервисами. Создан компанией 1С специально для удобного взаимодействия с файлами XML. Позволяет импортировать XML-файл по установленным заранее правилам (XDTO-пакет) в объект 1С и обращаться к нему через точку (без тегов, атрибутов и скобок). Для трансформации важно наличие в файле атрибута "targetNamespace" с указанием пространства имен в XSD-файле.
XDTO-пакет можно использовать в конфигурации тремя способами:
- Создать самостоятельно в блокноте или онлайн сервисе (Общие - XDTO-пакеты - добавить).
- Импортировать в конфигурацию XSD (Общие - XDTO-пакеты - импорт XML-схемы).
- Использовать из отдельного файла XSD (без импорта в БД).
Схема XML пространства имен: www.w3.org/2001/XMLSchema
Пример структуры файла D:/Example_XDTO/Test.xml:
<?xml version="1.0" encoding="UTF-8"?>
-<Рестораны>
-<Ресторан Кухня="Азиатская" Счет="3500" Категория="Высшая" Название="Китайская грамота">
-<Меню>
<Блюдо Название="Суши из форели"/>
<Блюдо Название="Лапша фирменная"/>
<Блюдо Название="Суп из малюсков"/>
</Меню>
<Описание>Ресторан азиатской кухни Высшей наценочной категории</Описание>
</Ресторан>
-<Ресторан Кухня="Европейская" Счет="5000" Категория="Люкс" Название="Итальянский Экспресс">
-<Меню>
<Блюдо Название="Мясная нарезка из мраморной говядины"/>
<Блюдо Название="Салат де-люкс Комплимент"/>
<Блюдо Название="Пицца от шеф повара"/>
</Меню>
<Описание>Ресторан европейской кухни категории Люкс</Описание>
</Ресторан>
</Рестораны>
Оглавление:
Создание фабрики XDTO в 1С 8.3:
Процедура Создание_фабрики_XDTO() Экспорт
// Процедура создает фабрику XDTO (из файла XML) на основе схемы XML
// Создание объект чтения XML (по умолчанию)
XML = Новый ЧтениеXML;
// Запуск файла XML
XML.ОткрытьФайл("D:\Example_XDTO\SсhemaXML.xsd");
// Создание построителя документа DOM (по умолчанию)
Построитель_DOM = Новый ПостроительDOM;
// Чтение файла XML (в документ DOM)
Док_DOM = Построитель_DOM.Прочитать(XML);
// Создание построитель схемы XML (по умолчанию)
ПостроительСхемыXML = Новый ПостроительСхемXML;
// Получение схемы XML (из документа DOM)
Схема_XML = ПостроительСхемыXML.СоздатьСхемуXML(Док_DOM);
// Создание набора схем XML (по умолчанию)
Набор_Схем_XML = Новый НаборСхемXML;
// Добавление схемы XML в набор схем
Набор_Схем_XML.Добавить(Схема_XML);
// Создание фабрики XDTO на основе набора схем XML
ФабрикаXDTO = Новый ФабрикаXDTO(Набор_Схем_XML);
КонецПроцедуры
// Процедура создает фабрику XDTO (из файла XML) на основе схемы XML
// Создание объект чтения XML (по умолчанию)
XML = Новый ЧтениеXML;
// Запуск файла XML
XML.ОткрытьФайл("D:\Example_XDTO\SсhemaXML.xsd");
// Создание построителя документа DOM (по умолчанию)
Построитель_DOM = Новый ПостроительDOM;
// Чтение файла XML (в документ DOM)
Док_DOM = Построитель_DOM.Прочитать(XML);
// Создание построитель схемы XML (по умолчанию)
ПостроительСхемыXML = Новый ПостроительСхемXML;
// Получение схемы XML (из документа DOM)
Схема_XML = ПостроительСхемыXML.СоздатьСхемуXML(Док_DOM);
// Создание набора схем XML (по умолчанию)
Набор_Схем_XML = Новый НаборСхемXML;
// Добавление схемы XML в набор схем
Набор_Схем_XML.Добавить(Схема_XML);
// Создание фабрики XDTO на основе набора схем XML
ФабрикаXDTO = Новый ФабрикаXDTO(Набор_Схем_XML);
КонецПроцедуры
Получение фабрики XDTO из нескольких XSD в 1С 8.3:
Процедура Получение_фабрики_XDTO_из_нескольких_XSD() Экспорт
// Процедура получает фабрики XDTO из нескольких XSD
Схемы_XSD = Новый Массив;
Схемы_XSD.Добавить("D:\Example_XDTO\SсhemaXML_1.xsd");
Схемы_XSD.Добавить("D:\Example_XDTO\SсhemaXML_2.xsd");
Схемы_XSD.Добавить("D:\Example_XDTO\SсhemaXML_3.xsd");
Пакеты_XSD = Новый Массив;
Пакеты_XSD.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 1")); //может быть произвольной
Пакеты_XSD.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 2")); //может быть произвольной
Пакеты_XSD.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 3")); //может быть произвольной
Фабрика_XSD = СоздатьФабрикуXDTO(Схемы_XSD, Пакеты_XSD);
КонецПроцедуры
// Процедура получает фабрики XDTO из нескольких XSD
Схемы_XSD = Новый Массив;
Схемы_XSD.Добавить("D:\Example_XDTO\SсhemaXML_1.xsd");
Схемы_XSD.Добавить("D:\Example_XDTO\SсhemaXML_2.xsd");
Схемы_XSD.Добавить("D:\Example_XDTO\SсhemaXML_3.xsd");
Пакеты_XSD = Новый Массив;
Пакеты_XSD.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 1")); //может быть произвольной
Пакеты_XSD.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 2")); //может быть произвольной
Пакеты_XSD.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 3")); //может быть произвольной
Фабрика_XSD = СоздатьФабрикуXDTO(Схемы_XSD, Пакеты_XSD);
КонецПроцедуры
Создание значения XDTO в 1С 8.3:
Процедура Создание_значения_XDTO() Экспорт
// Процедура создает новое значение XDTO (немутабельное) с помощью метода Создать()
ГлобФабрикаXDTO = ФабрикаXDTO;
// Создание значения XDTO из ссылки
СправочникСсылка = Справочники.Материалы.НайтиПоНаименованию("Лапша фирменная");
ТипЗначения_XDTO = ГлобФабрикаXDTO.Тип("urn:schemas-v8-1c-ru:config-data", "CatalogRef.БлюдоНазвание");
Значение_XDTO = ГлобФабрикаXDTO.Создать(ТипЗначения_XDTO, СправочникСсылка);
// Создание значения XDTO из лексического представления
ТипЗначения_XDTO = ГлобФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime");
Значение_XDTO = ГлобФабрикаXDTO.Создать(ТипЗначения_XDTO, "2021-05-17T11:51:34");
КонецПроцедуры
// Процедура создает новое значение XDTO (немутабельное) с помощью метода Создать()
ГлобФабрикаXDTO = ФабрикаXDTO;
// Создание значения XDTO из ссылки
СправочникСсылка = Справочники.Материалы.НайтиПоНаименованию("Лапша фирменная");
ТипЗначения_XDTO = ГлобФабрикаXDTO.Тип("urn:schemas-v8-1c-ru:config-data", "CatalogRef.БлюдоНазвание");
Значение_XDTO = ГлобФабрикаXDTO.Создать(ТипЗначения_XDTO, СправочникСсылка);
// Создание значения XDTO из лексического представления
ТипЗначения_XDTO = ГлобФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime");
Значение_XDTO = ГлобФабрикаXDTO.Создать(ТипЗначения_XDTO, "2021-05-17T11:51:34");
КонецПроцедуры
Создание значения XDTO через файл XML в 1С 8.3:
Процедура Создание_значения_XDTO_файл_XML() Экспорт
// Процедура создает новое значение XDTO (немутабельное) путем чтения файла XML
ГлобФабрикаXDTO = ФабрикаXDTO;
// Чтение данных значения XDTO (из файла XML)
XML = Новый ЧтениеXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
Значение_XDTO = ГлобФабрикаXDTO. ПрочитатьXML(XML);
XML = Новый ЗаписьXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
// Запись данных XDTO в файл XML
ГлобФабрикаXDTO = ФабрикаXDTO;
ГлобФабрикаXDTO.ЗаписатьXML(XML, Значение_XDTO);
КонецПроцедуры
// Процедура создает новое значение XDTO (немутабельное) путем чтения файла XML
ГлобФабрикаXDTO = ФабрикаXDTO;
// Чтение данных значения XDTO (из файла XML)
XML = Новый ЧтениеXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
Значение_XDTO = ГлобФабрикаXDTO. ПрочитатьXML(XML);
XML = Новый ЗаписьXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
// Запись данных XDTO в файл XML
ГлобФабрикаXDTO = ФабрикаXDTO;
ГлобФабрикаXDTO.ЗаписатьXML(XML, Значение_XDTO);
КонецПроцедуры
Создание объекта XDTO в 1С 8.3:
Процедура Создание_объекта_XDTO(СправочникСсылка) Экспорт
// Процедура создает новый объект XDTO (мутабельное) с помощью метода Создать()
ГлобФабрикаXDTO = ФабрикаXDTO;
// Создание пустого объекта XDTO
ТипОбъекта_XDTO = ГлобФабрикаXDTO.Тип("http://www.koder.by/demo-material", "Материалы");
Объект_ХDTO = ГлобФабрикаXDTO.Создать(ТипОбъекта_XDTO);
// Заполнение его свойств
ОбъектСправочника = СправочникСсылка.ПолучитьОбъект();
Объект_ХDTO.Наименование = ОбъектСправочника.Наименование;
Объект_ХDTO.ПолноеНаименование = ОбъектСправочника.ПолноеНаименование;
Объект_ХDTO.ЕдиницаИзмерения = ОбъектСправочника.ЕдиницаИзмерения;
Объект_ХDTO.СтранаПроисхождения = ОбъектСправочника.СтранаПроисхождения;
Объект_ХDTO.КодТНВЭД = ОбъектСправочника.КодТНВЭД;
КонецПроцедуры
// Процедура создает новый объект XDTO (мутабельное) с помощью метода Создать()
ГлобФабрикаXDTO = ФабрикаXDTO;
// Создание пустого объекта XDTO
ТипОбъекта_XDTO = ГлобФабрикаXDTO.Тип("http://www.koder.by/demo-material", "Материалы");
Объект_ХDTO = ГлобФабрикаXDTO.Создать(ТипОбъекта_XDTO);
// Заполнение его свойств
ОбъектСправочника = СправочникСсылка.ПолучитьОбъект();
Объект_ХDTO.Наименование = ОбъектСправочника.Наименование;
Объект_ХDTO.ПолноеНаименование = ОбъектСправочника.ПолноеНаименование;
Объект_ХDTO.ЕдиницаИзмерения = ОбъектСправочника.ЕдиницаИзмерения;
Объект_ХDTO.СтранаПроисхождения = ОбъектСправочника.СтранаПроисхождения;
Объект_ХDTO.КодТНВЭД = ОбъектСправочника.КодТНВЭД;
КонецПроцедуры
Создание объекта XDTO через файл XML в 1С 8.3:
Процедура Создание_объекта_XDTO_файл_XML(Объект_ХDTO) Экспорт
// Процедура создает новый объект XDTO (мутабельное) путем чтения файла XML
ГлобФабрикаXDTO = ФабрикаXDTO;
// Чтение данных объекта XDTO (из файла XML)
XML = Новый ЧтениеXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
Объект_ХDTO = ГлобФабрикаXDTO.ПрочитатьXML(XML);
// Запись данных объекта XDTO (в файл XML)
XML = Новый ЗаписьXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
ГлобФабрикаXDTO.ЗаписатьXML(XML, Объект_ХDTO);
КонецПроцедуры
// Процедура создает новый объект XDTO (мутабельное) путем чтения файла XML
ГлобФабрикаXDTO = ФабрикаXDTO;
// Чтение данных объекта XDTO (из файла XML)
XML = Новый ЧтениеXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
Объект_ХDTO = ГлобФабрикаXDTO.ПрочитатьXML(XML);
// Запись данных объекта XDTO (в файл XML)
XML = Новый ЗаписьXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
ГлобФабрикаXDTO.ЗаписатьXML(XML, Объект_ХDTO);
КонецПроцедуры
XML сериализация XDTO в 1С 8.3:
Процедура XML_сериализация_XDTO() Экспорт
// Получение ссылки на элемент справочника Материалы
СправочникСсылка = Справочники.Материалы.НайтиПоНаименованию("Лапша фирменная");
// Создание сериализатора XDTO (для глобальной фабрики XDTO)
Сериализатор_XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
// Создание объекта записи XML
XML = Новый ЗаписьXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
// Cериализация ссылки в XML
Сериализатор_XDTO.ЗаписатьXML(XML, СправочникСсылка, НазначениеТипаXML.Явное);
КонецПроцедуры
// Получение ссылки на элемент справочника Материалы
СправочникСсылка = Справочники.Материалы.НайтиПоНаименованию("Лапша фирменная");
// Создание сериализатора XDTO (для глобальной фабрики XDTO)
Сериализатор_XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
// Создание объекта записи XML
XML = Новый ЗаписьXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
// Cериализация ссылки в XML
Сериализатор_XDTO.ЗаписатьXML(XML, СправочникСсылка, НазначениеТипаXML.Явное);
КонецПроцедуры
XML сериализация XDTO через файл XML в 1С 8.3:
Процедура XML_сериализация_XDTO_файл_XML() Экспорт
// Создание сериализатора XDTO (для глобальной фабрики XDTO)
Сериализатор_XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
// Чтение данных объекта XDTO из файла XML
XML = Новый ЧтениеXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
// Cериализация ссылки из XML
СправочникСсылка = Сериализатор_XDTO.ПрочитатьXML(XML);
КонецПроцедуры
// Создание сериализатора XDTO (для глобальной фабрики XDTO)
Сериализатор_XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
// Чтение данных объекта XDTO из файла XML
XML = Новый ЧтениеXML;
XML.ОткрытьФайл("D:/Example_XDTO/Test.xml");// обратный слэш!
// Cериализация ссылки из XML
СправочникСсылка = Сериализатор_XDTO.ПрочитатьXML(XML);
КонецПроцедуры
XML сериализация XDTO элементов прикладного объекта в 1С 8.3:
Процедура XML_сериализация_XDTO_элементов_объекта(ТаблицаДокументов)
// 1. Создаем объект XML;
XML = Новый ЧтениеXML;
// 2. Указываем путь к сохраненному файлу;
XML.ОткрытьФайл(Объект.ПутьКФайлу + "\Test.xml", "UTF-8");
// 3. Записываем объявление типа: ;
XML.ЗаписатьОбъявлениеXML();
// 4. Записываем название корневого элемента;
XML.ЗаписатьНачалоЭлемента("РеализацияТоваров");
//Для того чтобы пространства имен не объявлялись сериализатором в кажом элементе, пишем их в корневой элемент
//они будут работать на все вложеные элементы
//пространство имен по-умолчанию
XML.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config");
//пространства имен остальные префиксы
XML.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
XML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
// 5. Сериализуем именно объекты (ссылки сериализуются по другому), что "ДОСТУПНО", то и сериализуется;
Для Каждого ТекСтрока Из ТаблицаДокументов Цикл
СериализаторXDTO.ЗаписатьXML(XML, ТекСтрока.Ссылка.ПолучитьОбъект());
КонецЦикла;
// 6. Конец корневого элемента;
XML.ЗаписатьКонецЭлемента();
// 7. Обязательно закрываем запись;
XML.Закрыть();
КонецПроцедуры
// 1. Создаем объект XML;
XML = Новый ЧтениеXML;
// 2. Указываем путь к сохраненному файлу;
XML.ОткрытьФайл(Объект.ПутьКФайлу + "\Test.xml", "UTF-8");
// 3. Записываем объявление типа: ;
XML.ЗаписатьОбъявлениеXML();
// 4. Записываем название корневого элемента;
XML.ЗаписатьНачалоЭлемента("РеализацияТоваров");
//Для того чтобы пространства имен не объявлялись сериализатором в кажом элементе, пишем их в корневой элемент
//они будут работать на все вложеные элементы
//пространство имен по-умолчанию
XML.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config");
//пространства имен остальные префиксы
XML.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
XML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
// 5. Сериализуем именно объекты (ссылки сериализуются по другому), что "ДОСТУПНО", то и сериализуется;
Для Каждого ТекСтрока Из ТаблицаДокументов Цикл
СериализаторXDTO.ЗаписатьXML(XML, ТекСтрока.Ссылка.ПолучитьОбъект());
КонецЦикла;
// 6. Конец корневого элемента;
XML.ЗаписатьКонецЭлемента();
// 7. Обязательно закрываем запись;
XML.Закрыть();
КонецПроцедуры
XML Десериализация в 1С 8.3:
Процедура XML_десериализация() Экспорт
// Получение ссылки на элемент справочника Материалы
//СправочникСсылка = Справочники.Материалы.НайтиПоНаименованию("Лапша фирменная");
//Объект = СправочникСсылка.ПолучитьОбъект();
//ЗаписьJson = Новый ЗаписьJSON();
//ЗаписьJson.УстановитьСтроку();
//СериализаторXDTO.ЗаписатьJSON(ЗаписьJson, Объект, НазначениеТипаXML.Явное);
JSON = ЗаписьJson.Закрыть();
Чтение_JSON = Новый ЧтениеJSON();
Чтение_JSON.УстановитьСтроку(JSON);
ДанныеОбъект = СериализаторXDTO.ПрочитатьJSON(Чтение_JSON);
ДанныеОбъект.ОбменДанными.Загрузка = Истина;
ДанныеОбъект.Записать();
КонецПроцедуры
// Получение ссылки на элемент справочника Материалы
//СправочникСсылка = Справочники.Материалы.НайтиПоНаименованию("Лапша фирменная");
//Объект = СправочникСсылка.ПолучитьОбъект();
//ЗаписьJson = Новый ЗаписьJSON();
//ЗаписьJson.УстановитьСтроку();
//СериализаторXDTO.ЗаписатьJSON(ЗаписьJson, Объект, НазначениеТипаXML.Явное);
JSON = ЗаписьJson.Закрыть();
Чтение_JSON = Новый ЧтениеJSON();
Чтение_JSON.УстановитьСтроку(JSON);
ДанныеОбъект = СериализаторXDTO.ПрочитатьJSON(Чтение_JSON);
ДанныеОбъект.ОбменДанными.Загрузка = Истина;
ДанныеОбъект.Записать();
КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #XDTO:
📰 Актуальные новости с тегом #XDTO:
- В версии 8.3.26 реализована поддержка XDTO-пакетов в расширениях.
2
комментарии
esqado
27 апр 2022
В разделе xml десериализация описан процесс для json, но нет для xml.
esqado
27 апр 2022
Создание значения XDTO через файл XML в 1С 8.3:
В тексте, в комментарии к строке, что значит обратный слэш?
/ - это прямой
\ - это обратный
В тесте стоит прямой. Его нужно заменить на обратный или это ошибка в понятиях?
В тексте, в комментарии к строке, что значит обратный слэш?
/ - это прямой
\ - это обратный
В тесте стоит прямой. Его нужно заменить на обратный или это ошибка в понятиях?
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник