Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Ошибка впри обработке таблицы значений

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует