XDTO - часть 3

15.08.19

Разработка - Механизмы платформы 1С

Мы продолжаем цикл статей по изучению подсистемы XDTO в 1С:Предприятие. Это третья часть, в которой мы будем работать непосредственно с подсистемой, рассмотрим главные строительные блоки подсистемы и рассмотрим небольшой пример кода.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Выгрузка модели данных
.epf 6,80Kb
559
559 Скачать (3 SM) Купить за 2 450 руб.
Учебный пример к циклу статей "XDTO - это просто"
.dt 35,44Kb
44
44 Скачать (8 SM) Купить за 3 950 руб.

XDTO - это просто, часть 3

 

Краткое содержание предыдущих серий

Первый две статьи были посвящены обзорной экскурсии по XDTO, введению в схемы XML, базовым операциям по импорту их в конфигурацию.

Собственно, статьи:

  1. Первая серия
  2. Вторая серия

При написании данной статьи, я столкнулся с небольшой дилеммой. Я планировал описать устройство объектов и их взаимодействие с теоретической точки зрения. Но в комментариях мне обоснованно пояснили, что лучшее объяснение - это пример. Языки программирования начинают учить с "hello world" и уже потом лезут в теоретические дебри. Я с этим согласен. Когда нет конкретного примера, который можно пощупать, то вникать в кучу слов неинтересно, да и трудно. Я попробую совместить в статье кусок теории, но подкрепить его небольшим примером кода, показывающим описанные в статье моменты. Возможно, получится сумбурно, т.к. я пока не до конца понимаю структуру будущей статьи.

И все-таки, начнем не с кода, а опять, с описания компонентов подсистемы XDTO.

Компоненты подсистемы XDTO

Нам не повезло с документированием подсистемы. Совершенно непонятно - откуда у нее растут ноги и с чего начинать работу с ней. Давайте попробуем разобраться.

Как я уже говорил ранее, в основе всего лежит модель данных - перечень прикладных типов, которыми мы будем оперировать при работе с XDTO. Каждый объект XDTO создается фабрикой, которая умеет создавать объекты тех типов, которые содержатся в модели данных фабрики. Итак, есть четко выделенные понятия - модель данных, фабрика, объект. Что в начале - курица или яйцо?

Пакет XDTO

Самый "первичный" объект во всей подсистеме, это пакет XDTO. Именно от него, растут все связи. С него и начнем. Почему он? Потому, что модель данных - это ни что иное, как массив пакетов XDTO. А модель, как я уже говорил - это наше все.

Что такое пакет и что такое ветка ПакетыXDTO

Все наверняка видели в дереве конфигурации ветку ПакетыXDTO. Что это и зачем оно нужно? Оказывается, оно в-общем-то и не нужно :) Использовать XDTO можно и без описания пакетов в этой ветке. Наличие пакетов, зашитых в конфигурацию совсем не обязательно. Ветка эта нужна для совсем определенного круга прикладных задач. По большому счету - вспомогательное средство работы с XDTO.

Теперь, еще раз основной тезис:

Фабрика может создавать объекты только тех типов, которые входят в модель данных этой фабрики.

Каждая конфигурация уже содержит заботливо созданную платформой фабрику, которая умеет создавать все объекты, описанные в модели данных текущей конфигурации. Какие это объекты? Это все те, которые прошиты в платформе (о них потом) и те, которые создал разработчик конфигурации (XDTO-прообразы всех справочников, документов, перечислений и т.п.).

Данная автоматически созданная фабрика, доступна в коде, как глобальная переменная с именем ФабрикаXDTO.

Все пакеты, перечисленные в ветке "ПакетыXDTO" включаются в модель данных конфигурации. Это значит, что глобальная фабрика конфигурации может создавать объекты тех типов, которые описаны в данных пакетах. Например, это позволяет использовать наши собственные объекты совместно с платформенными - можно включать наши объекты в стандартные "СпискиЗначений" и "ТаблицыЗначений".

Устройство пакета

Рассмотрим пакет поближе: пакет представляет собой логически цельный набор типов. У этого набора типов обязательно есть пространство имен, позволяющее уникально идентифицировать пакет. Если вернуться к схемам XML, то пакет - это схема. С рядом допущений, конечно, но тем не менее, ближайший "не 1С-овский" аналог пакета - это схема XML.

Пакет включает в себя описания типов бизнес-объектов, которыми мы собираемся оперировать. Типы бывают простые и составные, об этом мы уже говорили ранее. Кроме того, пакет содержит вспомогательные средства трансляции имен переменных с языка XML на язык 1С:Предприятия и обратно (см. статью 2).

При разработке пакетов я не пользуюсь стандартным редактором, поэтому, наверное, не буду его описывать. Во-первых, боюсь чего-то напутать, во-вторых, он на 90% дублирует понятия из собственно схем XML. Если вы знаете, как в принципе сделать схему (например в Liquid), то работа со стандартным редактором, скорее всего, не вызовет сложных вопросов.

Что более важно, так это то, какие понятия пакет XDTO привносит в обиход программиста, использующего XDTO. Понятия следующие:

  1. ТипЗначенияXDTO
  2. ТипОбъектаXDTO
  3. ЗначениеXDTO
  4. ОбъектXDTO
  5. СписокXDTO

Мы говорили о том, что типы бывают простыми и составными. Так вот, простой тип, это ТипЗначенияXDTO, а ЗначениеXDTO, это, собственно, значение этого простого типа. Как тип и экземпляр типа. Тип значения - "Число", экземпляр типа - "5". Тип значения - "Строка", экземпляр типа - "Привет". С объектом XDTO все то же самое, но применительно к составному типу.

Со списком сложнее. Если какому-либо свойству в том или ином типе задана верхняя граница, отличная от единицы, то это значит, что данное свойство может повторяться в объекте несколько раз. Таким образом, СписокXDTO представляет собой способ манипулирования множеством объектов заданного типа.

Если мы посмотрим в стандартный редактор пакетов, то увидим строгое разделение на "Типы значений" и "Типы объектов".

Встраивание пакетов в конфигурацию

Проще всего, при использовании собственных бизнес-объектов XDTO встраивать свои пакеты в конфигурацию. Это позволит не заморачиваться с созданием собственной фабрики.

Сразу скажу, что создание собственной фабрики, это очень просто, но описывать этот процесс - долго. В результате, описание и рассусоливание теории выглядит в три раза страшнее, чем собственно, создание новой фабрики. Поэтому, создание фабрик отложим на потом, а сейчас, будем пользоваться стандартной фабрикой.

Процесс встраивания пакета описывался в предыдущей статье. Сейчас, хочется закрепить следующий момент: в глобальном контексте есть переменная с именем ФабрикаXDTO и типом ФабрикаXDTO. Эта фабрика - автоматически создается платформой и включает в себя все типы самой платформы, плюс типы прикладных объектов конфигурации, плюс те пакеты, которые добавлены в ветку "ПакетыXDTO" дерева метаданных. Эта фабрика ничем особенным не отличается, при желании вы всегда можете создать такую же вручную.

Масло масляное

Здесь, на мой взгляд, следует отметить, что подобная конструкция, очень неудачный ход со стороны разработчиков платформы. Скорее всего, преследовалась цель сделать XDTO более удобным (автоматически создать все нужные объекты), но получилось на мой взгляд, мешанина из непонятных (и к тому же одинаковых) названий.

Мне кажется, ошибкой было создавать глобальную переменную. Глобальные переменные это почти всегда плохо. Кроме того, она носит название, совпадающее с ее типом. Вроде все нормально, но в голове каша.

Я очень не люблю, когда имена переменных совпадают с их типами. Звучит ужасно:

ТаблицаЗначений = Новый ТаблицаЗначений;
Массив = Новый Массив;

То же получилось и с фабрикой. Это такой объект, который нужен, мягко говоря, не каждую секунду работы программы. Люди годами пишут под 1С, даже не касаясь каких-то там фабрик. Зачем нужна семантика постоянно висящей переменной непонятно. Лучше и правильнее было бы, на мой взгляд создать метод, что-то вроде "ПолучитьФабрикуXDTOТекущейКонфигурации()". В результате имеется четкое понимание, что мы хотим использовать конкретную системную фабрику, но имя переменной, с которой мы будем работать мы придумаем сами. Да, тип этой переменной будет ФабрикаXDTO.

В результате, документация моментально становится проще, за счет исчезновения фраз "Глобальный объект "ФабрикаXDTO" с типом "ФабрикаXDTO"".

Что-то мы отвлеклись.... Имеем то, что имеем, а именно - глобальный объект, фабрику, которая умеет создавать объекты наших собственных типов. Поехали дальше!

Сериализация XDTO

