Практика XDTO. Нюансы

23.09.19

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Некоторые практические моменты работы с XDTO. Дополнения к очевидному.

Основой работы является принцип создания экземпляров данных на основании метаданных, т.е. так же, как в "обычной" 1С. Метаданными выступают XDTO-пакеты, в которых прописаны типы и свойства объектов, допустимые значения, форматы значений, словом - та же конфигурация (недаром и саму конфигурацию можно выгрузить в xsd, а по утверждениям некоторых, 1С так внутри себя и работает). Экземплярами выступают конкретные XDTO-объекты и значения. Созданием и управлением всем этим занимаются фабрики XDTO, а если речь идёт о встроенных объектах 1С, то ещё сериализаторы. И об объектах, и о свойствах, и о фабриках есть множество хороших статей, поэтому баянить не буду, а обозначу некоторые тонкости, которые недостаточно освещены. Поскольку в чести последнее время практика, то ею и займёмся, а теория - в другой раз.

Для работы нужны: пространство имён, в пределах которого уникальны имена метаданных, и фабрика, в пакеты которой входят все нужные описания всех типов, их форматов и допустимых значений.

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

Пространства имён обычно получают так:

УРИ=Метаданные.ПакетыXDTO.<ИмяВашегоПакета>.ПространствоИмен; // если он встроен в метаданные
// или
УРИ=ФабрикаXDTO.Пакеты.Получить(УРИилиНомерВашегоПакета).URIПространстваИмен; // в общем случае

Создание экземпляра по метаданным это, как мы знаем:

хдтоОбъект=ФабрикаXDTO.Создать(хдтоТип);

Но откуда берётся сам тип? В простейшем случае он описан и получается по имени и пространству имён, например:

 

 

Тип напрямую чётко указан и так же просто берётся:

типКонтрагент=ФабрикаXDTO.Тип(УРИ,"Контрагент");

Возможна следующая ситуация, когда тип не самостоятелен, а описан в свойстве:

 

 

В этом случае тип следует получать из свойства исходного типа, а если у этого свойства есть своё определение, то разыменовывая из него:

типСтавкиНалогов=ФабрикаXDTO.Тип(УРИ,"Товар").Свойства.Получить("СтавкиНалогов").Тип;
типСтавкаНалога=ТипСтавкиНалогов.Свойства.Получить("СтавкаНалога").Тип;

Типизация некоего свойства может указывать на корневое:

 

 

Аналогично, тип для создания экземпляра получаем из свойства:

типПакет=ФабрикаXDTO.Пакеты.Получить(<УРИилиНомерВашегоПакета>).КорневыеСвойства.Получить("ПакетПредложений").Тип;

также, если значение есть, можно вытащить из него:

типХДТО=ОбъектИлиЗначение.Тип;

Ещё, работая с дочерними полями, удобно использовать метод ВладеющееСвойство().

 

И вот, мы можем создать наш объект: хдтоОбъект=ФабрикаXDTO.Создать(типОбъекта).

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

С присвоением свойств есть несколько тонкостей.

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

// вместо
хдтоТовар.Артикул=СокрЛП(Артикул);
// если объявлен тип, то надо так:
хдтоТовар.Артикул=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(УРИ,"АртикулТип"),СокрЛП(Артикул));

Во-вторых, реквизиты, имеющие списочный тип (список XDTO может начинаться с 0, с 1, с любой мин.границы, но всегда верхняя будет -1) - так вот списочные иногда требуют создания промежуточной переменной-списка:

// простой случай
хдтоОбъект.СписочноеСвойство.Добавить(хдтоЭлементСписка);
// через объект-коллекцию
хдтоСписок=ФабрикаXDTO.Создать(типСписка);
хдтоСписок.СписочноеСвойство.Добавить(хдтоЭлементСписка);
хдтоОбъект.СписочноеСвойство=хдтоСписок;

и иногда это единственно верный вариант.

