|
Получение элемента по индексу для значения не определено (Таблица значений) | ☑ | ||
---|---|---|---|---|
0
marshalbratsk
02.12.16
✎
09:14
|
Имеется запрос, результатом которого является таблица значений.
Далее необходимо в таблице значений у одинаковых контрагентов объединить строки в столбце Стоимость посчитать сумму по данному контрагенту, а в столбце СчетЗатрат сложить значения ячеек через запятую. Написал кусок кода (Да, я понимаю, что он работать не будет как мне надо, но он мне нужен как опорная точка) и он на первом же обращению по индексу строки выдаёт мне ошибку "Получение элемента по индексу для значения не определено". Как лечить? Выборка = Запрос.Выполнить().Выгрузить(); a=0; Для Каждого Стр из Выборка Цикл a=a+1; КонецЦикла; Для i=1 по a Цикл Если Стр.Контрагент[i]=Стр.Контрагент[i+1] Тогда Стр.Стоимость[i]=Стр.Стоимость[i]+Стр.Стоимость[i+1]; Стр.СчетЗатрат[i]=""+Стр.СчетЗатрат[i]+", "+Стр.СчетЗатрат[i+1]; Стр.Удалить(i+1); КонецЕсли; i=i+1; КонецЦикла; |
|||
1
Cool_Profi
02.12.16
✎
09:16
|
// a=0;
// Для Каждого Стр из Выборка Цикл // a=a+1; // КонецЦикла; а = выборка.Количество(); Для i=0 по a-1 Цикл Если Стр[i].Контрагент=Стр[i+1].Контрагент Тогда |
|||
2
Heckfy
02.12.16
✎
09:17
|
Для i=0 по Выборка.Количество()-1 Цикл
|
|||
3
Рэйв
02.12.16
✎
09:17
|
>> Стр.Удалить(i+1);
Еще один. В цикле удалаять- ты сбиваешь выборку. Тут можно долго объяснять, но лучше погугли https://www.google.ru/search?as_sitesearch=forum.mista.ru&q=%F3%E4%E0%EB%E5%ED%E8%E5+%F1%F2%F0%EE%EA+%E2+%F6%E8%EA%EB%E5&gws_rd=ssl |
|||
4
aleks_default
02.12.16
✎
09:18
|
вот это нахрен?
i=i+1; |
|||
5
aleks_default
02.12.16
✎
09:18
|
короче код в помойку выбросить
|
|||
6
marshalbratsk
02.12.16
✎
09:19
|
(4) это сначала был цикл Для каждого Стр, поэтому индекс фиксил, а удалить забыл
|
|||
7
marshalbratsk
02.12.16
✎
09:20
|
(5) Я не сомневаюсь, что он в помойку пойдёт, я только учусь, он мне для опорной точки служит, а там уже думать буду
|
|||
8
VladZ
02.12.16
✎
09:20
|
(0) Впечатление от кода: автор этого опуса понятия не имеет, что делает.
|
|||
9
marshalbratsk
02.12.16
✎
09:22
|
(1)(3) Спасибо Вам
|
|||
10
aleks_default
02.12.16
✎
10:41
|
(7)Делай запрос с итогами по Контрагенту и суммой по Стоимость. В результате получишь дерево с одним уровнем. Обходишь итоги по верхнему уровню (контрагенту) - создаешь строку в своей таблице, обходишь детальные записи - заполняешь счет затрат в этой строке.
И без всяких извращений и писать меньше. |
|||
11
marshalbratsk
02.12.16
✎
10:44
|
Вновь взываю к помощи
Выборка = Запрос.Выполнить().Выгрузить(); a=Выборка.Количество(); b=1; Для i=0 по a-b Цикл Если (Выборка[i].Контрагент = Выборка[i+1].Контрагент) Тогда Выборка[i].Стоимость=Выборка[i].Стоимость+Выборка[i+1].Стоимость; m=""+Строка(Выборка[i].СчетЗатрат)+", "+Строка(Выборка[i+1].СчетЗатрат); Выборка.Удалить(i+1); b=b+1; i=i-1 КонецЕсли; КонецЦикла; Сейчас код выглядит так, через отладчик смотрел, таблица значений выглядит правильно, как мне надо (не обращайте внимание на переменную m, ей займусь позже), но потом индекс выходит за предел индексов таблицы значений и ошибка. Как можно исправить? |
|||
12
marshalbratsk
02.12.16
✎
10:49
|
Понимаю, что косяк в удалении строк, понимаю, что меня предупреждали, но увы
|
|||
13
Живой Ископаемый
02.12.16
✎
10:51
|
да чтож это за мистец такой!
Выборка = Запрос.Выполнить().Выгрузить(); МассивДляУдаления = Новый Массив(); a=Выборка.Количество(); b=1; Для i=0 по a-b Цикл Если (Выборка[i].Контрагент = Выборка[i+1].Контрагент) Тогда Выборка[i].Стоимость=Выборка[i].Стоимость+Выборка[i+1].Стоимость; m=""+Строка(Выборка[i].СчетЗатрат)+", "+Строка(Выборка[i+1].СчетЗатрат); //ПРОСТо запомнил, блд, что нужно удалить МассивДляУдаления.Добавить(Строка(Выборка[i+1]); b=b+1; i=i-1 КонецЕсли; КонецЦикла; //А птм удаляешь Для Каждого СтрокаВыборки ИЗ МассивДляУдаления Цикл Выборка.Удалить(СтрокаВыборки); КонецЦикла; |
|||
14
Живой Ископаемый
02.12.16
✎
10:53
|
Ну вот какая у тебя нужда в том, чтобы удалять строки сразу? ну вот ответь
Кроме того, у меня вообще чувство, что ты делаешь хрень. Вместо того чтобы посчитать итоги по котнтрагенту еще в запросе (!!!) с помощью агрегатных функций, ты делаешь таким вот... индусским способом! |
|||
15
aleks_default
02.12.16
✎
10:54
|
(11)Ты понимаешь что если в выборке контрагент идет не по порядку, то код не рабочий?
|
|||
16
Живой Ископаемый
02.12.16
✎
10:57
|
да вообще, сделал в скд применил нужные функции, выкинул результат в коллекцию значений
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |