Имя: Пароль:
1C
 
Одна или несколько строк в выборке XDTO: Итератор для значения не определен
0 romix
 
30.10.14
00:43
При выборке данных из XDTO получение значений сбоит на ситуации, когда, например, в табличной части загружаемого документа есть только одна строка. Приходится анализировать тип (список там или объект) и дублировать код загрузки этой строки. Отдельный случай - когда в табличной части совсем нет строк.

    Если Данные.Свойства().Получить("Контрагенты")=Неопределено Тогда
        //Нет контрагентов
    ИначеЕсли Данные.Контрагенты.Свойства().Получить("Строка")=Неопределено Тогда
        //Нет строк        
    ИначеЕсли ТипЗнч(Данные.Контрагенты.Строка)=Тип("СписокXDTO") Тогда        
        Для Каждого зн из Данные.Контрагенты.Строка Цикл
            сКонтрагенты.Вставить(ч(зн.Код), зн.Наименование);
        КонецЦикла;    
    ИначеЕсли  ТипЗнч(Данные.Контрагенты.Строка)=Тип("ОбъектXDTO") Тогда        
        зн=Данные.Контрагенты.Строка;
        сКонтрагенты.Вставить(ч(зн.Код), зн.Наименование);
    КонецЕсли;


Вопрос: есть ли более аккуратный способ обработать все три варианта загрузки, чтобы не дублировать код?
1 FlashC
 
30.10.14
00:46
(9) можно
2 FlashC
 
30.10.14
00:46
+(1) можно, конечно...
3 FlashC
 
30.10.14
00:48
(0) для начала проанализируй условия... потом вопросы
4 Armando
 
30.10.14
03:08
Тож сталкивался с этим. С первого раза не понял как решить. В итоге оставил проверку на СписокXDTO и на ОбъектXDTO.
5 romix
 
30.10.14
19:28
Сделал функцию, которая возвращает массив структур.

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