В третьих, наивно ожидать от просмотра в отладчике, что вам откроется истина. В огромном количестве случаев значения реквизитов объекта будут пусты, а их тип "Неопределено", и вы ничего не поймёте. Поэтому - смотрите объявления в пакете, смотрите свойства. Наиболее важны для объектов - базовый тип, упорядоченность, смешанность; для свойств - тип и возможность пустого. Не верьте отладчику.

 

Некоторые сетуют, что-де формат XDTO есть данность и её не расширить. Это не совсем так, и этим пакеты отличаются от метаданных 1С. Если тип объекта имеет свойство "Открытый" = Истина, то можно прямо на лету добавлять всё, что заблагорассудится, в рамках допустимых типов, конечно:

знч=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(УРИ,"СтрокаТип"),"Добавляю, как хочу");
хдтоОбъект.Добавить(ФормаXML.Элемент,УРИ,"МоеДопПоле",знч);
//
// и будет это <МоеДопПоле>Добавляю, как хочу</МоеДопПоле>	

Правда, вы потом это доп.поле не удалите из экземпляра, а только сможете сбросить или очистить. Но для разных экземпляров одного типа вы сможете понадобавлять, что захотите. Правда, читающему в рамках ожидаемой xsd такая самодеятельность добавит проблем.

 

Когда объект создан, его можно записать в реквизит некоего "старшего" объекта, или добавить в коллекцию однотипных собратьев. Можно и просто засунуть в нужное место хмл-текста. Прямо целиком. Например:

// в этом примере УРИ взято из CML 2.Х
Запись=Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("КоммерческаяИнформация");
ФабрикаXDTO.ЗаписатьXML(Запись,хдтоКонтрагент,,УРИ,ФормаXML.Элемент,НазначениеТипаXML.Неявное);

Тут есть тонкость, связанная с пространством имён и локальными именами. Третьим параметром рекомендую указывать локальное имя, если оно есть или возможен конфликт с контекстом, куда пихается хдто. Для экземпляров "старших" типов оно совпадает с именем типа, для остальных можно получать его через ВладеющееСвойство() или Свойство.

А вот с пространством имён сложнее. У 1С всегда есть пространство по умолчанию, и пишется оно в xmlns без префикса. И вот если, впихивая хдто в ЗаписьХМЛ, вы его не укажете, то оно будет дописано в тег сериализованного экземпляра, т.е. в нашем случае <Контрагент xmlns="urn:1C.ru:commerceml_2">. Если тегу, в который вносится хдто, указать пространство имён в виде 

Запись.ЗаписатьНачалоЭлемента("КоммерческаяИнформация", УРИ);

то 1С сгенерирует явный префикс и всё вложенное пустит с уточнением, какое это пространство имён:

<d1p1:КоммерческаяИнформация xmlns:d1p1="urn:1C.ru:commerceml_2">
и все вложенные без конкретизации будут идти с ним же: <d1p1:Контрагент>

Поэтому рекомендую и при обычной, и при смешанной записи хдто в хмл явно указывать сопоставления, например:

Запись.ЗаписатьСоответствиеПространстваИмен("","urn:1C.ru:commerceml_2"); // так делается УРИ по умолчанию
Запись.ЗаписатьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance");

ну и так далее.

Кстати, превращение хдто в хмл, а его в текст, и затем ЗаписатьБезОбработки - тоже полезная штука, но тут примеров и без меня полно.

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

Пока Чтение.Прочитать() Цикл
	Если Чтение.ЛокальноеИмя="НужноеНам" Тогда // например, так нашли нужное
		хдтоОбъект=ФабрикаXDTO.ПрочитатьXML(Чтение,типОбъекта); Прервать
	КонецЕсли;
КонецЦикла;

 

Собственно, всё. Ну и советую не забывать про хдтоОбъект.Проверить(), иногда реально ловит невалидные и незаметные ситуации.

Советую всем статьи Evil Beaver'a, ибо они полны, точны и актуальны, и вообще труЪ.

Основы XDTO Принципы для чайников

См. также

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134965    721    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68430    179    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34174    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46315    196    64    

158

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9217    9    8    

10

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 25200 руб.

15.12.2021    20260    132    38    

90

SALE! 10%

Перенос данных из БП 3.0 в УНФ 3.0 / УНФ 1.6. Переносятся остатки, документы и справочная информация

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

В продаже с 2018г. | Воспользовались более 41 предприятия! | Правила конвертации (КД 2) для переноса данных из БП 3 в УНФ | Переносятся все виды документов, начальные остатки и вся возможная справочная информация | Есть фильтр по организациям | Оперативно обновляем на новые релизы | Оказываем техподдержку | В комплект файлов входит инструкция, авторская версия обработки "Универсальный обмен...", актуальные правила переноса данных и архив старых версий переноса | Учет в БП 3 должен быть корректным, некорректные данные не переносятся | Можно бесплатно проверить на вашем сервере до покупки!

50722 45650 руб.

10.07.2018    67455    41    122    

46

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150739    365    375    

501
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4709 23.09.19 14:02 Сейчас в теме
Коллеги, у меня одного картинка задвоилась, или это реально так?
Прикрепленные файлы:
2. AlX0id 23.09.19 14:09 Сейчас в теме
3. Yashazz 4709 23.09.19 14:34 Сейчас в теме
(2) и вот такой ерунды, как на скриншоте, не наблюдается?
4. user774630 23.09.19 14:50 Сейчас в теме
7. AlX0id 23.09.19 15:12 Сейчас в теме
5. ВикторП 342 23.09.19 14:53 Сейчас в теме
Еще есть вариант отображения
Прикрепленные файлы:
6. Sashares 34 23.09.19 14:56 Сейчас в теме
10. triviumfan 93 24.09.19 00:01 Сейчас в теме
Доступно написано, спасибо.
8. Yashazz 4709 23.09.19 15:15 Сейчас в теме
Короче руки у меня кривые, или браузер... Печаль... Спасибо, коллеги, а то даже проверить было не на чем.
9. Yashazz 4709 23.09.19 22:26 Сейчас в теме
Поправка: в строке кода
типПакет=ФабрикаXDTO.Пакеты.Получить().КорневыеСвойства.Получить("ПакетПредложений").Тип;
естественно Пакеты.Получить(<НомерПакетаИлиУРИ>)
11. Trotter_NN 24.09.19 16:30 Сейчас в теме
как хранить xsd схему в общих макетах ? для мобильного приложения
Прикрепленные файлы:
12. Yashazz 4709 24.09.19 17:07 Сейчас в теме
(11) Можно как файл, можно как текстовый макет; без разницы. Она по сути есть плоский текст, не более. А дальше прочитать из макета, загнать в DOM, оттуда в построитель схем ХМЛ, метод СоздатьСхемуXML и всё.
13. Trotter_NN 24.09.19 17:46 Сейчас в теме
(12)
На моей картинке только несколько вариантов, можно пример с двоичными данными ?
14. Yashazz 4709 24.09.19 18:58 Сейчас в теме
(13) Да без разницы, двоичные или нет.

имяф=ПолучитьИмяВременногоФайла("xsd");
рМакет=ПолучитьМакет("МакетСоСхемой");
рЧтение=Новый ЧтениеXML;
Если ТипЗнч(рМакет)=Тип("ДвоичныеДанные") Тогда
	рМакет.Записать(имяф);
	рЧтение.ОткрытьФайл(имяф);
ИначеЕсли ТипЗнч(рМакет)=Тип("ТекстовыйДокумент") Тогда
	рЧтение.УстановитьСтроку(рМакет.ПолучитьТекст());
КонецЕсли;
//
пострДОМ=Новый ПостроительDOM;
докДОМ=пострДОМ.Прочитать(рЧтение);
//
пострСхем=Новый ПостроительСхемXML;
рСхема=пострСхем.СоздатьСхемуXML(докДОМ.ЭлементДокумента);
Если рСхема<>Неопределено Тогда
	// делаем, что надо