Вот то, что призвано сделать нашу жизнь лучше, но, иногда, делает ее сложнее. Сериализация и десериализация, это сама цель создания вообще всей этой замороки с XDTO. Ведь что мы хотим делать? Мы хотим передавать объекты куда-либо и получать их обратно. Все объекты в конечном итоге превращаются в XML. Получается, что все, что нам нужно - это автоматическая запись некоторого бизнес-объекта в XML и чтение его обратно. Вот здесь, на этом самом месте, нужно провести жирную красную линию и разделить два отдельных механизма. Первый - это создание объектов XDTO и их сериализацию в/из XML. Второй - получение из XDTO объектов прикладного языка: строк, ссылок, дат и т.п.
Итак, жирная красная линия:

 

Механизм Что делает Название операции
ФабрикаXDTO Создает объекты XDTO и записывает их в XML. Читает XML и создает из него ОбъектыXDTO. XML-сериализация
СериализаторXDTO Читает ОбъектыXDTO и превращает их в объекты встроенного языка 1С. Выполняет обратную операцию преобразования объекта встроенного языка в ОбъектXDTO. XDTO-сериализация

 

Приведенной табличкой хотелось донести одну очень важную мысль: ФабрикаXDTO ничего не знает о метаданных конфигурации, и вообще о конфигурации. Для нее нет ни ссылок, ни таблиц значений, ничего, связанного с прикладными типами среды исполнения 1С. Фабрика оперирует только XML-типами. Эти типы похожи на "родные" и их легко спутать, т.к. они описывают те же самые объекты, но в терминах XML. Тем не менее, важно понимать, что это именно разные объекты. XML-документ, содержащий таблицу значений и универсальная коллекция ТаблицаЗначений - это разные вещи. Фабрика знает только про XML.

Сериализатор XDTO - это как раз связующее звено между средой исполнения языка и фабрикой. Он знает, как прочитать узлы XML (свойства объекта XDTO) и как их интерпретировать, превращая XML в объект среды исполнения.

Конечно, такое вот кричащее разделение с красными линиями, это немного лукавство. Один механизм не имеет смысла без другого, они тесно переплетены. Тем не менее, обратите внимание на колонку "Что делает". Разница в действиях принципиальна. Платформа же, пытается скрыть от нас, неразумных, данную принципиальность и автоматически выполняет XDTO-сериализацию тех типов, которые она умеет преобразовывать из языка в XDTO и обратно. Например, платформа знает, как превратить тип XDTO xs:string в Тип("Строка"), а xs:dateTime в Тип("Дата"). Платформа также знает, как превратить тип "{http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Сотрудники" в Тип("СправочникСсылка.Сотрудники"), при условии, что в конфигурации есть такой справочник.

Автоматическое преобразование возможно только для типов-значений. Иными словами, платформа автоматически выполняет XDTO-сериализацию простых типов, когда мы работаем с объектом XDTO. Рассмотрим пример:

 

Пусть есть пакет XDTO, в котором есть тип "КарточкаСотрудника". Этот тип имеет свойства:

  • Сотрудник ({http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Сотрудники)
  • ЛичныйНомер (xs:string)

Все свойства типа КарточкаСотрудника являются простыми, с точки зрения платформы. Поэтому, работая с объектом XDTO мы можем присваивать им значения напрямую из языка:

// Создаем новый объект XDTO с типом "{urn:my-namespace}КарточкаСотрудника".
xdtoКарточка = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("urn:my-namespace","КарточкаСотрудника"));

// простое присваивание, на самом деле, "за кулисами" выполняет превращение объекта языка 1С с типом "СправочникСсылка.Сотрудники" в объект XDTO с типом "{http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Сотрудники".
xdtoКарточка.Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию("Иванов");

// Объект с типом "Строка" автоматически превращается в ЗначениеXDTO с типом "xs:string"
xdtoКарточка.ЛичныйНомер = "12345";

Для объектных типов все немного сложнее. Там нельзя присвоить объект языка напрямую в объект XDTO. Для такого превращения нужен Сериализатор. По сути - сериализатор - это алгоритм, который сможет превратить один объект в другой. Для платформенных объектов этим занимается глобальный СериализаторXDTO. Для наших собственных - такой алгоритм мы должны написать сами. Чудес не бывает. Если надо передать куда-то XML-документ определенного формата, то наполнять его данными мы будем самостоятельно, свойство за свойством, вручную.

Поскольку, автоматическая сериализация для типов-объектов не выполняется, то обращение "через точку" даст нам ОбъектXDTO, а не готовое значение платформы.

Чистый XDTO без сериализации

Если мы хотим получить из объекта xdtoКарточка само ЗначениеXDTO личного номера, а не значение, сериализованное в готовую "строку 1С", то необходимо вызвать метод "ПолучитьXDTO". В этом случае, будет возвращен запрошенный объект.

xdtoЗначение = xdtoКарточка.ПолучитьXDTO("ЛичныйНомер");
Сообщить(xdtoЗначение.Тип()); // Выведет имя типа XDTO, с пространством имен и всеми делами.

Список XDTO

Помимо классов ЗначениеXDTO и ОбъектXDTO существует также СписокXDTO. Список позволяет оперировать коллекциями из объектов первых двух классов.
Список получается, когда для какого-либо свойства объекта установлена верхняя граница, отличная от нуля. Число показывает максимально возможное количество элементов списка. Если граница равна -1, то количество не ограничено.
Списки тоже пытаются упрощать жизнь посредством автоматической XDTO-сериализации значений. Это очень хорошо, но надо знать, в каком случае она выполняется, а в каком - нет.
Во-первых, в синтакс-помощнике не написано, что список можно обходить с помощью итератора Для Каждого Из... На самом деле, это работает. При обходе через итератор, либо через метод СписокXDTO.Получить(Номер), получаемое значение будет сериализованным. Т.е. для списка ссылок будут получаться уже готовые ссылки 1С, а не объекты XDTO.
У списка есть также метод ПолучитьXDTO, который позволяет обойти список, получая сами значения XDTO, без выполнения сериализации.

ФабрикаXDTO

Класс ФабрикаXDTO представляет собой единственное средство превращения файлов XML в ОбъектыXDTO и обратно. При этом, фабрика следит за тем, чтобы создаваемые объекты строго соответствовали заявленной модели данных (схеме XML). Если мы попытаемся наполнить ОбъектXDTO чем-то не соответствующим схеме, то произойдет исключение времени выполнения.

Давайте взглянем на фабрику поближе:

Свойство "Пакеты"

В начале статьи мы говорили, что модель данных - это массив пакетов XDTO. А фабрика представляет собой "пользователя" модели. Поэтому, свойство "Пакеты" - это массив пакетов, которые составляют модель данных фабрики.

Обращение к коллекции пакетов возможно либо по числовому индексу, либо по URI пакета. Разумеется, возможен перебор с помощью Для Каждого Из...

Метод Тип()

Метод получает на вход полное имя типа (URI пакета + Имя типа в пакете) и возвращает объект ТипЗначенияXDTO или ТипОбъектаXDTO, для типов-значений и типов-объектов соответственно. Эти объекты сродни классу "Метаданные" в языке Предприятия. С их помощью можно узнать метаданные типа XDTO. Длину, маску, "списковость", перечень свойств и т.п.

Метод Создать()

Основной и любимый метод. Позволяет фабрике оправдывать свое название. Конструирует объект XDTO того типа, который ему передали.

Методы ЗаписатьXML()/ПрочитатьXML()

Позволяют отправить ОбъектXDTO в поток XML, и соответственно, прочитать поток XML и создать на его основании ОбъектXDTO. Методы чтения/записи имеют несколько особенностей.

Чтение XML

Как и в любом другом случае работы с XML, у нас всегда есть некоторый источник XML. Это может быть текстовый источник, документ DOM или поток FastInfoset. Что приятно, источник неважен, они взаимозаменяемы. Чтобы создать объект XDTO нужно спозиционировать источник XML на начало узла, который является объектом и вызвать метод ФабрикаXDTO.ПрочитатьXML().

И вот здесь, кстати, зарыта небольшая собачка. Пример:

// Переменная ЧтениеXML - некий источник XML

ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

Перед Вами - самый простой способ считывания объекта. Объект гарантированно считывается и возвращается в виде ОбъектаXDTO. Проблема в том, что если в файле прямо не указан тип объекта с помощью атрибута "xsi:type" (~90% случаев), то объект получит тип anyType(). Свойства этого объекты будут нетипизованы, получить внятные метаданные объекта будет проблемно (хотя и можно). Тем не менее, мы получим полноценный объект XDTO. Если нам не нужно сильно "копаться" в нем, а например, просто передать еще куда-то, то лучше способа не найти. Не надо ни пакетов, ни схем, вообще ничего. Читаем XML, получаем Объект.

Но, как правило, нам, все-таки, нужно, чтобы объект был вполне определенного типа, чтобы знать, что от него ожидать (например, смело обращаться к свойству "ЛичныйНомер", зная, что в объекте оно есть).

Для этого в методе ФабрикаXDTO.ПрочитатьXML есть второй параметр - тип объекта. В этом случае, при чтении, Фабрика проверит, что поток XML соответствует схеме данных и создаст новый объект, если XML корректен. В противном случае, создание не выполнится. Соответствие проверяется по всей строгости валидации схем XML. Если, скажем, длина какого-то реквизита не совпадает с требуемой, будет ошибка чтения.

