XDTO - часть 3

15.08.19

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

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

Скачать файлы

Наименование Файл Версия Размер
Выгрузка модели данных
.epf 6,80Kb
555
.epf 6,80Kb 555 Скачать
Учебный пример к циклу статей "XDTO - это просто"
.dt 35,44Kb
37
.dt 35,44Kb 37 Скачать

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 рассмотрены. Все, что осталось - это уже более сложные вещи, которые лучше разбирать на конкретных примерах. Задавайте вопросы с примерами в любом удобном виде (комментариях, личной почте), попробую ответить.

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

 

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4532    dsdred    53    

72

Как готовить и есть массивы

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

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

24.01.2024    5294    YA_418728146    25    

63

Планы обмена VS История данных

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

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

11.12.2023    6410    dsdred    36    

112

1С-ная магия

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

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

06.10.2023    18475    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

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

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8822    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

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

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
99. kpakaguJL 23.05.14 10:08 Сейчас в теме
(98)
Извини что напрягаю, но в комментах или модеры или какойто автофильтр удаляют ссылки, хотя на самом деле это же "типо-ссылки")

вот такой код у меня на выходе



а очень хочется видеть вот такой



этот мусор в тегах, к сожалению, мешает обработке
спасибо большое
101. Evil Beaver 8107 24.05.14 08:46 Сейчас в теме
(99) kpakaguJL, вы что-то не то делаете. Это не мусор, это важная информация о пространствах имен. Обработке он не мешает. Если, конечно, вы не обрабатываете XML, вручную выделяя подстроки функцией Сред.
Какой обработке это мешает, поясните, пожалуйста?
105. kpakaguJL 28.05.14 12:27 Сейчас в теме
(101) обмениваемся данными ide через провайдера. че он там с ним делает, я к сожалению не знаю, но делает он это не в 1с и судя по всему разбирает построчно.
100. kiruha 388 23.05.14 11:49 Сейчас в теме
Ожидается ли продолжение ?
Например выяснилось что непонятна информация со встроенном объектом ПакетXDTO - ТипыОбъектов/Определение типа ...
как они отображаются в XML, как делать чтобы в свойстве можно было содержать несколько разных типов и т.д.
102. Evil Beaver 8107 24.05.14 08:47 Сейчас в теме
(100) kiruha, продолжения не ожидается. А то, что вы спрашиваете, это уже черная магия по созданию пакетов на лету. Мне сложно придумать задачу, где это бы пригодилось реально.
103. kiruha 388 26.05.14 14:43 Сейчас в теме
(102)
Да обычный случай.
Загрузил сторонний пакет типов xsd - при загрузке схемы насоздавалить эти самые "ТипыОбъектов" "Определение типа"
104. Evil Beaver 8107 27.05.14 09:42 Сейчас в теме
(103) kiruha, вы так говорите, как будто, это что-то плохое :)
106. kiruha 388 29.05.14 16:07 Сейчас в теме
(104)
Просто не пойму что это )
В инете что то есть, но такое впечатление что информация добывается методом тыка )
107. kpakaguJL 02.06.14 18:54 Сейчас в теме
Подскажите, пожалуйста, как нужно задать схему чтобы прочитать подобного плана XML

<Параметри>
<Параметр ІД="1" назва="Дата ожидаемой поставки">2013-12-18</Параметр>
<Параметр ІД="2" назва="Валюта">Грн</Параметр>
<Параметр ІД="3" назва="Дата отправки документа">2013-12-17</Параметр>
</Параметри>


как бы не крутил, считывает только Ид и Название, а само значение не видит..
108. kpakaguJL 03.06.14 10:23 Сейчас в теме
я так понимаю это нужно делать через content
пробую - при записи в xml все работает отлично, а вот при обратной раскладке не получается( не видит поле content
109. dmnblg 10.07.14 10:41 Сейчас в теме
День добрый, подскажите пожлауйста, есть ли способ теперь получить текст XML без записи в файл?

ФабрикаXDTO.ЗаписатьXML() позволяет создать один из объектов:
ЗаписьУзловDOM, ЗаписьFastInfoset, ЗаписьXML

но не через один из них не могу добраться до самого текста XML.

Через сохранение файла, конечно, работает, но хотелось бы обойтись оперативной памятью.
Есть способ?
110. Evil Beaver 8107 10.07.14 11:19 Сейчас в теме
(109) dmnblg,
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку() // показываем, что вывод будет в строку
Запись.ЗаписатьНачалоЭлемента("ТЫРПЫР"); // заполняем документ
//.....

// ВАЖНО: если вызывался метод "УстановитьСтроку", то "Запись.Закрыть()" возвратит результат записи.
ТекстXML = Запись.Закрыть();

Показать
111. magiker 05.08.14 10:40 Сейчас в теме
Добрый день. Подскажите, как быть в ситуации, когда в схеме определено пространство имен, а в самом XML-документе - нет. Кроме пространства имен документ полностью соответствует схеме, можно ли из него получить ОбъектXDTO? Сейчас ругается на несоответствие типов в документе схеме.
112. Evil Beaver 8107 05.08.14 21:59 Сейчас в теме
(111) magiker, ну первое, что приходит в голову - считать документ в DOM, и средствами DOM проставить атрибут xmlns="нужное пространство имен". Затем настроить ЧтениеУзловDOM на измененный документ и скормить это Чтение ФабрикеXDTO.
113. magiker 08.08.14 13:31 Сейчас в теме
(112) спасибо за ответ. Попробую и отпишусь о результате.
114. user_2010 871 10.12.14 11:40 Сейчас в теме
Добрый день!
Есть вопрос по XDTO:
когда в своем пакете XDTO описываем свои типы, у типов - описываем поля, то для каждого поля в свойствах можно настроить следующие параметры:
Имя
Ссылка
Тип
Мин колво
... и т.д.
Меня интересуют два параметра: Ссылка и Тип
что означает параметр Ссылка? - подозреваю, что признак, что данное поле будет содержать ссылку на объект конфигурации.
И как должен быть заполнен параметр Тип, если будет установлен параметр Ссылка = V?

В своем веб-сервисе я передаю ссылки в виде строки, полученной с помощью функции 1С: ЗначениеВСтрокуВнутр(ВыборкаДетальныеЗаписи.Ссылка)

Это правильно?

Спасибо!
115. Evil Beaver 8107 10.12.14 11:48 Сейчас в теме
(114) user_2010, нет, Ссылка в типе XDTO не имеет ничего общего со ссылками в метаданных.

Если вкратце, то это довольно мутный, но интересный способ комбинирования типов внутри XML-схем. Копайте в сторону xml-schema ref attribute. В рамках камента не объяснишь)
117. 987ww765 306 28.01.15 17:32 Сейчас в теме
(115) у меня есть один вопрос, который никак не дает покоя.

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

1.Создаем фабрику вторым конструктором (на основании НабораСхемXML)
2.Из этой фабрики выгружаем Model методом ЭкспортМоделиXDTO().
3.Получаем Model, для сохранения в макете и использования в боевом режиме.


У меня никак не получается это проделать. Видимо я некорректно трактую эти строки. Пытаюсь выполнить следующий код:
Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(СтрокаXML);
	
	ПостроительDOM = Новый ПостроительDOM;
	Документ = ПостроительDOM.Прочитать(Чтение);

	ПостроительСхем = Новый ПостроительСхемXML;	
	Схема = ПостроительСхем.СоздатьСхемуXML(Документ);
	
	НаборСхем = Новый НаборСхемXML;
	НаборСхем.Добавить(Схема);
	Фабрика = Новый ФабрикаXDTO(НаборСхем);
	Модель = Фабрика.ЭкспортМоделиXDTO(ПространствоИмен);
Показать


СтрокаXML хранит полный текст XML-файла. В результате исполнения в переменную Схема возвращается Неопределено.
118. Evil Beaver 8107 28.01.15 23:15 Сейчас в теме
(117) 987ww765, дайте текст XML, который у вас записан в переменную СтрокаXML?
119. 987ww765 306 29.01.15 08:19 Сейчас в теме
(118)
<?xml version = "1.0" encoding="UTF-8"?>
<Result xmlns="http://MoeProstranstvoImen.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<recordsreturned>0</recordsreturned><Success>1</Success><Fai­lureReasons></FailureReasons><logged>29/01/2015 05:17:27</logged></Result>
120. 987ww765 306 29.01.15 08:23 Сейчас в теме
(118) там хравнится вот это
 <?xml version = "1.0" encoding="UTF-8"?>
<Result xmlns="http://MoeProstranstvoImen.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<recordsreturned>0</recordsreturned><Success>1</Success><Fai­lureReasons></FailureReasons><logged>29/01/2015 05:17:27</logged></Result>
121. Evil Beaver 8107 29.01.15 10:57 Сейчас в теме
(120) 987ww765, Ну вы жжоте, вообще... Это же не XML-схема. Зачем вы пытаетесь создать схему на основе этого документа?
122. 987ww765 306 29.01.15 11:46 Сейчас в теме
(121) прочитать файл с помощью xml-схемы документа у меня получилось, но вот саму Xml-схему я получаю инструментом XSD.exe из поставки VisualStudio. Я ему скармливаю файлик, а он возвращает мне Xsd. В данном случае я хотел отказать от посредника-утилитки и сделать все в рамках 1с с помощью метода ЭкспортМоделиXDTO(). Но видимо у меня ничего не выйдет. Можете тогда пояснить на конкретном примере вот эти строчки:
Кстати, конфигурацию-болванку можно заменить кодом из второго способа создания фабрики.

1.Создаем фабрику вторым конструктором (на основании НабораСхемXML)
2.Из этой фабрики выгружаем Model методом ЭкспортМоделиXDTO().
3.Получаем Model, для сохранения в макете и использования в боевом режиме.


Большое спасибо, что тратите свое время на мои вопросы.
invertercant; +1 Ответить
123. Evil Beaver 8107 29.01.15 18:28 Сейчас в теме
(122) 987ww765, все-таки, я не до конца понял. Откуда возникает сама схема XML? В виде документа. Что вы скармливаете Visual Studio? тот фрагмент, который привели ранее?
А он вам возвращает схему XML в виде какого-то файла, так?. Ну вот этот вот файл схемы и надо скармливать объекту ПостроительDOM

Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML); // СтрокаXML - это тот самый xml, который вам вернул XSD.exe.
ПостроительDOM = Новый ПостроительDOM;
Документ = ПостроительDOM.Прочитать(Чтение);


И далее по тексту.
124. 987ww765 306 30.01.15 08:25 Сейчас в теме
(123) да, все верно. Я скармливаю XML, который привел выше, XSD.exe и он мне выдает схему XML. Эту схему я отдаю объекту DOM и все замечательно. Все работает. У меня вопрос в другом, как мне избавится от XSD.exe и получить схему XML средствами 1с? Только через болванку?
125. Evil Beaver 8107 30.01.15 17:35 Сейчас в теме
(124) 987ww765, Вам схему из документа нужно генерить разово? Если да, сделайте ее в xsd.exe и пользуйтесь. Если вам нужно постоянно генерить схемы из готовых документов, то:

а) зачем вам это нужно?
б) это ненадежно. Алгоритм выведения схемы из документа всегда эмпирически определяет возможную схему. Она нестабильна
в) в 1С такой возможности нет.
116. unichkin 1559 15.12.14 16:37 Сейчас в теме
126. unichkin 1559 06.02.15 15:04 Сейчас в теме
Добрый день. Не так давно работаю с XDTO, и ваши статьи внесли некоторую ясность - за что огромное спасибо, - но окончательно туман не рассеялся) Например у вас не описано как работать с свойствами объекта. У вас написано "Если мы посмотрим в стандартный редактор пакетов, то увидим строгое разделение на "Типы значений" и "Типы объектов"." (последний абзац в разделе "Устройство пакета"). Но не написано, что у объекта есть свойства, как с ними работать, и главное - во что они в итоге превратятся.
Взял для примера пакет XDTO из типовой конфигурации УТ УАС, пространство имен указано - "ZAKTPRM". Все что было дальше видно в прикрепленном скриншоте. Я создал объект XDTO "Файл", и в созданном объекте ожидал увидеть что-то типа х_Файл.Документ.КНД, с значением - пустой строкой. Дальше я наивно ожидал что установлю туда свое значение, например "МояСтрока", и это все выгрузится в нечто, типа такого:
<Файл>
...
<Документ КНД = "МояСтрока" />
...
</Файл>
Однако отладчик показывает что х_Файл.Документ - неопределено, а создать объект XDTO "Документ" по аналогии с объектом "Файл" - платформа не дает. Очевидно, потому что это свойство. Но что же мне с ним делать?) Пожалуйста, помогите разобраться?
Прикрепленные файлы:
127. unichkin 1559 06.02.15 15:09 Сейчас в теме
+ Кроме того, у свойств объекта есть свои, вложенные свойства (см. скрин). А также свойства есть у самого *пакета* - находятся на одном уровне с объектам и значениями. Если можно, просветите еще вот по этому.
Прикрепленные файлы:
128. Andywar 06.02.15 15:52 Сейчас в теме
Как быть если при использовании внешнего сервиса в нем описаны не все нужные мне XDTO-пакеты. Но у меня есть XSD схемы присланные разработчиком. Могу ли я сформировать XDTO объект на основании импортированных в 1С схем и его передавать как параметр метода web-сервиса.
Если так сделать то пишет:

Неизвестная ошибка. Несоответствие типов XDTO:
Тип принадлежит пакету, входящему в состав другой фабрики типов XDTO


Разработчик веб-сервиса сделать импорт схемы в WSDL не может
А что делать в этом случае?
Armaggik; +1 Ответить
136. Evil Beaver 8107 09.02.15 23:37 Сейчас в теме
(128) Andywar, могу ошибаться, но по-моему, нельзя подменить wsdl, присылаемый удаленным веб-сервисом. Возможно, я не прав.
129. unichkin 1559 06.02.15 16:00 Сейчас в теме
Кстати, к моему первому посту. Выгрузил пакет в файл xsd, и воспользовался вот этим замечательным сервисом - http://xsd2xml.com/. В итоге получил xml, где как и ожидал: свойство "Документ" - это субтег, подчиненный корневому тегу "Файл", а "КНД", "ДатаДок" и "ВремДок" - это его атрибуты простого типа.
invertercant; +1 Ответить
130. Evil Beaver 8107 06.02.15 18:04 Сейчас в теме
(129) zhuravlik, да, изменить пакет в этом случае проще, чем долбаться со свойствами.
131. unichkin 1559 06.02.15 18:42 Сейчас в теме
(130) нет, проще - не вариант. У меня смысл в том, чтобы задолбаться до того состояния, пока понятно не станет. Вот, стараемся. Можете приоткрыть завесу в (126) посту? И в (127)...
132. Evil Beaver 8107 07.02.15 08:46 Сейчас в теме
(131) zhuravlik, Дайте готовый xsd, пожалуйста
133. unichkin 1559 07.02.15 14:37 Сейчас в теме
(132) вот xsd схема, а это пример xml, который я сгенерировал на сайте http://xsd2xml.com/
143. Evil Beaver 8107 13.03.15 16:25 Сейчас в теме
(133) zhuravlik, Ответ на ваш вопрос также дан в (140)
134. unichkin 1559 07.02.15 14:55 Сейчас в теме
Я уж раз начал, задач вам еще вопрос? Имхо, вы с таким сталкивались. Можно ли средствами XDTO сгенерировать вот такой xml:

<Одежда>
<Обувь>
Наименование = "Ботинки"
Качество = "Дырявые"
<Упаковка Наименование="Пара" Коэффициент="1"/>
<Упаковка Наименование="Коробка" Коэффициент="4"/>
<Упаковка Наименование="Паллета" Коэффициент="100"/>
</Обувь>
</Одежда>

Т.е. получается что в корневом теге "Одежда" указан субтег "Обувь", который имеет атрибуты, и в то-же время является списком. Насколько я сейчас понял с т.з XDTO - это некошерно?
Сам себе отвечу. При генерации xsd схемы в программе Altova XML Spy, атрибуты "Наименование" и "Качество" вместе с их значениями стали просто текстом, а субтег обувь - списком элементов "Упаковка".
Приложил скриншот, как это в итоге считалось в 1С.
Прикрепленные файлы:
135. Andywar 09.02.15 12:46 Сейчас в теме
Поделитесь, пожалуйста, хоть какими то идеями на пост 128
137. Andywar 10.02.15 11:30 Сейчас в теме
Спасибо, Evil Beaver
Похоже, что Вы абсолютно правы. По крайней мере ни где на просторах интернета я не нашел решение этого вопроса.
В документации 1С написано:
...глобальная XDTO фабрика (получаемая через свойство глобального контекста ФабрикаXDTO) не может быть использована для создания объектов и значений для передачи через прокси, даже если она содержит типы с такой же структурой и именами. Эти типы все равно будут считаться несовместимыми с типами данных web-сервиса.


Однако поставщик web-сервиса пишет:
напрямую сделать импорт схемы в WSDL не можем. WSDL описывает сервис универсальной системы обработки заявок, которая обрабатывает не только заявки из этой схемы и логически не может зависеть от них.


Будем общаться...
Armaggik; +1 Ответить
138. Alexei_fox 46 17.02.15 08:18 Сейчас в теме
Как с помощью XDTO получить вот такую строку в xml ? <Картинка Описание="Описание">путь к картинки относительно xml файла.jpg</Картинка>

Так то не проблема !!!
<Картинка>
<Описание>import_files/88/8868f46e-9d44-11e4-acb8-001e90f93bad_6098c20e-a850-11e4-85dc-001e90f93bad.jpeg</Описание>
</Картинка>

А разработчик приемника хочет именно <Картинка Описание="Описание">путь к картинки относительно xml файла.jpg</Картинка> ...

Есть мысли у кого ?
139. Dr.ZIG 27 11.03.15 12:45 Сейчас в теме
Имеется присланный файл .xsd (прикрепил к сообщению), добавил только пространство имён, загружается в 1С так, как на прикреплённом рисунке. То есть основа не типы объектов, как рассказывается в цикле статей, а дерево свойств, про которые я в статье информации не нашёл. Создать фабрику с типом-"свойством" не выходит. Можно где-то про свойства почитать?
Прикрепленные файлы:
запрос-получение части сведений об ОУ.xsd
140. Evil Beaver 8107 11.03.15 14:53 Сейчас в теме
(139) Dr.ZIG, здесь используется хитрый трюк:

1. Мы получаем родительский тип. В вашем случае - Root
2. У этого типа методом Свойства().Получить("AuthData") получаем свойство XDTO
3. У этого свойства есть метод Тип(). Он вернет вам некий анонимный тип, который можно передать в фабрику для создания объекта
4. Вызываете ФабрикаXDTO.Создать и передаете ей этот анонимный тип. Она вам возвращает экземпляр объекта этого типа.
141. spetzpozh 13.03.15 11:23 Сейчас в теме
Оплатил пример из уважения к автору и его труду
142. Evil Beaver 8107 13.03.15 16:23 Сейчас в теме
(141) spetzpozh, Спасибо за теплые слова и высокую оценку!
144. igo1 266 17.03.15 18:28 Сейчас в теме
Спасибо за статью.
Не подскажете как можно установить и объявить префикс пространства имен с помощью фабрики
145. Evil Beaver 8107 23.03.15 11:46 Сейчас в теме
(144) igo1, Если я правильно вас понял, то вы хотите избавиться от автоматических префиксов в стиле "d1p2"?
Фабрика этого не делает, вам нужно самостоятельно в объекте ЗаписьXML вывести префикс пространства имен в XML. Далее, фабрика сама подхватит ваш префикс.
146. Templ 07.05.15 11:46 Сейчас в теме
Здравствуйте

Если у объекта есть табличная часть как их связать вместе?

	Фабрика = СоздатьФабрикуXDTO("D:\1С\СтруктураКонечнойИБ.xsd",);

	ТипДокумента = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.РеализацияТоваровИУслуг");
	ТипТаблЧасть = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentTabularSectionRow.РеализацияТоваровИУслуг.Товары");  	
	
	РеализацияОбъект = Фабрика.Создать(ТипДокумента);
    ТабличнаяЧасть   = Фабрика.Создать(ТипТаблЧасть);