КонецЕсли;
Показать
15. ids79 8291 24.09.19 22:45 Сейчас в теме
Спасибо за статью.
У меня такой вопрос, можно ли каким-то образом дополнить стандартную фабрику XTDO дополнительным пакетом "на лету"? Например, загрузить дополнительную схему xsd из макета.
На сколько я знаю, нет. Но может быть я ошибаюсь...
16. Yashazz 4709 24.09.19 23:41 Сейчас в теме
(15) Первое, что приходит в голову, это вывалить схему в файл, тупо его покрыжить как текст, вставив в нужное место нужный блок, и прочитать обратно. Но это всё равно не "стандартная фабрика", а новую фабрику делать придётся на основании этой дополненной схемы.
18. ids79 8291 25.09.19 09:40 Сейчас в теме
(16) С новой то фабрикой все понятно. Я имел в виду именно основную. Но похоже нет такой возможности
21. Yashazz 4709 25.09.19 13:32 Сейчас в теме
(18) Похоже, нет. Это всё равно что новый объект в метаданные "на лету" добавлять. Может, сборка/разборка в файлы и даст эффект, но всё равно костыль, а других вариантов не вижу.
17. genayo 25.09.19 08:45 Сейчас в теме
Следует отметить, что в реализации XDTO есть проблемы, некоторые валидные XSD-схемы оно не понимает, и в этом случае понять, что не так, достаточно сложно. Например, обсуждение здесь https://forum.mista.ru/topic.php?id=840840
20. Yashazz 4709 25.09.19 13:31 Сейчас в теме
(17) О дааа. Сколько я мучился, пытаясь в своё время скормить схему, валидную с точки зрения других приложений, 1С - это была песня. Экспериментально выявил ряд мест, которые 1С не нравятся, но иногда из-за них надо по смыслу курочить схему, поэтому упс.
Согласен.
19. PLAstic 295 25.09.19 09:56 Сейчас в теме
Не соглашусь насчёт "полноты" и "тру". Если бы кто-то занимался плотно хдто, он давно бы озвучил в своих статьях, что у платформы 1С есть большие проблемы.
* Определяем тип объекта, реквизит и значение по умолчанию для него. Создаём объект. Видим в окне отладки, что реквизиту присвоено дефолтное значение. Сериализуем в json - реквизита нет (в xml не проверял, но думаю, так же). Нет его потому, что значение по умолчанию просто показывается нам в окне отладки, но на самом деле не присваивается реквизиту полноценно. Ошибка зарегана в 1С для рассмотрения. Не знаю уж, примут или нет.
* Создаём пустой список xdto, сериализуем в json. Списка нет. Вообще.
* Окей, может это проблема сериализации? Определяем пустой массив в соответствии с RFC8259: "array":[] Пытаемся его десериализовать в объект с реквизитом-списком: ошибка. Говорит, странное окончание тега в районе "]".
* Сейчас точно не вспомню, но есть сложности с сериализацией/десериализацией "null".

Открытые типы, как верно было сказано, ставят крест на десериализации. У вас описана схема, вы по ней работаете год и тут бац - механизм накрылся. Смотрим - новое св-во зашло в объект. Или вдруг целое значение стало дробным. По хорошему, поставщикам API нужно версионировать схемы и предоставлять возможность подписки на эти изменения, чтобы пользователи схемы имели время перестроить свои системы на новую версию к сроку её включения. Но это уже не проблемы платформы...
22. Yashazz 4709 25.09.19 13:35 Сейчас в теме
(19) Согласен.
1. Да, есть такой эффект, потому и написал, что отладчику веры нет.
2. В хмл одно время была та же фигня, не проверял, есть ли такое в наши дни.
3. А вот на скобку у меня не жаловался. Какие были свойства у этого списка в хдто-пакете? Было разрешено, что он с 0 элементов, пустой?
4. Был какой-то релиз 8.3.8, который литерал null чуть ли не как директиву воспринимал. Других эффектов не помню.
23. PLAstic 295 25.09.19 16:03 Сейчас в теме
(22)
3. Да, конечно! Вот переписка с 1С:

Платформа: 1С:Предприятие 8.3 (8.3.13.1513)

Пытаюсь парсить текст JSON по схеме XDTO.

Текст:

{
"msgsRendered": 0,
"stats": []
}

В схеме он описан так:

<xs:schema xmlns:tns="http://wialon.dominantsugar.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://wialon.dominantsugar.ru" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="reportResult1">
<xs:sequence>
<xs:element name="msgsRendered" type="xs:int"/>
<xs:element name="stats" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

Получаю ошибку:

{Обработка.ПарсингXDTO.Форма.Форма.Форма(9)}: Ошибка при вызове метода контекста (ПрочитатьJSON)
ПакетОтвет = ФабрикаXDTO.ПрочитатьJSON(ЧтениеJSON, ФабрикаXDTO.Тип("http://wialon.dominantsugar.ru", Объект.ИмяТипа));
по причине:
Ошибка преобразования данных XDTO:
КонецСвойства: Форма: Элемент Тип: {http://wialon.dominantsugar.ru}reportResult1

Вот код:

&НаСервере
Процедура ЗамочитьНаСервере()

ТекстОтвета = "{""msgsRendered"":0,""stats"":[]}";
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
ПакетОтвет = ФабрикаXDTO.ПрочитатьJSON(ЧтениеJSON, ФабрикаXDTO.Тип("http://wialon.dominantsugar.ru", "reportResult1"));

КонецПроцедуры

Открыл RFC8259:
5. Arrays
An array structure is represented as square brackets surrounding zero
or more values (or elements). Elements are separated by commas.

array = begin-array [ value *( value-separator value ) ] end-array

There is no requirement that the values in an array be of the same
type.

Перевод:

Массив представлен в виде квадратных скобок, окружающих ноль или более значений (или элементов). Элементы разделяются запятыми.

Следовательно, описание "stats": [] декларирует пустой массив в соответствии со стандартом.
Показать

Отправил им вложением схему XSD. Как водится, после этого странной квалификации специалист ответил, что им нужен "тестовый пример для воспроизведения и расследования". Т.е. этого примера недостаточно. Ошибку не регали.
Спустя несколько дней (ошибка не давала мне покоя) я выяснил ещё детали:
Я провёл дополнительные исследования. Похоже, платформа даже при указанном nillable="true" у массива всё равно требует указания какого-нибудь содержимого и удивляется внезапно появившемуся следующему элементу пакета (в данном случае это окончание описания типа – закрывающая фигурная скобка).
Если мы опишем stats как "stats": [""], то ошибки не будет, но в данном случае будет представлен не пустой массив, а массив из одного элемента – пустой строки. В случае примитивного типа элемента массива – string – всё будет хорошо, но если представить в таком виде массив, у которого тип элементов не примитивный, а является типом объектов XDTO, то возникнет необрабатываемое исключение.

Описание реквизита-массива с объектным типом элементов:
[тут была картинка]
Первый вариант. Передаваемый текст:

{"attachments":[]}

Реакция платформы:

Ошибка преобразования данных XDTO:
КонецСвойства: Форма: Элемент Тип: {http://wialon.dominantsugar.ru}reportResult1

Второй вариант. Передаваемый текст:

{"attachments":[""]}

Реакция платформы:
[тут была картинка с крашем платформы]

Информация для тех.поддержки не сильно информативнее:

Платформа: 1С:Предприятие 8.3 (8.3.13.1513)
Конфигурация: XDTO
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский
Вариант интерфейса: Такси

Ошибки:
--------------------------------------------------------------------------------
14.12.2018 15:53:24
Недопустимое значение аргумента функции
[xdto - src\XDTOFactoryImpl.cpp (414)]
Показать
24. Yashazz 4709 25.09.19 22:23 Сейчас в теме
(23) ну красота, что тут скажешь... спасибо за информацию.
25. user645801_yyyuuu123q 21.12.19 03:13 Сейчас в теме
типСтавкиНалогов=ФабрикаXDTO.Тип(УРИ,"Товар").Свойства.Получить("СтавкиНалогов").Тип;
типСтавкаНалога=ТипСтавкиНалогов.Свойства.Получить("СтавкаНалога").Тип;

Друзья объяснить пожалуйста откуда взялся "Товар"? И на что он указывает автор скриншоты не до конца вставил кажется
26. user645801_yyyuuu123q 21.12.19 03:21 Сейчас в теме
Вот у Меня точно такая же ситуация.

GetInform = ФабрикаXDTO.Тип("Nikita"," ").Свойства.Получить("UseGZIPBinary").Тип
Из статьи совершенно не понял какой тип Мне все таки нужно указать. Помогите пожалуйста
Прикрепленные файлы:
27. user645801_yyyuuu123q 21.12.19 03:32 Сейчас в теме
Ошибка проверки модели XDTO: xdto-objectType-1.2.1 тип: Товар свойство: GetInform пакет: Nikita
Определение анонимного типа не может содержать имени 'Товар'
Ошибка проверки модели XDTO: xdto-package-4.4 пакет: Nikita
Тип глобального свойства 'GetInform' не найден в пакете типов 'Nikita' и его зависимостях
Прикрепленные файлы:
28. dadel 19 29.09.20 08:56 Сейчас в теме
Доброго времени!
Не силен в XDTO, разбираюсь.
Вопрос в тему, может кто подскажет?
Делаю интеграцию с ЭТП. Получаю схему от площадки. Есть там набор процедур. В одной процедуре, если не указывать параметры, то получаю в ответе листинг из 15 последних закупочных процедур. В SoapUI я без удаляю просто все параметры и ответ приходит как положено.
Но вот в обработке как мне удалить все параметры? Не заполнять их - они всё равно отправляются с значением Неопределено.
Вот листинг исходный:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:proc="http://etpgpb.ru/223fz/api/procurement" xmlns:ns="http://etpgpb.ru/223fz/purchase/1" xmlns:ns1="http://etpgpb.ru/223fz/types/1">
   <soapenv:Header/>
   <soapenv:Body>
      <proc:ProcedureListRequest>
         <ns:header>
            <ns1:MessageId>b1a7f2d9-ef45-4713-8d53-26ba3e53cbab</ns1:MessageId>
            <ns1:createDateTime>2020-09-28T14:35:58+03:00</ns1:createDateTime>
            <!--Optional:-->
            <ns1:AuthInfo>
               <ns1:Login>Логин</ns1:Login>
               <ns1:Password>Пароль</ns1:Password>
            </ns1:AuthInfo>
         </ns:header>
         <ns:body>
            <ns:itemData>
               <!--Optional:-->
               <ns:lot_statuses>
                  <!--Optional:-->
                  <ns:lot_status>?</ns:lot_status>
               </ns:lot_statuses>
               <!--Optional:-->
               <ns:contragent_id>?</ns:contragent_id>
               <!--Optional:-->
               <ns:procedure_id>30912</ns:procedure_id>
               <!--Optional:-->
               <ns:remote_id>?</ns:remote_id>
               <!--Optional:-->
               <ns:registry_number>?</ns:registry_number>
               <!--Optional:-->
               <ns:eis_statuses>
                  <!--Optional:-->
                  <ns:eis_status>?</ns:eis_status>
               </ns:eis_statuses>
               <!--Optional:-->
               <ns:procedure_types>
                  <!--Optional:-->
                  <ns:procedure_type>?</ns:procedure_type>
               </ns:procedure_types>
               <!--Optional:-->
               <ns:limit>?</ns:limit>
               <!--Optional:-->
               <ns:date_published_from>?</ns:date_published_from>
               <!--Optional:-->
               <ns:date_published_to>?</ns:date_published_to>
               <!--Optional:-->
               <ns:date_last_updated_from>?</ns:date_last_updated_from>
            </ns:itemData>
         </ns:body>
      </proc:ProcedureListRequest>
   </soapenv:Body>
</soapenv:Envelope>
Показать

Этот код выдает ошибку в ответе.
А вот такой работает корректно:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:proc="http://etpgpb.ru/223fz/api/procurement" xmlns:ns="http://etpgpb.ru/223fz/purchase/1" xmlns:ns1="http://etpgpb.ru/223fz/types/1">
   <soapenv:Header/>
   <soapenv:Body>
      <proc:ProcedureListRequest>
         <ns:header>
            <ns1:MessageId>a9c8b76c-1572-4267-95e7-9b202d81a285</ns1:MessageId>
            <ns1:createDateTime>2020-09-28T15:00:00+03:00</ns1:createDateTime>
            <!--Optional:-->
            <ns1:AuthInfo>
               <ns1:Login>Логин</ns1:Login>
               <ns1:Password>Пароль</ns1:Password>
            </ns1:AuthInfo>
         </ns:header>
         <ns:body>
            <ns:itemData>
        
            </ns:itemData>
         </ns:body>
      </proc:ProcedureListRequest>
   </soapenv:Body>
</soapenv:Envelope>
Показать

itemData тут пустой. Есть что подсказать, как это сделать в обработке обмена?
Прикрепленные файлы:
29. dadel 19 29.09.20 10:40 Сейчас в теме
Вопрос снят. Сам XML формируется нормально, без параметров. Ошибка в чем-то пока не понимаю - в другом...
30. dadel 19 09.10.20 16:00 Сейчас в теме
И продолжение ещё.
В SoapUI формируется с правильными заголовками, вот так:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:proc="http://etpgpb.ru/223fz/api/procurement" xmlns:ns="http://etpgpb.ru/223fz/purchase/1" xmlns:ns1="http://etpgpb.ru/223fz/types/1">

А в 1С у меня уходит запрос совсем уже не с такими префиксами. Схему получаю от запрашиваемого источника динамически.
XML формируется вот таким, начало тела:
<?xml version="1.0" encoding="UTF-8"?>
<BodyPurchaseNotice xmlns="http://etpgpb.ru/223fz/purchase/1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<itemData xmlns:d2p1="http://etpgpb.ru/223fz/types/1">
		<d2p1:guid>f66561c5-073c-4d31-b994-6c92768c6ff6</d2p1:guid>
		<d2p1:remote_id>7ef5568f-bdca-4f23-bdf5-b56aa7721d14</d2p1:remote_id>
		<d2p1:procedure_number2>000000003</d2p1:procedure_number2>
		<d2p1:version>1</d2p1:version>
		<d2p1:procedure_title>Текст ПРЕДМЕТ ДОГОВОРА</d2p1:procedure_title>
		<d2p1:procedure_type>PROPOSALREQUEST</d2p1:procedure_type>
		<d2p1:customer_procedure_type>100</d2p1:customer_procedure_type>
		<d2p1:contact_info>
			<d2p1:contact_email/>
Показать

Откуда тут этот префикс d2p взялся и как его вернуть к ns?
Не пинайте строго, пока не разобрался.
СтрокаXML.ЗаписатьСоответствиеПространстваИмен("ns1", "http://etpgpb.ru/223fz/types/1");

С этим как в моём случае помочь не разобрался.
31. user1035175 2 27.12.20 09:29 Сейчас в теме
Есть у кого алгоритм рекурсивного заполнения XDTO объекта? Есть XDTO. пакет у корневого Объекта есть свойсва имеющие как "простые" элементы, так и элементы содержащие в себе свои свойства, в том числе списки. Глубина вложенности элементов разная. Одно свойство корневого элементв напоминает дерево с списком в конце. Руками сделал, но хочется универсальное решение найти. Видел чтение, но там структура данных и данные в "одном флаконе" не совсем подходит.
Оставьте свое сообщение