Практика 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 Принципы для чайников

См. также

Перенос данных 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 руб.

12.06.2017    138319    764    292    

405

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

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

28000 руб.

15.12.2021    21912    144    40    

104

Перенос данных 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 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    70483    174    146    

117

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

Переход и перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.227.x), ERP 2.5 (2.5.16.x), КА 2.5 (2.5.16.x) .

28000 руб.

24.06.2020    62449    51    27    

81

SALE! %

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

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 27000 руб.

24.04.2015    192605    143    241    

274

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

В продаже с 2015 года | Воспользовались более 287 предприятий! | Перенос данных из УПП 1.3 в БП 3.0 | из КА 1.1 в БП 3.0 | Переносятся документы, начальные остатки и вся справочная информация | Сэкономьте свое время - используйте готовое решение для перехода! | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

39500 руб.

25.02.2015    169822    294    253    

374

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

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

14580 руб.

18.02.2016    184666    573    509    

516

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

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

28000 руб.

23.07.2020    48536    208    64    

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

имяф=ПолучитьИмяВременногоФайла("xsd");
рМакет=ПолучитьМакет("МакетСоСхемой");
рЧтение=Новый ЧтениеXML;
Если ТипЗнч(рМакет)=Тип("ДвоичныеДанные") Тогда
	рМакет.Записать(имяф);
	рЧтение.ОткрытьФайл(имяф);
ИначеЕсли ТипЗнч(рМакет)=Тип("ТекстовыйДокумент") Тогда
	рЧтение.УстановитьСтроку(рМакет.ПолучитьТекст());
КонецЕсли;
//
пострДОМ=Новый ПостроительDOM;
докДОМ=пострДОМ.Прочитать(рЧтение);
//
пострСхем=Новый ПостроительСхемXML;
рСхема=пострСхем.СоздатьСхемуXML(докДОМ.ЭлементДокумента);
Если рСхема<>Неопределено Тогда
	// делаем, что надо
КонецЕсли;
Показать
15. ids79 8449 24.09.19 22:45 Сейчас в теме
Спасибо за статью.
У меня такой вопрос, можно ли каким-то образом дополнить стандартную фабрику XTDO дополнительным пакетом "на лету"? Например, загрузить дополнительную схему xsd из макета.
На сколько я знаю, нет. Но может быть я ошибаюсь...
16. Yashazz 4763 24.09.19 23:41 Сейчас в теме
(15) Первое, что приходит в голову, это вывалить схему в файл, тупо его покрыжить как текст, вставив в нужное место нужный блок, и прочитать обратно. Но это всё равно не "стандартная фабрика", а новую фабрику делать придётся на основании этой дополненной схемы.
18. ids79 8449 25.09.19 09:40 Сейчас в теме
(16) С новой то фабрикой все понятно. Я имел в виду именно основную. Но похоже нет такой возможности
21. Yashazz 4763 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 4763 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 4763 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 4763 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. пакет у корневого Объекта есть свойсва имеющие как "простые" элементы, так и элементы содержащие в себе свои свойства, в том числе списки. Глубина вложенности элементов разная. Одно свойство корневого элементв напоминает дерево с списком в конце. Руками сделал, но хочется универсальное решение найти. Видел чтение, но там структура данных и данные в "одном флаконе" не совсем подходит.
Оставьте свое сообщение