147. Evil Beaver 8107 08.05.15 08:33 Сейчас в теме
(146) Templ, какую задачу вы решаете?
148. engineer74 26.07.15 12:53 Сейчас в теме
Ошибка при создании собственного пакета Фабрики. Вопрос: Как в собственном пакете у свойства указать тип родной конфигурации (CatalogObject.Банки (http://v8.1c.ru/8.1/data/enterprise/current-config)). Мне выходит ошибка Ошибка проверки модели XDTO: xdto-objectType-3.2.1 тип: DocumentObject.Реестр пакет: my1c
Тип '{http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogObject.Банки' свойства 'Банк' не определен
149. engineer74 26.07.15 14:45 Сейчас в теме
Хотелось бы увидеть раскрытие темы прикладной задачи: Обмен между различными конфигурациями, используя XDTO.
150. fineosun 28.07.15 14:56 Сейчас в теме
Evil Beaver, спасибо за статьи! И отдельное - за учебный пример. Вроде, ничего сложного, но некоторые вещи стали значительно понятнее.
151. Evil Beaver 8107 29.07.15 20:19 Сейчас в теме
(150) fineosun, и вам спасибо за приобретение!
152. kasper076 101 27.08.15 07:12 Сейчас в теме
В последних версиях платформы появилась возможность выгружать структуру конфигурации в файлы. Так вот при выполнении этой команды в том числе создается файл "Configuration.xml" с пространством имен "http://v8.1c.ru/8.3/MDClasses". При создании объекта модели с помощью прилагающейся здесь обработки не получается найти пакет соответствующий этому пространству имен. Думаю, что это логично, т.к. файл не содержит данных об объектах конфигурации и по сути не относится к XDTO. Файл содержит свойства самой конфигурации. А как-то получить XSD-схему описывающую характеристики самой конфигурации?
Если работать с файлом "Configuration.xml" полученным из этой же конфигурации, глобальная ФабрикаXDTO читает этот файл, видимо неявно применяя нужную схему. Но что если возникнет необходимость разобрать этот файл на другой версии платформы?
153. Evil Beaver 8107 28.08.15 11:01 Сейчас в теме
(152) kasper076,
А как-то получить XSD-схему описывающую характеристики самой конфигурации?

Никак. 1С не публикует эти схемы, насколько я знаю.
Если работать с файлом "Configuration.xml" полученным из этой же конфигурации, глобальная ФабрикаXDTO читает этот файл, видимо неявно применяя нужную схему.

Нет, ФабрикаXDTO просто читает, не применяя вообще никаких схем. Фабрика умеет читать любые файлы без наличия схемы, но это чтение будет не строго типизированным. Прочитанный объект будет типа anyType.
154. kasper076 101 30.08.15 12:31 Сейчас в теме
(153) да. Перечитав эту тему в n-й раз я узнал, что Фабрика легко читает любой XML-файл, но не типизирует значения полей. Еще раз спасибо.
172. SlavaKron 29.08.19 14:57 Сейчас в теме
(152) Какие-то xsd есть в ресурсах программы и доступны в коде:
Фабрика = СоздатьФабрикуXDTO("v8res://mngcore/logform.xsd");
или
НачатьКопированиеФайла(Новый ОписаниеОповещения("ПослеКопированияФайла", ЭтотОбъект), "v8res://mngcore/logform.xsd", "D:\logform.xsd");
Evil Beaver; +1 Ответить
155. Armaggik 09.10.15 18:16 Сейчас в теме
Evil Beaver, спасибо за Ваши статьи, многое прояснили. У меня такая же проблема, как и у Andywar. Есть открытый api сервиса заявок россельхознадзора: http://api.vetrf.ru/schema/platform/services/ApplicationManagementService_v1.2.wsdl
Разработчики дают набор XSD схем, в которых описаны все типы, в WSDL схеме описан минимум типов.
Так вот, если импортировать XSD схемы в конфигурацию 1С, то, естественно, при передаче такого объекта XDTO в параметре метода веб сервиса вызывается исключение о несовпадении типов, т.к. фабрики XDTO получаются разными.

В WSDL схеме описан грубо говоря 1 метод, который отправляет заявку (в WSDL это тип объекта ApplicationData - абстрактный), а по ее типу веб сервис понимает что нужно сделать. Например, в ApplicationData может быть передан объект registerProductiveBatchRequest

Нет ли у Вас хоть каких то идей на этот счет?
156. danjer74 3 07.01.16 21:48 Сейчас в теме
статьи очень полезные, многое стало ясно. Но возник вот такой вопрос. Не могу сообразить, как добавить в XDTO вложенный тег. Я пытался добавить, но не могу сообразить, как работать с "определение типа". Или же свойства использовать - тоже не могу сообразить, как теги добавить в xml. В схеме есть root - это главный узел, куда я все собираю. Есть еще item внутри - это номенклатура. Как бы в выходной xml файл загнать что-то типа вот такого:

<items>
<item>
Номенклатура 1
</item>
<item>
Номенклатура 2
</item>
<item>
Номенклатура 3
</item>
</items>

Все остальное заполняется нормально - застрял только тут.
На всякий случай прилагаю обработку и схему. обработка сделана для УТ10
Прикрепленные файлы:
upload.xsd
ОбработкаРТИУ10.epf
157. user_2010 871 15.07.16 12:22 Сейчас в теме
Проблема: создали свой XDTO, в нем свои типы, в состав типов входят свойства - строка и свойства Boolean.
Со строками проблем нет.
Но вот с Boolean - получается, что эти поля должны быть всегда заполнены? Иначе ругается:
Ошибка проверки данных XDTO:
Значение: '' не соответствует простому типу: {http://www.w3.org/2001/XMLSchema}boolean</faultstring>
Пробовали указать для этого свойства "значение по умолчанию" = False - все-равно ошибка.
Как это обойти?
Спасибо!
158. user_2010 871 18.07.16 11:27 Сейчас в теме
(157) user_2010, все таки надеюсь, что найдутся гуру веб-сервисов...

по сообщению выше: пришлось заменить все Boolean на строки - по другому не смогла победить. Вроде бы работает... но проблемы не кончились.

В фабрике XDTO определено 2 типа: Contr - это данные одного контрагента (наименование, ИНН, КПП...)
и ContrList - это список контрагентов, элементы которого имеют тип Contr

Веб-сервису передаем 2 параметра (входных-выходных): Contr и ContrList. Веб-сервис смотрит данные контрагента в Contr и если такой контрагент в базе уже есть - то возвращает всех найденных контрагентов в параметре ContrList.
Если смотреть работу веб-сервиса в SoupUI - то все работает - найденные контрагенты возвращаются.
Если вызывать веб-сервис из 1С - то ContrList - не возвращает... Не пойму почему???

Предполагаю - что-то с типами????
Где копать? Куда глядеть?
159. user_2010 871 18.07.16 14:51 Сейчас в теме
(158) user_2010, с проблемой разобралась - ошибка была в том, что я не заполняла одно из полей своего типа данных...
160. zerg17 25.11.16 16:38 Сейчас в теме
На вопросы 107 и 138 никто не знает ответа???
С той же бедой столкнулся: список идентификаторов из тега получаю, а само значение параметра не знаю как получить.
161. Serginio 938 25.11.16 17:51 Сейчас в теме
(169) Схему можно описать так
http://www.forum.mista.ru/topic.php?id=726414#18

И получить значение через Объ.__content
или
Объ.Последовательность().ПолучитьТекст(0))
162. zerg17 26.11.16 01:50 Сейчас в теме
(161) Спасибо огромное, через "Последовательность" получил.
Правда добирался обходными путями, в >чтение.УстановитьСтроку(стр);
что за строка "стр", откуда она?
163. karapuzzzz 63 21.09.17 17:10 Сейчас в теме
Кто-нибудь сталкивался с необходимостью использования секции CDATA?
164. пользователь 22.06.18 17:58
Сообщение было скрыто модератором.
...
165. extrim-style 7 23.06.18 11:44 Сейчас в теме
Нужно в XML заполнить список ПараметрыТовара элементами Товар. Не получается добавить новый элемент. Подскажите, как это сделать. Пробую так:

ПараметрТовараXMLТип = ПараметрыТовараXMLТип.Свойства.Получить("Параметр").Тип;
ПараметрТовараXML = ФабрикаXDTO.Создать(ПараметрТовараXMLТип);
ПараметрТовараXML.ПолноеИмяПараметра = НекоеНаименование;
ПараметрТовараXML.__content = ЗначениеПараметра;
ПараметрыТовараXML.Добавить(ФормаXML.Элемент, ПараметрТовараXML.Тип().URIПространстваИмен, "Параметр", ПараметрТовараXML);

Ошибка при вызове метода контекста (Добавить)
ПараметрыТовараXML.Добавить(ФормаXML.Элемент, ПараметрТовараXML.Тип().URIПространстваИмен, "Параметр", ПараметрТовараXML);
по причине:
Несоответствие типов XDTO:
Тип '' не соответствует типу '{ТутСсылкаНа-w3-org-2001-XMLShema-ПриветМодераторамХорошихВыходных!}anyType'
Тип свойства не соответствует типу значения

В XDTO-пакете для свойства Параметр после загрузки схемы никакой тип не установлен. Одно значение заполняется нормально. Но как добавить несколько?
166. extrim-style 7 23.06.18 13:17 Сейчас в теме
167. Negator 03.07.18 10:58 Сейчас в теме
Народ, а подскажите как используя XSD-схему собирать XML с несколькими корневыми свойствами?
Я создал фабрику XDTO, создал столько объектов сколько у меня корневых свойств (с соответствующими типами), заполнил их - как их теперь собрать в один XML-файл?
168. ids79 8291 10.12.18 09:14 Сейчас в теме
Добрый день.
Подскажите пожалуйста, а зачем вообще необходимо создавать собственные фабрики?
В каких случаях их удобнее использовать, чем предоставляемую платформой?
169. koln 17.12.18 16:21 Сейчас в теме
Спасибо автору за полезный материал!
171. maslennikov_ea 5 01.03.19 19:02 Сейчас в теме
Подскажите, пожалуйста, куда могут пропадать пакеты из ФабрикаXDTO? Уже у многих пользователей проблема проявляется. На партнерском форуме 1С молчит. Куда копать непонятно (
173. mity1982 29.01.20 17:30 Сейчас в теме
Добрый день,

Как объяснить следующее поведение системы?

1. Выгружаю в файл модель "http://v8.1c.ru/8.2/uobjects" как написано в статье (именно модель)
2. В файле слегка меняю модель.
3. Дессериализую модель из файла. (проверил мои изменения есть).
4. Создаю фабрику на основании модели.
5. Далее проверяю схему "http://v8.1c.ru/8.2/uobjects" в новой фабрике.

НаборСхем = НоваяФабрикаXDTO.ЭкспортСхемыXML(Имя);

Схема = НаборСхем.Получить(0);
Схема.ОбновитьЭлементDOM();
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьXMLСтрока = Новый ЗаписьXML;
ЗаписьXMLСтрока.УстановитьСтроку();
ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXMLСтрока);

стр = ЗаписьXMLСтрока.Закрыть();

Проверяю строку, там схема без моих изменений. Хотелось бы убедится что это так и надо (нельзя переопределить платформенные схемы в фабрике) а не я чего то не догоняю.

N.B
1. Создание фабрики по набору схем из файла дает тот же "неизменный" результат.
2. ЭкспортМоделиXDTO из новой фабрики выгружает тоже не измененную модель.
2. СериализаторXDTO созданный на основе новой фабрики тоже пользуется не измененной моделью\схемой (собственно то, что меня не устраивает)

Заранее спасибо, если кто откликнется с объяснением такого поведения. Как сделать так, что бы в фабрике была именно моя схема ну и соответственно Сериализатор воспользовался именно ей.
174. Shurkec 29.08.20 10:16 Сейчас в теме
Вопрос автору статьи - предложение по демо-конфигурации еще в силе? Понимаю что статья написана давно, но тем не менее...
175. Evil Beaver 8107 04.09.20 19:12 Сейчас в теме
(174) поскольку статья написана давно - поясните, а что за предложение по демо-конфигурации?
176. Shurkec 05.09.20 11:10 Сейчас в теме
(175) Вы в конце статьи написали: "К статье прилагается пример конфигурации, демонстрирующий все, что было описано в предыдущих (и текущей) статьях. Основные моменты расписаны в комментариях к коду.", за символическую плату )) Вот я этой конфигурацией и интересуюсь.
177. Evil Beaver 8107 08.09.20 12:49 Сейчас в теме
(176) она приложена к файлам в статье, купить можно прямо там
178. Shurkec 08.09.20 13:28 Сейчас в теме
(177) Да, можно и там, только если бы у меня еще были эти стартмани ((
179. Evil Beaver 8107 08.09.20 16:47 Сейчас в теме
(178) а вы классный! Я тут продаю товар, а вы спрашиваете нет ли его бесплатно? Все верно понял?
180. Shurkec 08.09.20 17:15 Сейчас в теме
(179) Нет, не правильно. Я его хотел купить, но за нормальные рубли, потому что нету у меня этих маней и неизвестно когда будут. Однако, переговоры слишком затянулись, мир не без добрых людей...
181. Demlan 19.09.20 16:28 Сейчас в теме
Получаю фабрику из WSОпределения на мобильном. Создаю объект XDTO. И тут возникает вопрос: т.к. свойств очень много в центральной базе у объекта, а в мобильнике мало то можно как-нибудь заполнить при создании на мобильнике все свойства объекта значениями по умолчанию? Просто возникает ошибка если свойства не заполнены.
182. Darklight 32 02.03.21 12:03 Сейчас в теме
Прочитал статью. Статья полезная, хотя тема программной работы с нестандартной фабрикой XDTO всё-таки раскрыта не очень прозрачно и не в достаточной мере (например как сочетать нетиповые пакеты с типовыми, в т.ч. платформенными пакетами; или как работать с динамически загружаемыми схемами xsd).
Хоть в конце статьи поставлена точка циклу статей (очень и очень давно), всё-таки хочу сказать, что циклу не хватает как минимум ещё одной части - "Разбор ошибок и отладка". Ибо сообщения об ошибках в подсистеме XDTO ну очень специфические и трудно понимаемые, сложно найти место - где, собственно, расположена проблема.
Начав разбирать xml по нестандартным схемам xsd (причём уже готовым) я как раз столкнулся с тем, что бОльшая часть сложностей как раз в том, что сложно понять где ошибка - в файле или в схеме (особенно когда их много вложенных, из которых, в конечном итоге собрана модель типов), в каком месте файла/схемы.

Вот, например, пойди сыщи где проблема, получив такую ошибку

Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://v8.1c.ru/8.3/xcf/readable}TypeLink
Проверка свойства 'DataPath':
форма: Элемент
имя: {http://v8.1c.ru/8.3/xcf/readable}DataPath
тип: {http://v8.1c.ru/8.3/xcf/readable}DataPath
Отсутствует обязательное свойство
{ВнешняяОбработка.ОД_Интеграция.Форма.XDTO.Форма(181)}: Объект_ = Фабрика.ПрочитатьXML(ЧтениеXML, Тип);


по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://v8.1c.ru/8.3/xcf/readable}TypeLink
Проверка свойства 'DataPath':
форма: Элемент
имя: {http://v8.1c.ru/8.3/xcf/readable}DataPath
тип: {http://v8.1c.ru/8.3/xcf/readable}DataPath
Отсутствует обязательное свойство


Вот сейчас буду разбираться что за TypeLink и что за DataPath которых нет ни в читаемом файле, ни в файле схемы для этого файла (ну уже понятно что они находятся в импортируемой типовом пакете пространства имён "http://v8.1c.ru/8.3/xcf/readable" - но где исходная проблема - ещё нужно будет найти и понять что исправлять
183. Darklight 32 03.03.21 14:35 Сейчас в теме
(182)Оказывается такая статья (про поиск ошибок) уже есть
Но, всё-равно, и тут тоже можно было бы автору написать свой взгляд на поиск проблем, и их bсправлению (для случая когда можно вносить изменения с схему и для случая когда нужно корректировать формат xml данных).
Вот мне сейчас нужно ломать голову что делать со схемой при обработке таких узлов "<Ob jectNode/>" - то есть пустых (где, если бы бы узел не был пустой то по схеме должен был бы быть комплексный объект (с обязательными членами). Повлиять на источник xml данных я не могу. Могу только изменять схему.
Проблема в том, что если даже сделать в схеме член "ObjectNode" не обязательным (minOccurs="0") - то при такой записи "<Ob jectNode/>" считается, что он есть - и XDTO движок пытается его валидировать по схеме.
Если же его в схеме сделать его nilable=true то движок XDTO не считает его пустым - и всё-равно валидирует пытается его валидировать по схеме (кстати тут в интернете есть разное мнение на то считать ли такой узел пустым, но по правилам пустой узел должен быть записан вот так "<Ob jectNode xsi="nil"/>" - тогда XDTO будет считать его пустым, но я не могу повлять на алгоритм формрующий такие xml файлы "с <Ob jectNode/>" - да и с моей точки зрения это всё вполне достимо - ведь для простых типов такой узел вполне считается пустым - правда XDTO движок в этом случае превратит его не в пустое значение типа, а пустой объект "ОбъектXDTO" - Ну почему бы так не сделать для и для комплексных типов, пусть даже если для этого нужно было бы помечать их как "ВозможноПустое")
Причём три известных мне пути решения проблемные:
1. Внести изменения в комплексный тип такого объекта - сделав его члены не обязательными (minOccurs="0") - решение так себе - во-первых таких типов очень много, во вторых они всё-же должны быть целостными (когда они заполнены), в третьих - есть импортируемые пакеты 1С вложенных типов - где ничего поменять нельзя
2. При чтении XML файла удалять такие узлы - тоже неудачное решение - во-первых всё-равно в схеме нужно будет помечать такие элементы не обязательными (minOccurs="0") - правда формально это вполне правильно, раз они пустые - то они необязательные. Проблема в том, что они могут быть так же во вложенных свойствах импортируемых типовых схем. Во вторых - узлы могут быть вложенными в свойства узлов объектов более высокого уровня - тогда искать такие пустые узлы нужно заранее - первичным обходом xml контента. В третьих - чтение XML не позволяет вносить изменения на лету - придётся переходить на модель DOM - или сначала в потоке по узлам обработать весь контент - переписав его в новый поток данных уже в исправленном виде.
3. Вместо удаления таких узлов дописывать им атрибут "xsi="nil" - мало чем отличается от предыдущего варианта - абсолютно те же проблемы.

Вот такое вот оно XDTO - шаг влево шаг в право - и ничего не загружается, а исправления чреваты большими сложностями.
Вот хоть писать свою версию метода "Фабрика.ПрочитатьXML()" - где самой лишь создавать пустой экземпляр "ОбъектXDTO" заданного типа. А далее уже читать xml вручную по узлам - просто заполняя свойства данного объекта XDTO согласно "метаданным" типов его свойств. Зато более спокойно относится к тому, что что-то в xml контенте будет задано несколько иначе, чем предполагала схема.
Ну, правда, на производительности это скажется не лучшим образом!
184. Glebis 13 24.12.22 19:34 Сейчас в теме
Если "В управляемом режиме платформа ведет обмен клиент-сервер с помощью механизма XDTO", то возможно ли создать ОбъектXDTO из элемента формы? Я хочу получить получить список свойств элемента формы, выполнив метод НужноеЗначениеXDTO.Свойства().

	НужноеЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(Элементы.Реквизит1);

При выполнении в обоих контекстах формы выдается ошибка "Отсутствует отображение для типа "ПолеФормы".
Может есть решение этой проблемы? Или я слишком многого хочу от платформы...
185. Evil Beaver 8107 24.12.22 23:16 Сейчас в теме
(184) нет, так не получится. Типы XDTO управляемых форм можно нарыть в стандартной Фабрике, но автоматически они сериализовываться через СериализаторXDTO не будут, только руками
186. IvanPoh 24 27.04.23 18:10 Сейчас в теме
Добрый день. Подскажите каким образом можно записать атрибут xsi:noNamespaceSchemaLocation?

Т.е. нужно получить строку вида, где будет указан этот атрибут

<RegistrySet xsi:noNamespaceSchemaLocation='schema.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>

Пробовал просто сделать новый атрибут в xdto пакете, но с названием xsi:noNamespaceSchemaLocation - не дает сделать
187. Evil Beaver 8107 29.04.23 17:27 Сейчас в теме
(186) это можно сделать через ЗаписьXML, напрямую записав атрибут с таким именем
188. KrakoZyabl 77 08.06.23 14:54 Сейчас в теме
Понятная статья, без лишних прибамбасов .Спасибо!!!
189. saski 09.08.23 17:06 Сейчас в теме
Добрый день, подскажите!
Вот есть такая схема

<xs:schema xmlns:ns1="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:tns="http://www.ornik.org" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ornik.org" attributeFormDefault="unqualified" elementFormDefault="qualified">
	<xs:import namespace="http://v8.1c.ru/8.1/data/enterprise/current-config"/>

	<xs:complexType name="DocumentObject.ПриобретениеТоваровУслуг">
		<xs:sequence>
			<xs:element name="Ref" type="ns1:DocumentRef.ПриобретениеТоваровУслуг"/>
			<xs:element name="DeletionMark" type="xs:boolean"/>
			<xs:element name="Date" type="xs:dateTime"/>
			<xs:element name="Number" type="xs:string"/>
			<xs:element name="Posted" type="xs:boolean"/>
			<xs:element name="Валюта" type="ns1:CatalogRef.Валюты"/>
			<xs:element name="Партнер" type="ns1:CatalogRef.Партнеры"/>
  	      </xs:sequence>
	</xs:complexType>
</xs:schema>


//При создании из этой схемы фабрики xdto

  	        ДД=ПолучитьМакет("ПакетXDTO");
		ИмяВремФайла=ПолучитьИмяВременногоФайла("xsd");
		ДД.Записать(ИмяВремФайла);
		
		Пакеты = Новый Массив;
		Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("http://v8.1c.ru/8.1/data/enterprise/current-config"));  
		
		МояФабрикаXDTO = СоздатьФабрикуXDTO(ИмяВремФайла,Пакеты);  

                 ТипXDTO    = МояФабрикаXDTO.Тип("http://www.ornik.org","DocumentObject.ПриобретениеТоваровУслуг");
					 
		 ОбъектXDTO = МояФабрикаXDTO.Создать(ТипXDTO);							   
					
		 ОбъектДок  = Док.ПолучитьОбъект();
		 ЗаполнитьЗначенияСвойств(ОбъектXDTO,ОбъектДок);
					
                МояФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO,,,, НазначениеТипаXML.Явное);
Показать

Получаем ошибку

Ошибка установки значения свойства 'Ссылка': Ошибка отображения типов:
Отображение типа 'ДокументСсылка.ПриобретениеТоваровУслуг' в тип '{http://www.w3.org/2001/XMLSchema}anySimpleType'

Почему при создании фабрики в описанииТипа ТипXDTO тип свойства Ref меняется на тип anyType вместо type="ns1:DocumentRef.ПриобретениеТоваровУслуг"
Что ему не хватает, что не так?

Причем если использовать глобальную фабрику. при условии что схема записана и существует в ПакетыXDTO, то код работает, но в описанном выше варианте нет.
190. Serg2000mr 311 22.10.23 16:03 Сейчас в теме
Подскажите, как можно получить ОбъектXDTO для группы справочника или плана вида характеристик.

Если получать так:
URIПространстваИмен = "http://v8.1c.ru/8.1/data/enterprise/current-config";
ИмяОбъекта = "ChartOfCharacteristicTypesObject.СтатьиДоходов";
ТипОбъектаXDTO = ФабрикаXDTO.Тип(URIПространстваИмен, ИмяОбъекта);
НовыйОбъектХDTO = ФабрикаXDTO.Создать(ТипОбъектаXDTO);


то там будут лишние свойства при записи в XML, которых не должно быть у группы ПВХ
191. Evil Beaver 8107 22.10.23 16:29 Сейчас в теме
(190) по-моему, отдельного типа нет и надо просто не заполнять свойства, которых нет в группе. Но это не точно, пишу по памяти
Serg2000mr; +1 Ответить
192. Serg2000mr 311 23.10.23 10:12 Сейчас в теме
(191) Да, так и есть, свойства, у которых Неопределено, через ФабрикаXDTO.ЗаписатьXML() не пишутся в XML. Спасибо.
Оставьте свое сообщение