Имя: Пароль:
1C
1С v8
Ошибка впри обработке таблицы значений
,
0 Nysha1210
 
25.12.18
22:57
Всем привет. Задача - нужно результат запроса перебросить в таблицу значений с неизвестным количеством колонок (кол-во колонок вычисляется программно для каждого запроса). Процедура полностью работает, но только при переходе к записи последней колонки - выдаёт ошибку, что превышен лимит ((((( Прошу помощи. Спасибо

    ТекЗаказ = ЭлементыФормы.Список.ТекущаяСтрока;

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекЗаказ",ТекЗаказ);    
    Запрос.Текст = "ВЫБРАТЬ
                   |    ИзмТЧЗак.Период,
                   |    ИзмТЧЗак.Заказ,
                   |    ИзмТЧЗак.Номенклатура,
                   |    ИзмТЧЗак.Автор,
                   |    ИзмТЧЗак.Количество,
                   |    ИзмТЧЗак.Цена,
                   |    ИзмТЧЗак.Сумма,
                   |    ИзмТЧЗак.Операция
                   |ИЗ
                   |    РегистрСведений.ИзмТЧЗак КАК ИзмТЧЗак
                   |ГДЕ
                   |    ИзмТЧЗак.Заказ = &ТекЗаказ";                  
    ЗапросЗ = Запрос.Выполнить().Выгрузить();
    Сообщить(ЗапросЗ.Количество());
    
    ТабШапка= новый ТаблицаЗначений;
    ТабШапка = ЗапросЗ.Скопировать(,"Период,Автор,Операция");
    ТабШапка.Свернуть("Период,Автор,Операция",);
    Сообщить(ТабШапка.Количество());
    
    ТабЗн = новый ТаблицаЗначений;
    ТабЗн.Колонки.Добавить();
    ТекКол=2;
    Для каждого ТабШапкаСтрока из ТабШапка цикл
        Контроль=1;
        ТекОпер=ТабШапкаСтрока.Операция;
        Для каждого ТабСтрока из ЗапросЗ цикл
            Если ТабСтрока.Операция = ТекОпер и Контроль=1 тогда         
                 ТабЗн.Колонки.Добавить();
                 ТабЗн.Колонки.Добавить();
                 ТабЗн.Колонки.Добавить();
                 Сообщить(ТабЗн.Колонки.Количество());
                
                 ТекСтр = ТабЗн.Добавить();
                 ТекСтр.Установить(1,ТабСтрока.Номенклатура);
                 ТекСтр.Установить(ТекКол,ТабСтрока.Количество);
                 ТекКол=ТекКол+1;
                 ТекСтр.Установить(ТекКол,ТабСтрока.Цена);
                 ТекКол=ТекКол+1;
                 ТекСтр.Установить(ТекКол,ТабСтрока.Сумма);
                 Сообщить(ТабЗн.Количество());
            КонецЕсли;
        КонецЦикла;
  КонецЦикла;
1 Nysha1210
 
25.12.18
23:00
{Документ.ЗаказПокупателя.Форма.ФормаСписка.Форма(221)}: Error calling context method (Установить)
                 ТекСтр.Установить(ТекКол,ТабСтрока.Сумма);
because:
Index value exceeds range limits
2 Franchiser
 
гуру
25.12.18
23:05
Колонки таблицы значений нумеруются с 0 по  (количество колонок) - 1.
Ошибка означает, что нет такого номера колонки.
3 palsergeich
 
25.12.18
23:06
А зачем используете Установить?
Не проще Сделать массив имен колонок?
И воспользоваться чем то типо такого
Если МассивКолонок.Найти(ТекКол)<> Неопределено Тогда
ТекСтр[ТекКол] = чемуТоТам;
КонецЕсли
4 palsergeich
 
25.12.18
23:09
А если честно - мне в принципе представленный код не нравится, я бы сделал его раза в 3 короче и понятнее(((
5 Nysha1210
 
25.12.18
23:11
Не использую массив, потому что потом данную таблицу нужно будет свернуть, отсортировать, просумировать часть колонок. С таблицей это проще. Спасибо, с нумерацией попробую разобраться.
6 Nysha1210
 
25.12.18
23:12
Если можете помочь, буду рада. Это первая проба (((
7 palsergeich
 
25.12.18
23:15
(5) Массив - это всего лишь дополнительная абстракция, которая в моей реализации - те колонки, которые должны быть в итоговой таблице.
8 Nysha1210
 
25.12.18
23:19
Ок, спасибо за идеи. Я попробую.
9 Franchiser
 
гуру
25.12.18
23:35
Никто такой код в 8ке уже не пишет: использование ТЗ считается плохим тоном.
Открой для себя Итоги в запросе, временные таблицы, метод ЗаполнитьЗначенияСвойств().
10 Nysha1210
 
25.12.18
23:52
Спасибо. Буду учиться.