После чтения, Фабрика передвигает позицию в потоке XML дальше, на следующий за объектом узел.

ЗаписьXML

Запись выполняется несложно:

ФабрикаXDTO.ЗаписатьXML(ПотокЗаписи, ОбъектXDTO);
 

Вот тут тоже есть пара нюансов. Во-первых, объект XDTO при записи в XML должен быть размещен в каком-то узле. По умолчанию, объект помещается в узел, с именем, соответствующем имени типа. Например, объект типа "Message" помещается в узел элемента "Message". Имя узла можно поменять, с помощью параметров "ЛокальноеИмя" и "URI" метода ЗаписатьXML().

Во-вторых, в разделе "чтение" я говорил, что в XML может быть записан специальный атрибут "xsi:type". В этом случае, тип объекта будет явно указан в XML и при чтении платформа сможет создать объект нужного типа, а не anyType. Для того, чтобы в файле было явно указано - к какому типу принадлежит объект - нужно задать последний параметр "УказаниеТипа" метода записи. Если тип не задать, то ничего страшного не будет. Корректно прочитать объект мы можем, указав ожидаемый тип в методе "ПрочитатьXML" (см. выше).

Собственная фабрика и модель данных XDTO

Чтобы фабрика могла работать, ей нужна модель данных. Модель данных позволяет фабрике создавать объекты. Не забываем, что модель данных, это просто массив пакетов.

Как и любой другой объект языка 1С, фабрика создается вызовом конструктора с помощью оператора "Новый ФабрикаXDTO". Закавыка заключается в передаче правильных параметров конструктору.

Конструкторы

Конструкторов два. Оба сводятся к тому, что фабрике нужен массив пакетов, чтобы у нее была модель данных. Если мы посмотрим в синтакс-помощник на конструктор объекта ФабрикаXDTO, то мы увидим вариант "На основании модели типов". Там же читаем: "Модель представляется в виде объекта XDTO, имеющего тип XDTO {http://v8.1c.ru/8.1/xdto}:Model".

Первое впечатление от прочитанного - "что-что-что? какой-какой матери?" Но если разобраться, все не так страшно. Нам говорят о том, что нужно создать объект XDTO с типом Model, объявленным в пространстве имен http://v8.1c.ru/8.1/xdto. Получается, чтобы создать свою фабрику, я должен создать ОбъектXDTO, описывающий модель данных, а потом этот объект "скормить" конструктору "Новый ФабрикаXDTO()".

Ну хорошо, создавать объект нужного типа мы умеем:

Модель = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/xdto","Model"));

А дальше-то что делать? Не знаю, как вы, а я в документации ответ на этот вопрос не нашел. Зато, я нашел, как выгрузить из конфигурации массив пакетов в виде готовой модели. Этим-то мы и займемся.

Забегая вперед скажу, что этот объект Model просто описывает все то, что вы видите в Конфигураторе, когда создаете пакеты XDTO. Объект Model содержит перечень пакетов package, каждый пакет имеет перечень типов-значений, типов-объектов, словом все, что Вы видите в боковой панели "Свойства" конфигуратора - все отражается в этом объекте Model.

У ФабрикиXDTO есть замечательные методы "ЭкспортМоделиXDTO()" и "ЭкспортСхемыXML()". Методы замечательны тем, что возвращают готовые объекты, которые можно "скормить" конструкторам Фабрики.

Выгрузка модели данных

К статье приложена внешняя обработка "ВыгрузкаПроизвольнойМоделиДанных". Данная обработка показывает все-все пакеты XDTO, которые содержатся в стандартной глобальной фабрике. Можно увидеть там ряд интересных вещей. Например, пакеты управляемого приложения http://v8.1c.ru/8.2/managed-application/logform, и даже http://v8.1c.ru/8.2/managed-application/modules. В управляемом режиме платформа ведет обмен клиент-сервер с помощью механизма XDTO. Поэтому, все служебные типы, нужные для обмена, в фабрике представлены. Не спрашивайте только, что они делают - понятия не имею :). Давайте рассмотрим ее устройство.

1. Перечень пакетов

// Получаем список, в котором отметим флажками пакеты, которые нам нужны.
Для Каждого Пакет Из ФабрикаXDTO.Пакеты Цикл
   
ВыгружаемыеПакеты.Добавить(Пакет.URIПространстваИмен);
КонецЦикла;

2. Выгрузка нужных пакетов в файл

// Формируем массив URI пакетов, отмеченных в списке
ВыбранныеПакеты = Новый Массив;
Для Каждого
ЭлементСписка Из ВыгружаемыеПакеты Цикл
    Если
ЭлементСписка.Пометка Тогда
       
ВыбранныеПакеты.Добавить(ЭлементСписка.Значение);
    КонецЕсли;
КонецЦикла;


// По массиву URI создаем объект {http://v8.1c.ru/8.1/xdto}:Model
Объект = ФабрикаXDTO.ЭкспортМоделиXDTO(ВыбранныеПакеты);

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла);

// Запись с явным указанием необязательных параметров.
ФабрикаXDTO.ЗаписатьXML(Запись,Объект,"Model","http://v8.1c.ru/8.1/xdto",,НазначениеТипаXML.Явное);

Запись.Закрыть();

Теперь, у нас есть модель данных, а значит, мы можем создать собственную фабрику:

 

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);

// Внимание. Второй параметр - ТипXDTO не указываем, т.к. перед этим явно записали его в файл. Все же рекомендуется ВСЕГДА указывать второй параметр, чтобы избежать некорректной трактовки XML файла. Нельзя гарантировать, что внутри файла тип указан.

ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);

А теперь все то же самое, но проще.

Как легко и просто создать свою фабрику XDTO не прибегая к созданию Model? Можно воспользоваться вторым конструктором и создать фабрику на основе схемы XML. Второй конструктор фабрики хочет получить НаборСхемXML на входе. Сделаем ему этот набор:

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);

ПостроительDOM = Новый ПостроительDOM;
Документ = ПостроительDOM.Прочитать(Чтение);
ПостроительСхем = Новый ПостроительСхемXML;

Схема = ПостроительСхем.СоздатьСхемуXML(Документ.ЭлементДокумента);

НаборСхем = Новый НаборСхемXML;
НаборСхем.Добавить(Схема);
Фабрика = Новый ФабрикаXDTO(НаборСхем);

От автора

Я все-таки предпочитаю первый способ, т.к. он более родной и дает более гибкое управление создаваемой фабрикой. Вспоминаем отличия Схем XML от Пакетов (статья №2). Кроме того, мне кажется, что первый способ должен работать немножко, но быстрее, т.к. нет промежуточных преобразований из текста XML в модель через DOM и построитель схем. Специально быстродействие не замерял, так что могу и ошибаться.

Создавая собственные фабрики XDTO, делаю так:

  1. Создаю в Liquid нужные схемы
  2. Загружаю их в пустую конфигурацию-болванку
  3. Выгружаю пакеты приведенной выше обработкой
  4. Полученные файлы кладу в макет обработки, которой требуется создавать фабрику
  5. При выполнении обработки создаю схему:

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ПолучитьМакет("Модель").ПолучитьТекст());
ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);

 

Кстати, конфигурацию-болванку можно заменить кодом из второго способа создания фабрики.

  1. Создаем фабрику вторым конструктором (на основании НабораСхемXML)

  2. Из этой фабрики выгружаем Model методом ЭкспортМоделиXDTO().

  3. Получаем Model, для сохранения в макете и использования в боевом режиме.

Обещанный пример кода

К статье прилагается пример конфигурации, демонстрирующий все, что было описано в предыдущих (и текущей) статьях. Основные моменты расписаны в комментариях к коду.

Конфигурация представляет собой гипотетический пример обмена данными по зарплате сотрудников. В конфигурации демонстрируются способы применения всех упомянутых аспектов XDTO. Обратите внимание, что в коде идет обращение к объектам XDTO по русскоязычным именам. В файл же попадают англоязычные узлы XML. Это как раз демонстрирует возможность разного представления в XML виде и в XDTO виде.

Учебный пример поставляется за символическую цену. Стоимость в 2-3 раза ниже 1 часа работы специалиста по 1С. Информация, которую можно почерпнуть из примера является в каком-то роде уникальной, ее больше нет нигде в Сети. Сэкономленное время на изучение XDTO стоит намного больше.

Заключение

На данный момент, мне кажется, что ключевые моменты механизма XDTO рассмотрены. Все, что осталось - это уже более сложные вещи, которые лучше разбирать на конкретных примерах. Задавайте вопросы с примерами в любом удобном виде (комментариях, личной почте), попробую ответить.

Спасибо за интерес к моим статьям.

 

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7400    bayselonarrend    19    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5934    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17607    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11206    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23744    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18804    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14721    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. irishka77 28.01.13 15:23 Сейчас в теме
Спасибо!
abasovit; Vadim_80; pawellkrv; +3 Ответить
2. Yashazz 4790 28.01.13 16:49 Сейчас в теме
Вот за "Эта фабрика ничем особенным не отличается, при желании вы всегда можете создать такую же вручную." уже можно запросто минуснуть. Между синглтоном и объектом, созданным через конструктор, есть существеннейшая разница. Автор, поправь, я верю, что ты просто неудачно выразился и эту разницу знаешь.
3. Evil Beaver 8243 28.01.13 17:09 Сейчас в теме
(2) Yashazz, ну и какая разница с точки зрения использования одной и другой фабрик?
Да, стандартная - это синглтон. Но мы можем сделать еще одну, по составу пакетов (а значит и функционалу) идентичную. Не понял суть претензии, поэтому не понял, как надо перефразировать.
Если разница между глобальной фабрикой и такой же, но созданной через конструктор (с точки зрения чтения/записи XDTO) есть - просьба озвучить, наверное, я ее не знаю.

upd: поправка. Глобальная переменная ФабрикаXDTO - это нифига не синглтон. Синглтон, это класс, у которого может быть только один экземпляр. Из википедии:
"синглтон гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа."

Так вот, фабрик в системе может быть сколько угодно много, а не одна. Просто одна из фабрик создана платформой автоматически.
Artem-B; SagittariusA; user774630; Vladimir Litvinenko; адуырщдв; +5 Ответить
17. Yashazz 4790 29.01.13 22:24 Сейчас в теме
(3) Насчёт синглтона - вопрос терминологии, что есть "создаваемое", и что есть предзаданное, но я не об этом. Насколько помню, типы, определённые в глобальной фабрике, могут расширяться засчёт создания пакетов XDTO, а при программном создании типы определяются прямо при создании и расширяться "после" уже не могут. Я верно помню?
19. Evil Beaver 8243 30.01.13 09:32 Сейчас в теме
(17) Yashazz, ну в целом все верно. Только в стандартной фабрике типы тоже не могут расширяться после создания фабрики. Она создается при старте Предприятия и содержит, как я писал - платформенные пакеты, плюс пакеты из ветки ПакетыXDTO в метаданных. После создания глобальной Фабрики (запуска в режиме 1С:Предприятия) поменять состав типов нельзя.
4. kasper076 110 29.01.13 09:45 Сейчас в теме
Зачем нужно делать так:

ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);

Почему нельзя сделать просто:

НоваяФабрикаXDTO = СоздатьФабрикуXDTO(ИмяФайла);
6. Evil Beaver 8243 29.01.13 10:20 Сейчас в теме
(4) kasper076, Так делать можно, если схемы находятся в файлах. Если схемы лежат в макете, то так не получится. И потом, я просто забыл про этот метод. Спасибо, что напомнили :)
5. maxis33 45 29.01.13 10:09 Сейчас в теме
Спасибо за труды, очень поучительно!
7. kasper076 110 29.01.13 10:46 Сейчас в теме
ИмяФайла = ПолучитьИмяВременногоФайла("xsd");
Макет = ПолучитьМакет("Макет");
Макет.Записать(ИмяФайла);

Фабрика = СоздатьФабрикуXDTO(ИмяФайла);
Merkalov; Tash.B; +2 Ответить
8. Evil Beaver 8243 29.01.13 11:14 Сейчас в теме
(7) kasper076, Ну да, разумеется. Только это уже не будет макет, а будет файл :) И тут надо сделать еще удаление файла, предусмотрев возможные Попытки-Исключения и т.п. А реальных преимуществ, которые можно пощупать можно сказать и нет. Тем не менее, когда есть xml-схема в файле (а не в макете), то ваш способ с глобальным методом, несомненно, лучше всего. Опять же, при создании из xml-схемы нельзя настроить отображение имен XML в имена переменных языка 1С.
9. kasper076 110 29.01.13 11:57 Сейчас в теме
Можно ли программно создать/изменить ФабрикуXDTO?
10. Evil Beaver 8243 29.01.13 12:07 Сейчас в теме
(9) kasper076, извините, не понял... А разве приведенным Вами же пример не отвечает на этот вопрос?
11. siwa99 4 29.01.13 12:11 Сейчас в теме
Спасибо за статью.Все разъяснено на доступном языке. Понятно,что тема раскрыта, но хотелось бы продолжения.
12. kasper076 110 29.01.13 12:16 Сейчас в теме
Я отвлекся чуток и не успел нормально сформулировать. Не ФабрикуXDTO, а модель данных (схему XML)? Но создать ее не путем создания XML-файла, а как если бы мы создавали ДеревоЗначений, например. Что-то типа .Колонки.Дабавить("НоваяКолонка", ТипКолонки)
13. Evil Beaver 8243 29.01.13 13:43 Сейчас в теме
модель данных - можно. Это объект XDTO с типом Model (точное URI пространства имен дано в статье). Поскольку, это объект XDTO, то его можно заполнить штатным образом. У него есть коллекция пакетов (свойство package), у пакетов перечень типов-значений и типов-объектов. Словом, программная модель того, что Вы можете сделать в конфигураторе - это класс Model.
14. kasper076 110 29.01.13 15:56 Сейчас в теме
А новый ТипXDTO создать, а затем ОбъектXDTO с этим типом?
15. Evil Beaver 8243 29.01.13 18:07 Сейчас в теме
(14) kasper076, Какую задачу Вы хотите решить? Что должно быть в результате?
16. Sasha255n 29.01.13 21:20 Сейчас в теме
18. Sergey03 30.01.13 07:57 Сейчас в теме
Спасибо, нужная статья.
20. dk666dk 32 30.01.13 09:46 Сейчас в теме
Добрый день, хотел бы спросить что я делаю не так: создал по коду из стать фабрикуXDTO затем попытался записать туда справочник.номенклатуру таким образом:

рез = Запрос.Выполнить().Выгрузить();

Тип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config","CatalogRef.Номенклатура");

Для каждого стр из рез Цикл
сс = ФабрикаXDTO.Создать(Тип,(стр.ссылка));
НоваяФабрикаXDTO.ЗаписатьXML(ЗаписьXML,сс);
КонецЦикла;

Выдает следующее сообщение:
{Форма.Форма.Форма(216)}: Ошибка при вызове метода контекста (ЗаписатьXML)
НоваяФабрикаXDTO.ЗаписатьXML(ЗаписьXML,сс);
по причине:
Несоответствие типов XDTO:
Тип '{http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Номенклатура' не найден
Тип принадлежит пакету, отсутствующему в фабрике типов XDTO
21. Evil Beaver 8243 30.01.13 10:24 Сейчас в теме
(20) dk666dk, Вы создаете тип одной фабрикой, а пишете - другой. Зачем Вам несколько фабрик? Пользуйтесь какой-то одной.
22. AlexBar 51 30.01.13 10:36 Сейчас в теме
Автору респект за статью. Есть вопрос. Возможно ли с помощью инструментов XDTO решить следующую задачу:
Преобразуем ДокументОбъект в XML:
		
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписатьXML(ЗаписьXML, ДокументОбъект, НазначениеТипаXML.Явное);
XMLТекстОбъекта = ЗаписьXML.Закрыть();


Обратное преобразование можно выполнить следующим образом:
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(XMLТекстОбъекта);
ДокументОбъект = ПрочитатьXML(ЧтениеXML);


Если в конфигурации нет никаких изменений, то данные процедуры работают без проблем и исключительно быстро.
Однако стоит только в объекте метаданных изменить последовательность реквизитов, удалить или добавить какой-нибудь реквизит, все, записанная ранее XML версия документа больше не прочитается.
Приходится парсить XML объекта чтобы получить его данные.
Возможно ли решить данный вопрос с помощью инструментов XDTO?
Например создаем из объекта метаданных объект XDTO 1, из XML старого объекта создаем объект XDTO 2, заполняем значения свойств из XDTO 2 в XDTO 1, преобразуем объект XDTO 1 в объект информационной базы.
Я понимаю что представление описываю скорее всего не верно, но важна сама суть.
Спасибо.
poiskadm; +1 Ответить
23. Evil Beaver 8243 30.01.13 10:55 Сейчас в теме
(22) AlexBar, Ну если я правильно понял, то у Вас будут 2 варианта объекта в виде XML, и Вы предполагаете переносить между ними свойства явно "Объект1.Наименование = Объект2.Наименование"? Если так, то все будет работать.
27. AlexBar 51 30.01.13 12:41 Сейчас в теме
(23)
А сработает ли конструкция ЗаполнитьЗначенияСвойств(ОбъектXDTO1, ОбъектXDTO2)? Потому-что перебирать все реквизиты не есть айс...
24. dk666dk 32 30.01.13 11:24 Сейчас в теме
ага спс, ток все равно не пойму как объекты записать. Более конкретно стоит задача: есть ТаблицаЗначений из Полей СправочникСсылка.Номенклатура и Количество вот не могу никак загнать это в XML. буду благодарен за кусочек кода :)
25. Evil Beaver 8243 30.01.13 11:41 Сейчас в теме
(24) dk666dk,
// Запись
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ВашаТаблицаЗначений);

