Для этого примера я бы нарисовал такую диаграмму:структурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "Номенклатура"); номенклатура = ФабрикаXDTO.Создать(структурныйТип); номенклатура.Наименование = "Ботинки женские"; номенклатура.ЗакупочнаяЦена = 1000;
Не слишком информативно. Тем не менее понятно, что на основании какого-то пространства имен и имени типа метод "Тип" создает нам необходимый "чертёж". Про пространства имен можно почитать, например, в статье "Коротко о пространствах имен (XML Namespaces)", или терзайте жужл запросом "xmlns". Вкратце же скажу, что это некая область, в которой вы можете определить свои xml-теги, и они будут означать именно то, что вы в них закладывали при определении. Например, тег <table> в пространстве имен, определяющем HTML-документ, означает описание таблицы, а в вашем собственном он может означать, например, блок описания стола. Чтобы их не путать и нужны пространства имен.Синтаксис: Тип(<URIПространстваИмен>, <Имя>) Возвращаемое значение: Тип: ТипЗначенияXDTO; ТипОбъектаXDTO; Неопределено. Описание: Получение типа XDTO.
Надеюсь, принцип понятен. Можете самостоятельно поиграться со свойствами, типами, объектами и прочим. Там есть куда "потыкать пальцем" и чего попробовать. А я тем временем продолжу.структурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products1", "Номенклатура1"); номенклатура = ФабрикаXDTO.Создать(структурныйТип); номенклатура.Наименование = "Ботинки женские"; номенклатура.ЗакупочнаяЦена = 1000; единицаТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products1", "ЕдиницаИзмерения"); единица = ФабрикаXDTO.Создать(единицаТип); единица.Наименование = "шт."; единица.Коэффициент = 1.5; номенклатура.ЕдИзм = единица;
На выходе мы получим вот такой файл:ИмяФайла = "D:\Temp\struct.xml"; МойXML = Новый ЗаписьXML; ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь); МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML); МойXML.ЗаписатьОбъявлениеXML(); ФабрикаXDTO.ЗаписатьXML(МойXML, номенклатура); МойXML.Закрыть();
Теперь вы можете послать его друзьям по электронной почте, если, конечно, их интересуют женские ботинки. =)<Номенклатура1 xmlns="http://www.1c.ru/demos/products1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Наименование>Ботинки женские<Наименование> <ЗакупочнаяЦена>1000<ЗакупочнаяЦена> <ЕдИзм> <Наименование>шт.<Наименование> <Коэффициент>1.5<Коэффициент> <ЕдИзм> <Номенклатура1>
Вы когда-нибудь разбирали xml-файлы построчно, вылавливая значки "больше"-"меньше" бесконечными "Найти" и "Сред/Лев/Прав"? А пользовались ли вы замечательным объектом "ЧтениеXML" для разбора файла по тегам, которые потом приходилось разгребать вручную в какую-нибудь структуру? Теперь, если у вас правильно описаны XDTO-пакеты и типы в них, вы можете загружать xml сразу в объект и дальше работать с ним как с объектом. На мой взгляд, это замечательно и удобно.структурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products1", "Номенклатура1"); ИмяФайла = "D:\Temp\struct.xml"; МойXML = Новый ЧтениеXML; МойXML.ОткрытьФайл(ИмяФайла); номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, структурныйТип); МойXML.Закрыть(); Сообщить(номенклатура.ЕдИзм.Наименование);
Что еще полезного можно получить из XDTO-пакетов? А вот что! Также мы можем очень просто выгружать объекты метаданных. В конфигурации есть пространство имен, в котором есть все типы XDTO присутствующих в конфигурации метаданных.Попытка номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, структурныйТип); Исключение Сообщить(ОписаниеОшибки()); // еще какая-нибудь обработка исключения Возврат; КонецПопытки;
В первой части кода, там, где мы получаем объект, ничего интересного не происходит, мы просто получаем объект (весьма коряво, надо отметить, но для примера пойдёт).// Получим объект СпрКлиенты = Справочники.Клиенты; Выборка = СпрКлиенты.Выбрать(); Пока Выборка.Следующий() Цикл КлиентОбъект = Выборка.ПолучитьОбъект(); Прервать; КонецЦикла; // Создадим ОбъектXDTO клиентыТип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Клиенты"); клиент = ФабрикаXDTO.Создать(клиентыТип); // Заполним ОбъектXDTO и сохраним его ЗаполнитьЗначенияСвойств(клиент,КлиентОбъект); ИмяФайла = "D:\Temp\сlient.xml"; МойXML = Новый ЗаписьXML; ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь); МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML); МойXML.ЗаписатьОбъявлениеXML(); ФабрикаXDTO.ЗаписатьXML(МойXML, клиент); МойXML.Закрыть();
Как видите, тут есть все реквизиты, включая стандартные ("Наименование", "Код"), а также ссылка ("Ref") и пометка на удаление ("DeletionMark").<?xml version="1.0" encoding="UTF-8" ?> <CatalogObject.Клиенты xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Ref>b0fc4df2-0a54-11e1-8797-ac728931524e</Ref> <DeletionMark>false</DeletionMark> <Code>000000001</Code> <Description>Тестовый клиент 1</Description> <ТипКлиента>непоняно</ТипКлиента> </CatalogObject.Клиенты>
можно смело заменить на:// Создадим ОбъектXDTO клиентыТип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Клиенты"); клиент = ФабрикаXDTO.Создать(клиентыТип); // Заполним ОбъектXDTO ЗаполнитьЗначенияСвойств(клиент,КлиентОбъект);
Код получился короче и работает более корректно. Например, если в справочнике "Клиенты" определены табличные части, то "ЗаполнитьЗначенияСвойств" с их заполнением не справится. А сериализатор - запросто. Теперь, когда (я надеюсь) вы понимаете основные принципы работы XDTO-пакетов, вы запросто разберетесь с тем, что еще можно делать с сериализатором. Да пребудет с вами сила синтакс-помощника. А я продолжу.// Создадим ОбъектXDTO и заполним его клиент = СериализаторXDTO.ЗаписатьXDTO(КлиентОбъект);
Теперь удалите этот пакет из конфигурации, будто его и не было.<xs:schema xmlns:tns="http://www.1c.ru/demos/products2" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.1c.ru/demos/products2" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:complexType name="КлассификаторАдреса"> <xs:sequence> <xs:element name="Город" type="xs:string"/> <xs:element name="Улица" type="xs:string"/> <xs:element name="НомерДома" type="xs:int"/> <xs:element name="НомерКвартиры" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:schema>
Здесь мы для разнообразия не стали использовать глобальный объект "ФабрикаXDTO", а создали собственный функцией "СоздатьФабрикуXDTO". Если вы посмотрите в отладчике на нашу фабрику ("МояФабрикаXDTO"), то увидите, что в коллекции пакетов у нее всего два пакета: "http://www.w3.org/2001/XMLSchema" и "http://www.1c.ru/demos/products2", в отличие от "синглтона" "ФабрикаXDTO", где их существенно больше. В качестве бонуса мы получили то, что этот код может быть полностью исполнен на клиенте, так как не зависит от метаданных конфигурации.ФайлыXSD = Новый Массив(); ФайлыXSD.Добавить("D:\Temp\adderss.xsd"); МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD); адресТип = МояФабрикаXDTO.Тип("http://www.1c.ru/demos/products2", "КлассификаторАдреса"); адрес = МояФабрикаXDTO.Создать(адресТип); адрес.Город = "Ленинград"; адрес.Улица = "3-я улица Строителей"; адрес.НомерДома = 25; адрес.НомерКвартиры = 12; ИмяФайла = "D:\Temp\address.xml"; МойXML = Новый ЗаписьXML; ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь); МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML); МойXML.ЗаписатьОбъявлениеXML(); МояФабрикаXDTO.ЗаписатьXML(МойXML, адрес); МойXML.Закрыть();
<?xml version="1.0" encoding="UTF-8" ?> <КлассификаторАдреса xmlns="http://www.1c.ru/demos/products2" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Город>Ленинград</Город> <Улица>3-я улица Строителей</Улица> <НомерДома>25</НомерДома> <НомерКвартиры>12</НомерКвартиры> </КлассификаторАдреса>
Автор: © Green FiLin
(Информация с ресурса http://blog.zfilin.org.ua)
Комментарии
Спасибо автору статьи, Green FiLin.
Очень полезная статья. Единственная статья, которая внесла ясность по ключевым вопросам, возникшим при исследовании механизма WEB сервисов.
RSS лента комментариев этой записи