В этой статье попробую рассказать о механизме XDTO, рассказать постараюсь только суть — без воды.
XDTO (XML Data Transfer Objects) — это разработка фирмы 1С и ни в каком другом языке программирования эту аббревиатуру не встретишь.
Основное назначение этого механизма — обмен данными, как с другой конфигурацией 1С, так и со сторонними приложениями. Кроме этого XDTO используется для описания параметров и возвращаемых значений web-сервисов, а также для произвольной обработки данных.
Основная «полезность» механизма XDTO заключается в том, что он позволяет работать (чтение и запись) с XML-файлом как с объектом 1С — «через точку» и не думать при этом о тегах и атрибутах XML.
Реализован механизм XDTO при помощи объекта конфигурации «Пакет XDTO». Этот объект в действительности является обычной XML-схемой (XSD) т.е. описывает структуру какого-либо XML-документа.
Средствами 1С мы можем:
- превратить XSD-файл в объект «пакет XDTO»;
- добавить новый «пакет XDTO» и редактировать его так, как нам нужно;
- превратить «пакет XDTO» в XSD-файл.
Для успешного импорта XML-схемы (XSD) в XDTO пакет, необходимо наличие в XSD-файле атрибута «targetNamespace» с указанием пространства имен, иначе импортировать схему не удастся.
Пространство имен обычно указывается URL-подобной строкой (хотя на самом деле это может быть любая строка) и служит для того, чтобы избежать путаницы в том случае, если в разных XDTO пакетах у нас имеются объекты с одинаковым названием.
Таким образом понятно, что названия объектов должны быть уникальны в пределах одного пространства имен (по сути в пределах одного XDTO пакета)
XSD-файл можно сделать самому — написать руками в блокноте или сделать XDTO пакет прямо в конфигураторе, кроме этого можно воспользоваться какой-нибудь специализированной программой (например Liquid XML Studio) или онлайн сервисом (Google в помощь) которые умеют создавать XSD-файлы из XML. При использовании программ и сервисов нужно быть осторожным, так как по моему опыту результат их работы (XSD-файл) очень часто не подходит для использования в 1С — неправильно указываются типы данных и, как следствие, записать XML-файл при помощи такого XDTO пакета не удастся. В качестве примера приведу два XDTO пакета для одного и того же XML-файла.
Слева тот, что создан руками, справа — программой.
Работа с XDTO в 1С неразрывно связана с объектом «ФабрикаXDTO». Именно этот объект читает и записывает данные из/в XML-файл(а), а также создает все нужные объекты с которыми можно привычно работать «через точку».
Перейдем к практике.
Допустим у нас есть файл заказ вот такого вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0" encoding="UTF-8"?> <Заказ xmlns="http://1c-programmer-blog.ru/test" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Номер="2"> <АдресДоставки> <Страна>Россия</Страна> <Город>Москва</Город> <Улица>Кремлевская</Улица> <Дом>1</Дом> </АдресДоставки> <Товары> <Товар> <Название>Тетрадь</Название> <Количество>3</Количество> <Цена>200</Цена> </Товар> <Товар> <Название>Блокнот</Название> <Количество>5</Количество> <Цена>150</Цена> </Товар> </Товары> </Заказ> |
XSD-файл примера:
Схема в виде пакета XDTO была показа выше.
Чтение 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 | &НаКлиенте Процедура ЧтениеXML(Команда) тДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); тДиалог.Фильтр = "XML файлы (*.xml)|*.xml"; Если тДиалог.Выбрать() Тогда ЧтениеXMLНаСервере(тДиалог.ПолноеИмяФайла); КонецЕсли; КонецПроцедуры &НаСервере Процедура ЧтениеXMLНаСервере(ИмяФайла) ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); тОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип("http://1c-programmer-blog.ru/test", "Заказ")); Сообщить("Номер заказа: "+тОбъектXDTO.Номер); Сообщить("Адрес доставки: "+тОбъектXDTO.АдресДоставки.Страна+", "+тОбъектXDTO.АдресДоставки.Город+", "+тОбъектXDTO.АдресДоставки.Улица+", "+тОбъектXDTO.АдресДоставки.Дом); Если ТипЗнч(тОбъектXDTO.Товары.Товар) = Тип("СписокXDTO") Тогда Для тСчет = 0 По тОбъектXDTO.Товары.Товар.Количество()-1 Цикл тТовар = тОбъектXDTO.Товары.Товар.Получить(тСчет); Сообщить("Товар: "+тТовар.Название+"; Кол-во: "+тТовар.Количество+"; Цена: "+тТовар.Цена); КонецЦикла; Иначе Сообщить("Товар: "+тОбъектXDTO.Товары.Товар.Название+"; Кол-во: "+тОбъектXDTO.Товары.Товар.Количество+"; Цена: "+тОбъектXDTO.Товары.Товар.Цена); КонецЕсли; КонецПроцедуры |
«ФабрикаXDTO» при помощи XDTO пакета превращает XML-файла в обычный 1С объект.
Теперь запишем свой XML-файл:
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 31 32 33 34 35 36 37 38 39 40 41 42 43 | &НаКлиенте Процедура ЗаписьВXML(Команда) ЗаписьВXMLНаСервере(); КонецПроцедуры &НаСервере Функция ЗаписьВXMLНаСервере() тОбъектXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://1c-programmer-blog.ru/test", "Заказ")); тОбъектXDTO.Номер = 2; тАдрес = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://1c-programmer-blog.ru/test", "АдресДоставки")); тАдрес.Страна = "Россия"; тАдрес.Город = "Москва"; тАдрес.Улица = "Кремлевская"; тАдрес.Дом = 1; тОбъектXDTO.АдресДоставки = тАдрес; тТовары = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://1c-programmer-blog.ru/test", "Товары")); тТовар = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://1c-programmer-blog.ru/test", "Товар")); тТовар.Название = "Тетрадь"; тТовар.Количество = 3; тТовар.Цена = 200; тТовары.Товар.Добавить(тТовар); тТовар = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://1c-programmer-blog.ru/test", "Товар")); тТовар.Название = "Блокнот"; тТовар.Количество = 5; тТовар.Цена = 150; тТовары.Товар.Добавить(тТовар); тОбъектXDTO.Товары = тТовары; ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл("C:\order.xml"); ЗаписьXML.ЗаписатьОбъявлениеXML(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, тОбъектXDTO, "Заказ"); ЗаписьXML.Закрыть(); КонецФункции |
В коде выше, мы получаем все необходимые типы данных, создаем из них объекты, затем заполняем эти объекты нужными данными и записываем все это в XML-файл.
Естественно, данная статья не претендует на звание всеобъемлющего руководства по XDTO. Этого всего лишь небольшой обзор основных возможностей механизма XDTO и я с благодарностью приму все возможные замечания и дополнения.
В следующий статье я постараюсь рассказать о том, что такое XDTO-сериализация в 1С.
А если схема похожа на как Рис. 3, Тест1 возможно ли прочитать значение объекта Товар — хотя он является Тип — СписокXDTO?
В моем случае:
<phone_number phone_type="1" 9858887888
4954300179
Спасибо за статью! Очень помогла разобраться в вопросе.
Но остался вопрос:
В тексте (например реквизите наименование), есть кавычки «, если не менять в XML пишет тупо их.
Если программно заменить ", то после замены при записи XML xdto меняет " на " — это нормально? не могу найти как лечится.
искорявило «& amp;quot;»
Хочу лишь выразить благодарность автору статьи. Очень понятно объясняет сложные вещи.
Добрый день, поясните пожалуйста:
XSD-файл вашего примера при загрузке создает XDTO пакет (левый на вашем примере).
К примеру выгрузка конфигурации — формирует XSD-файл такой же структурой (без вложений определений типов друг в друга).
Проблема в том, что по такому XSD-файлу:
тТовары = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://1c-programmer-blog.ru/test», «Товары»));
тТовар = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://1c-programmer-blog.ru/test», «Товар»));
создает объект XDTO, после чего:
тТовары.Товар.Добавить(тТовар);
выдает ошибку.
Схема в виде пакета XDTO была показа выше.
показа азаза
Доброго времени суток!
У меня при создании xml файла через XDTO в итоговом файле отсутствуют символы переноса строки. Т.е. весь файл получается в одну строку, если открыть его в notepad++
Может кто сталкивался с такой бедой?
Всё верно. Это файл для передачи, а не для чтения.
Чем меньше в нём быссмысленых значений — тем лучше.
Снижается объём файла — увеличивается скорость передачи и увеличивается шанс успешной доставки.
Спасибо Вам добрый человек, с Вашей помощью я сделал, то что хотел