// Чтение
ВашаТаблицаЗначений = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ТаблицаЗначений"));



С вас вобла под пивасик :)
user591389_aska_rabota; +1 Ответить
81. ZLENKO 398 05.09.13 16:02 Сейчас в теме
(25) Как же мне этого не хватало в 1С 8.1:
// Запись
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ВашаТаблицаЗначений);

// Чтение
ВашаТаблицаЗначений = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("ТаблицаЗначений"));
26. dk666dk 32 30.01.13 11:59 Сейчас в теме
премного благодарен, если с оренбурга, то не вопрос :)
28. Evil Beaver 8243 30.01.13 12:50 Сейчас в теме
Не уверен, что во всех случаях поможет. Надо экспериментировать.
Перебрать реквизиты можно через метаданные типа XDTO. Т.е. получить тип объекта, а у ТипаОбъектаXDTO есть коллекция Свойства.
29. AlexBar 51 30.01.13 13:12 Сейчас в теме
(28)
Пытаюсь получить ОбъектXDTO
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(XMLТекстОбъекта);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);


Получаю такую же ошибку, как если бы я прочитал XML
ДокументОбъект = ПрочитатьXML(ЧтениеXML);
30. Evil Beaver 8243 30.01.13 13:46 Сейчас в теме
(29) AlexBar, разумеется. Глобальный метод "ПрочитатьXML" - это просто обертка над стандартной фабрикой. Структура "старого" объекта у Вас неизвестна, ее надо где-то "надыбать", создать на ее основе фабрику и интерпретировать старые и новые структуры вручную.
31. Evil Beaver 8243 30.01.13 13:50 Сейчас в теме
Вернее, в (30) я был не прав. Покажите, что содержится у вас в переменной XMLТекстОбъекта?
Если там не указан атрибут xsi:type, то чтение через ФабрикаXDTO.ПрочитатьXML() должно возвращать объект XDTO без выдачи ошибок. Если же там тип указан, то читать нужно явно передавая второй параметр для ФабрикаXDTO.ПрочитатьXML(), а в нем указывать тип "старой" структуры.
32. AlexBar 51 30.01.13 14:47 Сейчас в теме
(31)
Прикладываю файл объекта из УПП.
Прикрепленные файлы:
XML.txt
33. Evil Beaver 8243 30.01.13 15:25 Сейчас в теме
(32) AlexBar, смотрите: в файле явно указан тип - xsi:type="DocumentObject.РеализацияТоваровУслуг". Если вы будете читать такой файл без указания второго параметра метода ФабрикаXDTO.ПрочитатьXML(), то структура файла должна в точности совпадать со структурой документа "РеализацияТоваровУслуг". Если файл у Вас в старой структуре, а в базе уже новая, то Вам понадобится пакет XDTO, в котором прописана структура старого документа. Либо, Вы можете удалить данный атрибут и прочитать файл, как anyType (без данного атрибута и без 2-го параметра метода ФабрикаXDTO.ПрочитатьXML()). Перечитайте еще раз статью № 3.
34. AlexBar 51 30.01.13 15:33 Сейчас в теме
(33)
>Если вы будете читать такой файл без указания второго параметра метода ФабрикаXDTO.ПрочитатьXML()
Из справки: Тип: ТипЗначенияXDTO; ТипОбъектаXDTO
Я имею прикладной тип: Тип("ДокументОбъект.ИмяОбъекта"), в нашем случае: Тип("ДокументОбъект.РеализацияТоваровУслуг"), как из него получить ТипЗначенияXDTO или ТипОбъектаXDTO?
>Вы можете удалить данный атрибут
Это значит что нужно снова парсить текст. Суть вопроса и заключается в том: можно ли найти метод, позволяющий избежать сложного разбора текста старого объекта?
Огромное спасибо за то, что уделяете мне свое время!
35. Evil Beaver 8243 30.01.13 15:53 Сейчас в теме
(34) AlexBar, копайте синтакс-помощник в сторону СериализаторXDTO.XMLТипЗнч(). Парсить текст лучше всего документом DOM. Создаете, удаляете атрибут, получаете ЧтениеУзловDOM и это "Чтение" скармливаете фабрике.

Я бы делал так:

1. Читал заведомо старый XML построителем DOM
2. Удалял атрибут типа
3. Читал фабрикой нетипизованный объект anyType
5. Перебирал свойства этого объекта и писал в новый формат.
61. xzorkiix 35 25.04.13 14:47 Сейчас в теме
(35)

1. Читал заведомо старый XML построителем DOM


Простите, а это как?

Тут с веб-сервисом работаю через HttpСоединение, чтобы ответ сериализовать фабрикой успешно нужно немного подправить полученный ответ сервиса.
170. xCyrix 22.12.18 23:19 Сейчас в теме
Здравствуйте!
Помогите пожалуйста разобраться.

есть схема sxd (cheki.xsd)
есть файл xml (purchases.xml) который нужно прочитать по схеме cheki.xsd

читаю:

ТипФайлов = "purchases";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\purchases.xml");

ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить("c:\cheki.xsd");
ЗагрузкаФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);


ТипЧеки = ЗагрузкаФабрикаXDTO.Тип("http://www.crystals.ru", ТипФайлов);
Чеки = ЗагрузкаФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипЧеки);

СписокЧеков = Чеки.purchase;
Индекс = 0;
Чек = СписокЧеков.Получить(Индекс);

ЧтениеXML.Закрыть();

СвойствоПозицияЧека = Чек.positions.Свойства().Получить("position");
ПозицииЧека = Чек.positions.ПолучитьСписок(СвойствоПозицияЧека);

СвойствоОплатаЧека = Чек.payments.Свойства().Получить("payment");
ОплатыЧека = Чек.payments.ПолучитьСписок(СвойствоОплатаЧека);




и в крайней строке ОплатыЧека = Чек.payments.ПолучитьСписок(СвойствоОплатаЧека); получаю ошибку:

{ВнешняяОбработка.ЧтениеXML.Форма.Форма.Форма(32)}: Ошибка при вызове метода контекста (ПолучитьСписок)
ОплатыЧека = Чек.payments.ПолучитьСписок(СвойствоОплатаЧека);
по причине:
Несоответствие свойства и элемента данных XDTO:
Свойство: 'payment'
Свойство не является списковым

значит position у него является списковым, а payment вдруг перестал быть списковым!!! это как так???
36. AlexBar 51 30.01.13 17:52 Сейчас в теме
Вывод: от парсинга и перебора свойств (реквизитов) не уйти.
Тогда в свете моего вопроса XDTO ничем не облегчит решение вопроса.
37. пользователь 30.01.13 19:02
Сообщение было скрыто модератором.
...
38. пользователь 30.01.13 19:02
Сообщение было скрыто модератором.
...
39. пользователь 30.01.13 19:02
Сообщение было скрыто модератором.
...
40. пользователь 30.01.13 19:02
Сообщение было скрыто модератором.
...
41. пользователь 30.01.13 19:02
Сообщение было скрыто модератором.
...
42. kiruha 388 01.02.13 10:08 Сейчас в теме
Спасибо за публикацию, очень подробно описано создание, но непонятно про чтение

Обхожу ОбъектModel . Получил дочерний ОбъектXDTO. Сериализуемый
У соответствующего объекта 1С есть свойство "Имя"
У ОбъектXDTO - свойство name. Получил.

Как программно узнать , что name это "Имя" ?

Только методом тыка на совпадение значения свойства или есть "нормальный" способ?
43. kiruha 388 01.02.13 10:18 Сейчас в теме
И непонятно с anyType
>>Для этого в методе ФабрикаXDTO.ПрочитатьXML есть второй параметр - тип объекта.

Делаю по совету
Например сохраняю схему компоновки с параметром НазначениеТипаXML.Явное
Тут же пытаюсь ее прочитать с параметром
ТипСхемы = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data-composition-system/schema", "DataCompositionSchema");
ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипСхемы);

и вываливается ошибка на несоответствие схемы
Без явного указания типа все нормально считывается, но полно anyType для объектов, про которые известно что они сериализуемы
44. Evil Beaver 8243 01.02.13 11:03 Сейчас в теме
(43) kiruha, кусок кода записи и точный текст ошибки можете дать?
45. kiruha 388 01.02.13 12:51 Сейчас в теме
задумался,переделал
ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ПервыйПараметр,ТипСхемы);

ПервыйПараметр - было ЧтениеУзловDom(разрешается по синтаксису) переписал код, чтобы было ЧтениеXML
Хм - и чудо - ошибка исчезла, anyType исчезли )
спасибо )

а вот как мне сопоставить свойства, например
У СхемаКомпоновкиДанных есть свойство ВычисляемыеПоля
У соотв объектаXDTO DataCompositionSchema есть свойство calculatedField
не сложно убедиться что они соотв друг другу
А как определить это программно ?
Может есть справочник соответствий или метод ?
46. kasper076 110 01.02.13 13:51 Сейчас в теме
(45) Может чтонить типа XMLТипЗнч() ?
47. Evil Beaver 8243 01.02.13 14:04 Сейчас в теме
(45) kiruha,
ПервыйПараметр - было ЧтениеУзловDom(разрешается по синтаксису) переписал код, чтобы было ЧтениеXML
Хм - и чудо - ошибка исчезла, anyType исчезли.


