Практика 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    145107    843    297    

436

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

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

35000 руб.

23.07.2020    55328    253    73    

207

SALE! 10%

Перенос данных 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 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    73841    196    154    

133

SALE! 10%

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

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

53111 47800 руб.

03.12.2020    38005    106    69    

100

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

16260 руб.

18.02.2016    188759    612    534    

534

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

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

35000 руб.

15.12.2021    25754    182    55    

139

SALE! 10%

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

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

48278 43450 руб.

25.02.2015    173023    310    261    

386

SALE! 10%

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

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

55778 50200 руб.

24.04.2015    197193    157    244    

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

имяф=ПолучитьИмяВременногоФайла("xsd");
рМакет=ПолучитьМакет("МакетСоСхемой");
рЧтение=Новый ЧтениеXML;
Если ТипЗнч(рМакет)=Тип("ДвоичныеДанные") Тогда
	рМакет.Записать(имяф);
	рЧтение.ОткрытьФайл(имяф);
ИначеЕсли ТипЗнч(рМакет)=Тип("ТекстовыйДокумент") Тогда
	рЧтение.УстановитьСтроку(рМакет.ПолучитьТекст());
КонецЕсли;
//
пострДОМ=Новый ПостроительDOM;
докДОМ=пострДОМ.Прочитать(рЧтение);
//
пострСхем=Новый ПостроительСхемXML;
рСхема=пострСхем.СоздатьСхемуXML(докДОМ.ЭлементДокумента);
Если рСхема<>Неопределено Тогда
	// делаем, что надо
КонецЕсли;
Показать
15. ids79 8611 24.09.19 22:45 Сейчас в теме
Спасибо за статью.
У меня такой вопрос, можно ли каким-то образом дополнить стандартную фабрику XTDO дополнительным пакетом "на лету"? Например, загрузить дополнительную схему xsd из макета.
На сколько я знаю, нет. Но может быть я ошибаюсь...
16. Yashazz 4824 24.09.19 23:41 Сейчас в теме
(15) Первое, что приходит в голову, это вывалить схему в файл, тупо его покрыжить как текст, вставив в нужное место нужный блок, и прочитать обратно. Но это всё равно не "стандартная фабрика", а новую фабрику делать придётся на основании этой дополненной схемы.
18. ids79 8611 25.09.19 09:40 Сейчас в теме
(16) С новой то фабрикой все понятно. Я имел в виду именно основную. Но похоже нет такой возможности
21. Yashazz 4824 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 4824 25.09.19 13:31 Сейчас в теме
(17) О дааа. Сколько я мучился, пытаясь в своё время скормить схему, валидную с точки зрения других приложений, 1С - это была песня. Экспериментально выявил ряд мест, которые 1С не нравятся, но иногда из-за них надо по смыслу курочить схему, поэтому упс.
Согласен.
19. PLAstic 296 25.09.19 09:56 Сейчас в теме
Не соглашусь насчёт "полноты" и "тру". Если бы кто-то занимался плотно хдто, он давно бы озвучил в своих статьях, что у платформы 1С есть большие проблемы.
* Определяем тип объекта, реквизит и значение по умолчанию для него. Создаём объект. Видим в окне отладки, что реквизиту присвоено дефолтное значение. Сериализуем в json - реквизита нет (в xml не проверял, но думаю, так же). Нет его потому, что значение по умолчанию просто показывается нам в окне отладки, но на самом деле не присваивается реквизиту полноценно. Ошибка зарегана в 1С для рассмотрения. Не знаю уж, примут или нет.
* Создаём пустой список xdto, сериализуем в json. Списка нет. Вообще.
* Окей, может это проблема сериализации? Определяем пустой массив в соответствии с RFC8259: "array":[] Пытаемся его десериализовать в объект с реквизитом-списком: ошибка. Говорит, странное окончание тега в районе "]".
* Сейчас точно не вспомню, но есть сложности с сериализацией/десериализацией "null".

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

С этим как в моём случае помочь не разобрался.
32. gml 09.02.25 10:44 Сейчас в теме
(30)
В XML имена префиксов не играют никакой роли (кроме наглядности для чтения человеком). Парсеру, который будет разбирать этот текст, без разницы: d2p1 или ns1. Важно только значение пространства имен "http://etpgpb.ru/223fz/types/1", поставленное в соответствие этому префиксу.

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