При выборке данных из XDTO получение значений сбоит на ситуации, когда, например, в табличной части загружаемого документа есть только одна строка. Приходится анализировать тип (список там или объект) и дублировать код загрузки этой строки. Отдельный случай - когда в табличной части совсем нет строк.
Если Данные.Свойства().Получить("Контрагенты")=Неопределено Тогда
//Нет контрагентов
ИначеЕсли Данные.Контрагенты.Свойства().Получить("Строка")=Неопределено Тогда
//Нет строк
ИначеЕсли ТипЗнч(Данные.Контрагенты.Строка)=Тип("СписокXDTO") Тогда
Для Каждого зн из Данные.Контрагенты.Строка Цикл
сКонтрагенты.Вставить(ч(зн.Код), зн.Наименование);
КонецЦикла;
ИначеЕсли ТипЗнч(Данные.Контрагенты.Строка)=Тип("ОбъектXDTO") Тогда
зн=Данные.Контрагенты.Строка;
сКонтрагенты.Вставить(ч(зн.Код), зн.Наименование);
КонецЕсли;
Вопрос: есть ли более аккуратный способ обработать все три варианта загрузки, чтобы не дублировать код?
Сделал функцию, которая возвращает массив структур.
Функция ПолучитьИзXDTO(Данные)
мРезультат=Новый Массив;
Если ТипЗнч(Данные)=Тип("СписокXDTO") Тогда
Для Каждого зн из Данные Цикл
пСвойства=зн.Свойства();
ст=Новый Структура;
Для Каждого св из пСвойства Цикл
ст.Вставить(св.Имя, зн[св.Имя]);
КонецЦикла;
мРезультат.Добавить(ст);
КонецЦикла;
Иначе //Если ТипЗнч(Данные)=Тип("ОбъектXDTO") Тогда
зн=Данные.Контрагенты.Строка;
пСвойства=зн.Свойства();
ст=Новый Структура;
Для Каждого св из пСвойства Цикл
ст.Вставить(св.Имя, зн[св.Имя]);
КонецЦикла;
мРезультат.Добавить(ст);
КонецЕсли;
Возврат мРезультат;
КонецФункции
Прошелся поиском в партнерском форуме:
Вот например:
"Платформа определяет наличие списка значений свойства по максимальному количеству, указанному в определении типа (в XSD-схеме это соответствует атрибуту maxOccurs)." И если AnyType тож такое поведение будет