Странно, так не должно быть. Дайте кусок кода. Если это и правда так, то это ошибка платформы. Объекты чтения XML должны быть полностью взаимозаменяемы и не должны приводить к разному поведению.

У СхемаКомпоновкиДанных есть свойство ВычисляемыеПоля
У соотв объектаXDTO DataCompositionSchema есть свойство calculatedField


Какую задачу Вы решаете? Объекты системы компоновки все полностью поддерживаются платформой. calculatedField в "ВычисляемоеПоле" лекго превращается глобальным СериализаторомXDTO. Где-то выше в комментариях мой ответ насчет ТаблицыЗначений. С вычисляемым полем то же самое. Как правило, "сопоставить" свойства XDTO и прикладного объекта может только Сериализатор.
49. kiruha 388 01.02.13 15:22 Сейчас в теме
(47)
Какую задачу Вы решаете? Объекты системы компоновки все полностью поддерживаются платформой. calculatedField в "ВычисляемоеПоле" лекго превращается глобальным СериализаторомXDTO.


Видимо я недостаточно понятный пример привел

есть объект XDTO DataCompositionSchema - сериализируется СхемаКомпоновкиДанных
у него набор свойств, например dataSet(P.S>свойства начинаются с маленько буквы,типы с большой ) - список XDTO
элемент списка - DataSetUnion(и др) сериализируется (имена свойств и типов в общем похожи , но не совпадают)

Оба объекта прекрасно сериализируются, но
модель языка
СхемаКомпоновкиДанных - св-во НаборыДанных - НаборДанныхОбъединениеКомпоновкиДанных
модель XDTO
DataCompositionSchema - св-во dataSet - DataSetUnion

Можно по DataCompositionSchema получить СхемаКомпоновкиДанных , по DataSetUnion получить НаборДанныхОбъединениеКомпоновкиДанных, а вот как получить соответствие названий свойств
св-во dataSet - св-во НаборыДанных
//P.S>
Чтобы не СКД - др пример -
Если у объекта есть несколько реквизитов с типом номенклатура, то в модели XDTO я могу получить элемент объекта,подчинен элемент номенклатуры, но не могу понять к какому реквизиту объекта отнести этот элемент
50. Evil Beaver 8243 01.02.13 16:13 Сейчас в теме
(49) kiruha, Сопоставить автоматом - никак. Но у меня вопрос - а зачем это вообще нужно? Для чего их вдруг надо вообще куда-то сопоставлять? Какая задача решается?

(48) kasper076, аналогично - никак. Автоматом не получится. О соответствии знает только алгоритм сериализации. Платформенных объектов - платформенный сериализатор, о ваших объектах - только вы.
И опять же: а зачем это?
62. xzorkiix 35 25.04.13 16:55 Сейчас в теме
(47)

Странно, так не должно быть. Дайте кусок кода. Если это и правда так, то это ошибка платформы. Объекты чтения XML должны быть полностью взаимозаменяемы и не должны приводить к разному поведению.


Наткнулся на те же грабли ЧтениеУзловDOM заменил на ЧтениеXML. Ошибка ушла. (1С:Предприятие 8.2 (8.2.18.61))

Функция ПолучитьОбъектФабрикиИзXML(Фабрика, ТипXDTO, Источник) Экспорт
	
	Перем Результат, Путь;
	
	//
	// Текст Источника, например
	//
	//	<?xml version='1.0' encoding='UTF-8'?>
	//	<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
	//		<soapenv:Body>
	//			<tns:Y_MM_SRV_WSI_GET_SRV_LINE_LISTResponse xmlns:tns="urn:sap-com:document:sap:rfc:functions">
	//			<!-- содержание ответа сервиса -->
	//			</tns:Y_MM_SRV_WSI_GET_SRV_LINE_LISTResponse>
	//		</soapenv:Body>
	//	</soapenv:Envelope>
	//
	//	для успешной конвертации в Объект XDTO через Фабрику - файл должен быть
	//
	//	<?xml version='1.0' encoding='UTF-8'?>
	//	<Y_MM_SRV_WSI_GET_SRV_LINE_LISTResponse xmlns="urn:sap-com:document:sap:rfc:functions">
	//		<!-- содержание ответа сервиса -->
	//	</Y_MM_SRV_WSI_GET_SRV_LINE_LISTResponse>
	//
		
	Если ТипЗнч(ТипXDTO) = Тип("Строка") Тогда
		ТипXDTO = ПолучитьТипXDTO(Фабрика,,ТипXDTO);
	КонецЕсли;
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(Источник);
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
	ЧтениеXML.Закрыть();
	
	СписокЭлементовDOM = ДокументDOM.ПолучитьЭлементыПоИмени(ТипXDTO.URIПространстваИмен, ТипXDTO.Имя);
	Если СписокЭлементовDOM.Количество() Тогда
		
		Если СписокЭлементовDOM[0].ЕстьДочерниеУзлы() Тогда
			
			ДокDOM = Новый ДокументDOM(ТипXDTO.URIПространстваИмен, ТипXDTO.Имя);
			
			Для Каждого ЭлементXDTO Из СписокЭлементовDOM[0].ДочерниеУзлы Цикл				
				ДокDOM.ЭлементДокумента.ДобавитьДочерний(ЭлементXDTO.КлонироватьУзел(Истина));			    				
			КонецЦикла;
			
			Путь = ПолучитьИмяВременногоФайла("xml");			
									
	    	ЗаписьXML = Новый ЗаписьXML;
			ЗаписьXML.ОткрытьФайл(Путь);
			ЗаписьDOM = Новый ЗаписьDOM; 	
	    	ЗаписьDOM.Записать(ДокDOM,ЗаписьXML);
			ЗаписьXML.Закрыть();
			
		КонецЕсли;
		
		// Здесь падает в ошибку
		//
		// ЧтениеУзловDOM = Новый ЧтениеУзловDOM;
		// ЧтениеУзловDOM.Открыть(ДокDOM);
		//		
		// Результат = Фабрика.ПрочитатьXML(ЧтениеУзловDOM,ТипXDTO);
		//
		
		ЧтениеXML.ОткрытьФайл(Путь);
		Результат = Фабрика.ПрочитатьXML(ЧтениеXML,ТипXDTO);
		
	КонецЕсли;
	
	Возврат Результат;
		
КонецФункции
Показать
48. kasper076 110 01.02.13 14:18 Сейчас в теме
Evil Beaver, а если как в случае у AlexBar схема источник не соответствует схеме приемнику. Как при обходе свойств СхемыКомпоновкиДанных сопоставить им свойства из ОбъектModel?
51. kiruha 388 01.02.13 17:19 Сейчас в теме
Но у меня вопрос - а зачем это вообще нужно?

для универсальных обработок
Самый простой пример - получить свойства справочника(имеется ввиду объект платформы СправочникСсылка, а не реквизиты объекта конфигурации) программно (это задача в примитивной трактовке)
XDTO их показывает, но в специфической форме

Ладно, все понял.
Спасибо за помощь.
52. Evil Beaver 8243 01.02.13 17:44 Сейчас в теме
(51) kiruha, Вам виднее, но мне кажется, что это неправильный подход к механизму. Он изначально не подразумевает автоматических сопоставлений объектам языка. Это просто более удобный доступ к XML.
53. kiruha 388 01.02.13 23:54 Сейчас в теме
Возможно не подразумевал. Но они сделали обмен схемами СКД на XML, сериализовали множество объектов не имеющих отношение к обмену, а 8.3 выгрузку форм в XML. Некая тенденция очевидна
Возможно ошибаюсь - спорить не буду , т.к. не по теме публикации
54. Evil Beaver 8243 02.02.13 10:07 Сейчас в теме
Да понятно, что тенденция есть. Но принцип такой, что объекты-объектами, но сериализацию выполняет некий алгоритм, который знает, как объект интерпретировать. Отсюда опять же мой вопрос - зачем для платформенных пакетов XDTO нужно делать то, что уже и так есть? Чего не хватает?
57. PrinzOfMunchen 84 17.03.13 21:11 Сейчас в теме
(54) огромное спасибо за данную "трилогию" статей!
А будет ли продолжение? Например про применение преобразований xml - xslt? Очень красивая и мощная вещь всё таки))
55. scanner1980 268 11.02.13 06:26 Сейчас в теме
Здравствуйте.

Есть импортированный пакет в 1С из внешнего файла (от поставщика) примерно следующего содержания:

Пакет
Свойства
Свойство1
Свойство2

Файл xml на выходе должен быть:

<?xml version="1.0" encoding="windows-1251"?>
<Свойство1>
<Свойство2>Какой-то текст</Свойство2>
</Свойство1>

никак не пойму как сделать свойства на выходе вложенными (если это вообще возможно)?
56. Stamper 43 27.02.13 16:17 Сейчас в теме
занимались реализацией SOAP сервиса для связи с мобильными платформами. так вот основной трафик (так уж вышло) давали наименования полей! и это не удивительно: передаём-то XML, и наименование каждого узла повторяется. так что делайте наименования полей покороче =)
58. Yuriy.MW 27 18.03.13 13:12 Сейчас в теме
Спасибо за статью.
Может подскажите маленький вопросик.
В базе1 есть пакет XDTO: URI http://www.bla.bla и типом Taxes
И есть веб-сервис.
Веб сервис возвращает значение

	РезXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.bla.bla", "Taxes"));
	//заполнение свойств
	Возврат РезXDTO;


XDTO вручную выгружен в D:\Taxes.xsd.

В базе2:

//Прокси = Новый WSПрокси(...
Рез = Прокси.GetTaxes();

ФайлыXSD = Новый Массив(); 
ФайлыXSD.Добавить("D:\Taxes.xsd"); 
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
			
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("D:\tx.xml");
			МояФабрикаXDTO.ЗаписатьXML(Запись,Рез,"Taxes","http://www.bla.bla",,НазначениеТипаXML.Явное); //тут ошибка
Запись.Закрыть();
Показать


При записи возникает ошибка: Несоответствие типов XDTO:
Тип '{http://www.bla.bla}Taxes' не найден
Тип принадлежит пакету, отсутствующему в фабрике типов XDTO

Хотя, в тоже время без проблем создается объект:
РезТест = МояФабрикаXDTO.Создать(МояФабрикаXDTO.Тип("http://www.bla.bla", "Taxes"));

И если в табло выполнить Рез.Тип() то URI и имя совпадают с ожидаемыми.
В чем ошибка?
59. Evil Beaver 8243 18.03.13 13:36 Сейчас в теме
Попробуйте записать не через
МояФабрикаXDTO.ЗаписатьXML
, а через
WSПрокси.ФабрикаXDTO
60. kembrik 10 28.03.13 14:59 Сейчас в теме
Попробовал Ваш метод созданий собственных фабрик (с моделью в Макете), споткнулся, не посмотрите причину?

Один из пакетов в макете:

<package targetNamespace="http://Vorobiev_s/current-config">
		<property name="CatalogObject_Номенклатура" localName="CatalogObject.Номенклатура">
			<typeDef xsi:type="ObjectType">
				<property name="IsFolder" type="xs:string" lowerBound="0" localName="ЭтоГруппа"/>
				<property name="Ref" type="xs:string" lowerBound="0" localName="Ссылка"/>
				<property name="DeletionMark" type="xs:string" lowerBound="0" localName="ПометкаУдаления"/>
				<property name="Parent" type="xs:string" lowerBound="0" localName="Родитель"/>
				<property name="Code" type="xs:string" lowerBound="0" localName="Код"/>
				<property name="Description" type="xs:string" lowerBound="0" localName="Наименование"/>
				<property name="Артикул" type="xs:string" lowerBound="0"/>
				<property name="НаименованиеПолное" type="xs:string" lowerBound="0"/>
				<property name="БазоваяЕдиницаИзмерения" type="xs:string" lowerBound="0"/>
				<property name="НомерГТД" type="xs:string" lowerBound="0"/>
			</typeDef>
		</property>
		<property name="NewDataSet">
			<typeDef xsi:type="ObjectType" ordered="false" sequenced="true">
				<property xmlns:d5p1="http://Vorobiev_s/current-config" ref="d5p1:CatalogObject_Номенклатура" lowerBound="0" upperBound="-1"/>
			</typeDef>
		</property>
	</package>
Показать


Потом пробуем создать NewDataSet и спотыкаемся

ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ПолучитьМакет("Модель").ПолучитьТекст());
	ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
	НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);
	
	Для Каждого Пакет из НоваяФабрикаXDTO.Пакеты Цикл
		Если Пакет.URIПространстваИмен = "http://Vorobiev_s/current-config" Тогда
			
			СписокНоменклатуры = НоваяФабрикаXDTO.Создать(Пакет.URIПространстваИмен,"NewDataSet"); 
Показать


Несоответствие типов XDTO:
Тип '{http://Vorobiev_s/current-config}NewDataSet' не найден
Тип не определен


Где я напортачил :)? В отладчике в КорневыеСвойства "NewDataSet" присутствует, явно обращаюсь я к нему неправильно, какой будет синтаксис обращения в этом случае?
63. xzorkiix 35 25.04.13 17:05 Сейчас в теме
(60) kembrik, если конечно ещё актуально.

Для Каждого Пакет из НоваяФабрикаXDTO.Пакеты Цикл
    Если Пакет.URIПространстваИмен = "http://Vorobiev_s/current-config" Тогда
        СписокНоменклатуры = НоваяФабрикаXDTO.Создать(Пакет.URIПространстваИмен,"NewDataSet");


заменить последнее на

ТипXDTO = Пакет.Получить("NewDataSet");
Если ТипЗнч(ТипXDTO) <> Неопределено Тогда
    СписокНоменклатуры = НоваяФабрикаXDTO.Создать(ТипXDTO);
КонецЕсли;
64. kembrik 10 25.04.13 18:02 Сейчас в теме
(63) xzorkiix, Спасибо, уже разобрался совместно с автором статей, у меня пакет кривой был, починили - взлетело ))
65. Alex_1066 03.08.13 12:34 Сейчас в теме
Evil Beaver, вопрос: Есть пакет XDTO, в котором есть элемент, имеющий тип "Список" (т.е., в данном примере, имеющий значения 0...-1). При попытке обращения к такому объекту программно возникает непонятная ситуация. Если в списке имеется один элемент, то он имеет тип "ОбъектXDTO", если два и более, то "СписокXDTO"... я уж не говорю про то, если этого элемента просто не будет (список может быть и нулевым). Т.е., что я хочу сказать - невозможно обратиться к данному списку через механизм коллекции "Для каждого..", например. Получается, что необходимо для каждого списка выяснять, сколько же он там в этот раз содержит элементов и следовательно, считает ли система это вообще списком? Так что ли? Т.е., без вот такой структуры
Если ТипЗнч(НашДокумент.ЭлементСписка) = Тип("СписокXDTO") Тогда ...
не обойтись, что ли?
buy_sale; +1 Ответить
66. Evil Beaver 8243 04.08.13 23:14 Сейчас в теме
Список, если заявлен в схеме, как список, то всегда является списком. У вас где-то ошибка. Приведите код считывания XML из файла и преобразования в XDTO
67. Alex_1066 05.08.13 13:30 Сейчас в теме
Вот код:
	ТипОбъектаВыписка = ФабрикаXDTO.Тип("http:\\www.avent.com\BPSBclient\", "BPSBclient");
	
	ИмяФайла = "e:\МояБаза\Vip.xml";
	МойXML = Новый ЧтениеXML;
	МойXML.ОткрытьФайл(ИмяФайла);

	Попытка
		Выписка = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипОбъектаВыписка);
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	МойXML.Закрыть();
	
	Если ТипЗнч(Выписка.Statement.CreditDocuments.Document) = Тип("СписокXDTO") Тогда
		
		Для каждого Документ из Выписка.Statement.CreditDocuments.Document Цикл
			Сообщить(Документ.Payer.Name);
		КонецЦикла;	
   ИначеЕсли ТипЗнч(Выписка.Statement.CreditDocuments.Document) = Тип("ОбъектXDTO") Тогда
		Документ =  Выписка.Statement.CreditDocuments.Document;
		Сообщить(Документ.Payer.Name);
	КонецЕсли;	
Показать

При просмотре в отладчике, "Document" (настроен как список в XDTO пакете)принимает различные типы, поэтому предпринята попытка анализа данного факта.. Что здесь не так и как обойтись без анализа каждого такого списка? Ведь по идее система должна понимать определённые типы значений однозначно...
68. Evil Beaver 8243 05.08.13 16:38 Сейчас в теме
(67) Alex_1066, чтение выполняется с указанием типа, значит должна понимать настройку схемы, т.е. видеть, что это всегда список. Странно, вроде все верно. А схему дадите (прикрепленным файлом)?
69. Alex_1066 05.08.13 17:11 Сейчас в теме
Да, конечно, вот и он...
Прикрепленные файлы:
BPSB3.xsd
70. Evil Beaver 8243 05.08.13 17:48 Сейчас в теме
(69) Alex_1066, я вроде не вижу ошибок в схеме и в коде. Досконально можно сказать, только колупаясь в отладчике. Но это уж сами. Скорее всего, мы что-то упускаем из вида. Списковые свойства при чтении, если указан считываемый тип должны считываться правильно. Если ничего не получится сделать - создайте простой пример воспроизведения и отправьте в 1С на testplatform@1c.ru (адрес точно не помню, как то так звучит).

Хотя... стоп-стоп.
А что за тип такой: ФабрикаXDTO.Тип("http:\\www.avent.com\BPSBclient\", "BPSBclient")?
В схеме нету такого типа.
71. Alex_1066 06.08.13 09:58 Сейчас в теме
(70) спасибо за помощь, но... после полученных замечаний и очередной попытки пришёл в полное уныние... Наверное я чего-то глобально всё-таки не понял. Если в предыдущем примере была явная ошибка в указании типа, но, тем не менее, объект создавался каким-то образом??? После же указания типа стало вываливать сообщение "Ошибка при вызове метода контекста (ПрочитатьXML):Ошибка преобразования данных XDTO...", причём, если считываешь файл такого плана
<?xml version="1.0" encoding="UTF-8"?>
<Контрагент xmlns="http:\\www.avent.com\" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Account>12312312312</Account>
...
</Контрагент>
, то система создаёт объект нормально, т.к. наверное видит пространство имён, а если вот такой

<?xml version="1.0" encoding="UTF-8"?>
<Контрагент>
<Account>3012052670019</Account>
...
</Контрагент>
,
то уже ни в какую.. Но в чём тогда у меня путаница... Я так понимаю, что механизм позволяет обрабатывать любые XML при наличии к нему схемы XML.
72. Evil Beaver 8243 06.08.13 10:21 Сейчас в теме
(71) Alex_1066, что такое схема XML? Это однозначное описание того, что может быть в документе. Очень строгое и дотошное описание. В первом случае система видит, что Контрагент принадлежит пространству имен. А во втором - это неизвестно какой контрагент. Пространства нет, мало ли "контрагентов" на свете.

Файл не читается, выдается ошибка потому, что ваш файл не соответствует схеме. Это не "тот" файл который система хочет, вот и все. Зачем вам второй вариант текста? Это лажа, пользуйтесь первым.
73. Alex_1066 07.08.13 14:31 Сейчас в теме
(72)Спасибо, Evil Beaver. Теперь понятно, где собака порылась :)
74. Evil Beaver 8243 07.08.13 15:21 Сейчас в теме
(73) Alex_1066, спасибо не булькает (народная мудрость), а так - пожалуйста :)
75. НебаЖитель 16.08.13 12:48 Сейчас в теме
Может кто подсказать по теме? Уже много времени потратил, а так и не разобрался( http://forum.infostart.ru/forum26/topic91743/
76. Evil Beaver 8243 16.08.13 12:53 Сейчас в теме
(75) НебаЖитель, ответил в той ветке.
77. Алексей777 100 20.08.13 12:27 Сейчас в теме
Спасибо за статьи! Все очень доступно, понятно и легко.
78. ВладАн 27.08.13 14:29 Сейчас в теме
Evil Beaver, я надеюсь на Вас)) подскажите пожалуйста по теме http://forum.infostart.ru/forum26/topic92232/

ПС: ну или кто-то другой может подсказать?
79. Evil Beaver 8243 27.08.13 14:43 Сейчас в теме
(78) ВладАн, увы, не подскажу.
80. ВладАн 27.08.13 14:53 Сейчас в теме
(79) Спасибо, что посмотрели.
82. inv7 8 14.11.13 13:58 Сейчас в теме
Evil Beaver, подскажите, пожалуйста:

по команде
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML,root);
в файле xml формируется запись:
<root xmlns="out" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="59">
а контрагент хочет получить без описания схемы в виде
<root ID="59">
Не могу этого добиться. Как это сделать при помощи ФабрикаXDTO, или использовать простую запись XML?
83. inv7 8 14.11.13 14:02 Сейчас в теме
в предыдущем сообщении оформление съело текст

Evil Beaver, подскажите, пожалуйста:

по команде
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML,root);
в файле xml формируется запись:
<root xmlns="мПродажи" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="59">
а контрагент хочет получить без описания схемы только в виде
<root ID="59">
Не могу этого добиться. Как это сделать при помощи ФабрикаXDTO, или использовать простую запись XML?
84. inv7 8 14.11.13 14:08 Сейчас в теме
есть
<element xmlns="out" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="59">
надо
<element ID="59">
85. inv7 8 14.11.13 14:10 Сейчас в теме
есть
<root xmlns="out" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="59"> 

надо
<root ID="59"> 
86. Evil Beaver 8243 14.11.13 15:40 Сейчас в теме
(85) inv7, XDTO, насколько я знаю, всегда будет писать объявления схем. Если не нужны, пишите ручками.
Ну и еще мысль, записывайте поток XDTO не в ЗаписьXML, а в ЗаписьУзловDOM, потом из DOM выбросьте все, что вам не нужно и запишите DOM уже в XML.
87. inv7 8 14.11.13 16:34 Сейчас в теме
(86) спасибо за ответ. очень надеялся, что я чего-то недопонимаю. придется писать ручками. идею с DOM попробую, если интересно, отпишу результат. еще раз благодарю.
89. Evil Beaver 8243 18.11.13 12:56 Сейчас в теме
(87) inv7, да, отпишите, пожалуйста. Должно работать, никуда не денется.
(88) MakcTLT63, и Вам спасибо за отзыв.
88. MakcTLT63 5 18.11.13 11:43 Сейчас в теме
Спасибо автору.
Очень помогло в изучении.
90. lesenoklenok 35 10.02.14 11:02 Сейчас в теме
Спасибо за интересную статью, все три части прочитала, очень хорошо описано.
91. xIvanx 14.04.14 12:49 Сейчас в теме
Нигде не могу найти ответ, как при помощи XDTO прочитать XML, в котором есть элементы, содержащие атрибут и текстовое значение.
Пример:
<parameter name="log-timestamp">14550C1B0ED-14550BEB879-27</parameter>

При чтении через фабрику получаю только свойство name (см. скриншот). Как добраться до значения?
Прикрепленные файлы:
92. Evil Beaver 8243 14.04.14 15:00 Сейчас в теме
(91) xIvanx, текстовое значение будет обозначено свойством __content.
Обратите внимание, во второй части цикла статей написано про свойство "локальное имя". Посмотрите туда, там увидите этот "__content".

Получается, что код чтения будет такой:

НекийОбъектXDTO.log_timestamp = ///
НекийОбъектXDTO.__content = //
93. xIvanx 14.04.14 15:28 Сейчас в теме
(92) Пробовал так, ожидаемо ругается: Поле объекта не обнаружено (__content)
В конфигурации есть пакет, загруженный из схемы, по которой создается файл, если пытаюсь прочитать файл с явным указанием типа объекта, то ругается на несоответствие типов:
Чтение объекта типа: {http://пространствоимен}Status - [3,7]
Проверка дополнительного свойства:
	форма: Элемент
	имя: code
	Ответ = ФабрикаXDTO.ПрочитатьXML(Чтение, ResponseТип);
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://пространствоимен}Status - [3,7]
Проверка дополнительного свойства:
	форма: Элемент
	имя: code
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://пространствоимен}Status
Показать


Вроде всем хорош XDTO, а такую простую вещь никак не могу осилить.
94. Evil Beaver 8243 15.04.14 10:17 Сейчас в теме
(93) xIvanx, Ну во-первых, XDTO хорош не всем :)
По вашей проблеме - у вас явное несовпадение по схеме. Т.е. ваш файл схеме не соответствует. Ищите расхождение, может там длина несовпадает или еще что-то.
95. kpakaguJL 21.05.14 17:57 Сейчас в теме
Спасибо за статьи - очень интересно и главное полезно написано!
Подскажите, пожалуйста, есть XML файлы и написанная под них схема. файл служит для передачи определенного документа.
то есть тег "Number" это номер, ну и так далее.
собственно вопрос - где и каким образом лучше всего указать соответствие между тегом и Реквизитом документа. и как быть с табличной частью?
спасибо большое
96. Evil Beaver 8243 21.05.14 18:37 Сейчас в теме
(95) kpakaguJL,
где и каким образом лучше всего указать соответствие между тегом и Реквизитом документа. и как быть с табличной частью

Собственно нигде. Прописать в коде явным образом ОбъектXDTO.Number = Документ.Номер
Чтобы этого не делать, можно воспользоваться стандартной сериализацией (но тогда схема будет не вашей, а 1С-овской)
ЗаписатьXML(ЗаписьXML, ДокументОбъект)

Иными словами, соответствие нигде не указывается, а прописывается в коде ручками, до самой последней мелочи.
kpakaguJL; +1 Ответить
97. kpakaguJL 22.05.14 18:58 Сейчас в теме
Спасибо большое!
И еще такой вопросик при выгрузке - получаю в файле что-то вроде

<?xml version="1.0" encoding="UTF-8"?>
<ORDRSP xmlns="http://www.obzhora.ordrsp.ua" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NUMBER>ББ000003472</NUMBER>
бла бла бла


можно ли как-то надоумить его выгружать чистые теги без доп настроек с URL, как то так:

<?xml version="1.0" encoding="UTF-8"?>
<ORDRSP>
<NUMBER>ББ000003472</NUMBER>
бла бла бла
98. Evil Beaver 8243 23.05.14 09:16 Сейчас в теме
(97) kpakaguJL, как-то не вижу разницы)
Оставьте свое сообщение