Таблица заполняется данными из запроса

```1c
    Для каждого строка из ТЗ Цикл
    //Здесь заполняется таблица.....
    КонецЦикла;
```

Эта таблица выводит идентичные документы вместе,например:
документ1
документ1
документ1
документ1
документ1
документ1
документ2
документ2
документ2
документ3
документ3
документ3
документ3
В последней строке группы документов нужно,чтобы другая колонка выводила информацию.

Как узнать, что цикл сейчас находится на последней строке группы документов?
---
так- же, после
строка = Тз.получить(к);
переменная строка ни чем не отличается от строки в вашем цикле

```1c
    док = ТЗ.Получить(0).Документ;
    Для к=0 по тз.Количество()-1 цикл
    строка = Тз.получить(к);
    //здесь идет ваше заполнение таблицы цикла

    //здесь проверка на последний элемент
    Если не к = тз.Количество()-1 тогда
    следСтрока = Тз.получить(к+1);
    Если не следСтрока.Документ = док тогда
    //это последний
    док = следСтрока.Документ;
    //конец проверки

    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
```1c
    Инд = ТЗ.Индекс(Строка);
    Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].Документ <> ТЗ[Инд + 1].Документ Тогда
    /// Это последний в группе
    КонецЕсли;
```
А какой накал страстей!... )((
---
Ух сколько всего! Похрустели мозгами! А что мешает к тому что уже работает добавить проверку на последнюю строку?

```1c
    ИндексПоследнейСтроки = ТЗ.Количество() - 1;

    Для Каждого Строка ИЗ ТЗ Цикл
    ТекущийДокумент = Строка.Документ;
    ТекущийИндекс = ТЗ.Индекс(Строка);

    Если ТекущийИндекс < ИндексПоследнейСтроки Тогда
    СледующийДокумент = ТЗ[ТекущийИндекс + 1].Документ;
    Иначе
    СледующийДокумент = Неопределено
    КонецЕсли;

    Если СледующийДокумент <> ТекущийДокумент Тогда
    Сообщить("Счастье!");
    КонецЕсли;
    КонецЦикла
```

P.S. А, предлагали же уже схожее решение в (23)
---
Как узнать, что цикл сейчас находится на последней строке группы документов?

Добрый день! Например так :

 Если ТЗ.Индекс(Строка) = ТЗ.Количество() -1 Тогда
     Сообщить ("Мы - на последнем рубеже !!!");
 КонецЕсли;
---
сообщение выводит только на последней строке всей таблицы.Наверное я неправильно объяснил.
На скрине видны 2 колонки. Накладная и бонусная накладная.Все накладные документ Реализация товаров и услуг.На последней строке каждой группы накладных должна заполняться колонка "Бонусная накладная". На скрине красными черточками указал места, где должны быть значения у колонки "Бонусная накладная".
---
Все накладные документ Реализация товаров и услуг
 Эта таблица выводит идентичные документы вместе
Какой тогда критерий предупреждения, что это - последний документ этого вида, если все документы одного вида ?
Нужно отличить Накладную от бонусной накладной ?
---
Нужно отличить Накладную от бонусной накладной ?- нет
Допустим в колонке "Накладная" 10 строке
1.Реализация товаров и услуг А0635041
2.Реализация товаров и услуг А0635041
3.Реализация товаров и услуг А0635041 -----здесь выводим в колонке "Бонусная накладная" выводил "ааааа"
4.Реализация товаров и услуг А0635658
5.Реализация товаров и услуг А0635658
6.Реализация товаров и услуг А0635658
7.Реализация товаров и услуг А0635658 -----здесь выводим в колонке "Бонусная накладная" выводил "ааааа"
8.Реализация товаров и услуг А0636024
9.Реализация товаров и услуг А0636024
10.Реализация товаров и услуг А0636024-----здесь выводим в колонке "Бонусная накладная" выводил "ааааа"
---
перед циклом

```1c
    док = ТЗ.Получить(0).Документ;
    Для к=0 по тз.Количество()-1 цикл
    строка = Тз.получить(к);
    Если не к = тз.Количество()-1 тогда
    следСтрока = Тз.получить(к+1);
    Если не следСтрока.Документ = док тогда
    //это последний
    док = следСтрока.Документ;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
```1c
    СуммаЗаказаДо = 0;
    ОтгруженоБонуса = 0;
    ОтгруженоБонусаРуб = 0;
    ПредоставленоСкидки = 0;
    СуммаЗаказаДоРОИСкидкиДляИтога = 0;
    СуммаЗаказаДоРОИБонусДляИтога = 0;
    ОтгруженоБонусаДляИтога = 0;
    ОтгруженоБонусаРубДляИтога = 0;
    ПредоставленоСкидкиДляИтога = 0;
    ОтданоКолДляИтога = 0;
    СтарыйДокумент = Неопределено;
    СтарыйАдрес = Неопределено;
    СтарыйКонтрагент = Неопределено;
    СтараяТерритория = Неопределено;
    НовыйДокумент = Неопределено;
    ОтданоКол = 0;
    СчетчикДокументов = 0;
    // -- Доработка ---Показатели приравниваются к 0 и неопределено

    ТЗ = новый таблицазначений;
    тз = запрос.Выполнить().Выгрузить();

    //тз.ВыбратьСтроку("Акции"); //Возврат;

    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("ОтчетПоАкциямМакет1");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьШапка.Параметры.ЗаголовокТаб = "Отчет по акции *"+этаформа.ЭлементыФормы.ПолеВыбора1.Значение+"* за период с "+лев(строка(НачДата),10)+" по "+лев(строка(КонДата),10)+" в "+?(ФлагРасчетВШтуках=Истина,"штуках","местах");
    ТабДок.Вывести(ОбластьШапка);
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрокаВыделена = Макет.ПолучитьОбласть("СтрокаКР");
    ОбластьСтрокаРои = Макет.ПолучитьОбласть("СтрокаРОИ");
    док = ТЗ.Получить(0).РегистраторДокументПродажи;

    Для каждого строкаТЗ из ТЗ Цикл

    Для к=0 по тз.Количество()-1 цикл
    строка = Тз.получить(к);
    Если не к = тз.Количество()-1 тогда
    следСтрока = Тз.получить(к+1);
    Если не следСтрока.РегистраторДокументПродажи = док тогда
    //это последний
    Сообщить("Последний документ в группе");
    док = следСтрока.РегистраторДокументПродажи;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    //Здесь заполняется таблица....
    КонецЦикла;
```

Сделал так и получил 3804 сообщений

перед циклом перед каким циклом, перед моим циклом Для каждого строка из ТЗ Цикл или перед циклом Для к=0 по тз.Количество()-1 ?
---
я написал полный вариант, Для к=0...
---
у меня в этом цикле

```1c
    Для каждого строка из ТЗ Цикл
```
 заполняется таблица. Как с вашим циклом Для к=0 по тз.Количество()-1 цикл я буду заполнять таблицу?
---
так- же, после
строка = Тз.получить(к);
переменная строка ни чем не отличается от строки в вашем цикле

```1c
    док = ТЗ.Получить(0).Документ;
    Для к=0 по тз.Количество()-1 цикл
    строка = Тз.получить(к);
    //здесь идет ваше заполнение таблицы цикла

    //здесь проверка на последний элемент
    Если не к = тз.Количество()-1 тогда
    следСтрока = Тз.получить(к+1);
    Если не следСтрока.Документ = док тогда
    //это последний
    док = следСтрока.Документ;
    //конец проверки

    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```
---
все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"
---
```1c
    //здесь проверка на последний элемент
    Если не к = тз.Количество()-1 тогда
    следСтрока = Тз.получить(к+1);
    Если не следСтрока.Документ = док тогда
    //это последний
    док = следСтрока.Документ;
    КонецЕсли;
    Иначе
    //это последний
    КонецЕсли;
    //конец проверки
```
---
а где именно здесь проверяется?
---
в
Иначе //т.е. к = тз.Количество()-1, значит это последняя строка таблицы
---
в этот иначе поставил,что строка другой колонки ="". И все выводит значение
---
Иначе //т.е. к = тз.Количество()-1, - берет последнюю строку где есть документ, но почему-то в самом конце создается еще одна лишняя строка и не считает эту строку
---
все-таки не понимаю как это исправить
все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"
---
Какой тогда критерий предупреждения, что это - последний документ этого вида, если все документы одного вида ?-все документа одного типа, в этой колонке может быть только Реализация товаров и услуг
---
Как узнать, что цикл сейчас находится на последней строке группы документов?

Т.е. нас интересует не последняя строка цикла, а принадлежность к последней строке группы документов?
Тогда вопрос : Документы, которые потом группируются по виду, изначально, отсортированы по виду или массив неупорядоченный ?
Т.е. предпоследний вид - РКО, последний ПКО.

Документы идут в след.порядке:
                 РКО, ( молчим)
                 ПКО , ( кричим)
                 СчетФактура, (что говорим ???)
                 ПКО, (если снова кричим , то про что ?)

Такова картина мира ?
---
Т.е. нас интересует не последняя строка цикла, а принадлежность к последней строке группы документов? -да,именно.

Тогда вопрос : Документы, которые потом группируются по виду, изначально, отсортированы по виду или массив неупорядоченный ?-
документы отсортированы и у все документы имеют тип Реализация товаров и услуг.На скрине в (7) видно
---
чтобы подобные вопросы не возникали, создайте список документов и обходите циклом именно этот список, а не всю "кучу" данных.

```1c
    МассивДокументов = ТЗ.Скопировать(, "Накладная,ДатаНакладной");
    МассивДокументов.Сортировать("ДатаНакладной");
    МассивДокументов = МассивДокументов.ВыгрузитьКолонку("Накладная");

    Для Каждого Документ Из МассивДокументов Цикл

    СтрокиПоДокументу = ТЗ.НайтиСтроки(Новый Структура("Накладная", Документ))
    Для Каждого СтрокаПоДокументу Из СтрокиПоДокументу Цикл
    //делаем, что необходимо
    КонецЦикла;
    КонецЦикла;
```
---
через Для каждого нельзя узнать номер текущего элемента, делайте через Для к=0 по тз.Количество()-1;
---
не допонял про группу, тогда так
типДок = ТипЗнч(ТЗ.Получить(тз.Количество()-1).Документ);

В цикле
Если типзнч(Строка.Документ) = типДок тогда
//последняя группа
---
-(4) если вы думаете, что дали решение, то ошибаетесь

тс - это разработка сколково и очень часто вопрос задан от балды, а нужно нечто другое.
в примере ясно, что нужно определять не поледнюю строку в цикле, а последнюю строку из массива порций строк.

сейчас будет две страницы обсуждения, как выделить порцию строк в цикле.

чтобы не мучились...
перед циклом в служебную переменную запоминаем первый документ
и в конце итерации проверяем

```1c
    если слПерем <> тДокумент тогда
    Сообщитьчтото(слПерем);
    слПерем = тДокумент;
    конецесли;
```
---
в вашем примере мы отловим не последний документ группы, а 1-й следующей группы, но принцип, понятно, общий
---
Да ладно.....делаем счетчик и спокойно узнаем
---
Как то так, надо еще в отладке доотладить

```1c
    ЭтоПоследнийДокумент = Неопределено;

    Для Каждого СтрокаТЗ Из ТЗ Цикл

    Если Не ЭтоПоследнийДокумент = Неопределено
    И Не ЭтоПоследнийДокумент = СтрокаТЗ.Документ Тогда
    Инд = ТЗ.Индекс(СтрокаТЗ) - 1;
    Сообщить(ТЗ[Инд].ВтораяКолонка);
    КонецЕсли;

    ЭтоПоследнийДокумент = СтрокаТЗ.Документ;

    КонецЦикла;

    Сообщить(СтрокаТЗ.ВтораяКолонка);
```
---
не совсем понял логику. Зачем ВтораяКолонка если нужно узнать отловить последнюю строку?
---
сделал так, но другая колонка выводит на первой строке группы документов
---
```1c
    Инд = ТЗ.Индекс(Строка);
    Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].Документ <> ТЗ[Инд + 1].Документ Тогда
    /// Это последний в группе
    КонецЕсли;
```
А какой накал страстей!... )((
---
выводит также как в (22)
все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"
и ваш способ очень короткий конечно)
Можно как-то это исправить последней группой документов?
---
Можно как-то это исправить последней группой документов?А есть полный код?
---
```1c
    Для каждого строкаТЗ из ТЗ Цикл

    Инд = ТЗ.Индекс(строкаТЗ);
    Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].РегистраторДокументПродажи <> ТЗ[Инд + 1].РегистраторДокументПродажи и ПредоставленоСкидки <> 0 и не ТЗ[Инд].РегистраторДокументПродажи =Null Тогда
    //// Это последний в группе

    Сообщить("последняя строка документа");
    ОбластьСтрока.Параметры.РОИ = Окр(((СуммаЗаказаДо-ПредоставленоСкидки)/?(ПредоставленоСкидки = 0,1,ПредоставленоСкидки)*100),2);
    КонецЕсли;

    //// ++ Доработка
    НовыйДокумент = строкаТЗ.ДокументНачисления; //----новый документ приравнивается к выборке из запроса
    НовыйКонтрагент = строкаТЗ.РегистраторКонтрагент;
    Если НовыйДокумент <> СтарыйДокумент И Не СтарыйДокумент = Неопределено Тогда
    Если ЗначениеЗаполнено(СтарыйДокумент) Тогда

    ОбластьСтрока.Параметры.Контрагент = СтарыйКонтрагент;
    ОбластьСтрока.Параметры.Адрес = СтарыйАдрес;
    ОбластьСтрока.Параметры.Территория = СтараяТерритория;
    Если ОтданоКол<>0 Тогда

    СуммаЗаказаДоРОИБонусДляИтога = СуммаЗаказаДоРОИБонусДляИтога + СуммаЗаказаДо;
    ОтгруженоБонусаРубДляИтога = ОтгруженоБонусаРубДляИтога + ОтгруженоБонусаРуб;

    ИначеЕсли НовыйКонтрагент <> СтарыйКонтрагент И Не СтарыйКонтрагент = Неопределено Тогда

    ОбластьСтрока.Параметры.РОИ = Окр(((СуммаЗаказаДо-ПредоставленоСкидки)/?(ПредоставленоСкидки = 0,1,ПредоставленоСкидки)*100),2);
    СуммаЗаказаДоРОИСкидкиДляИтога = СуммаЗаказаДоРОИСкидкиДляИтога + СуммаЗаказаДо;
    ПредоставленоСкидкиДляИтога = ПредоставленоСкидкиДляИтога + ПредоставленоСкидки;

    КонецЕсли;

    ОбластьСтрока.Параметры.РОИ = ";
    ///----показатели-числа приравниваются к 0
    СуммаЗаказаДо = 0;
    ПредоставленоСкидки = 0;
    ОтгруженоБонусаРуб = 0;
    ОтгруженоБонуса = 0;
    ОтданоКол = 0;

    Иначе

    КонецЕсли

    КонецЕсли;
    ///----показатели-строки приравниваются к выборке запроса
    СтарыйДокумент = строкаТЗ.ДокументНачисления;
    //СтарыйКонтрагент = строкаТЗ.РегистраторКонтрагент;
    СтарыйАдрес = строкаТЗ.АдресДоставки;
    СтараяТерритория = строкаТЗ.Территория;
    ///---- считаются показатели, по которым считается РОИ
    ОтданоКол = ОтданоКол + строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество;
    СуммаЗаказаДо = СуммаЗаказаДо + строкаТЗ.ИсходнаяЦена*строкаТЗ.ИсходноеКоличество;
    ПредоставленоСкидки = ПредоставленоСкидки + ?(строкаТЗ.ИсходнаяЦена>0,(строкаТЗ.ИсходнаяЦена-строкаТЗ.ЦенаПосле) * строкаТЗ.КоличествоПосле,0) ;
    ОтгруженоБонусаРуб = ОтгруженоБонусаРуб + (строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество)*строкаТЗ.БазоваяЦена;
    ОтгруженоБонуса = ОтгруженоБонуса + (строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество);

    КонецЦикла;
```
---
В приведенном коде нет ничего о том, каким образом создается строка "ОбластьСтрока", также нет информации о том, как она выводится. По всей видимости это где-то за пределами указанного кода. Таким образом предоставленный код никак не влияет на последнюю группу документов.
---
```1c
    ТЗ = новый таблицазначений;
    тз = запрос.Выполнить().Выгрузить();

    //тз.ВыбратьСтроку("Акции"); //Возврат;

    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("ОтчетПоАкциямМакет1");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьШапка.Параметры.ЗаголовокТаб = "Отчет по акции *"+этаформа.ЭлементыФормы.ПолеВыбора1.Значение+"* за период с "+лев(строка(НачДата),10)+" по "+лев(строка(КонДата),10)+" в "+?(ФлагРасчетВШтуках=Истина,"штуках","местах");
    ТабДок.Вывести(ОбластьШапка);
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрокаВыделена = Макет.ПолучитьОбласть("СтрокаКР");
    ОбластьСтрокаРои = Макет.ПолучитьОбласть("СтрокаРОИ");

    Для каждого строкаТЗ из ТЗ Цикл

    Инд = ТЗ.Индекс(строкаТЗ);
    Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].РегистраторДокументПродажи <> ТЗ[Инд + 1].РегистраторДокументПродажи и ПредоставленоСкидки <> 0 и не ТЗ[Инд].РегистраторДокументПродажи =Null Тогда
    //// Это последний в группе

    Сообщить("последняя строка документа");
    ОбластьСтрока.Параметры.РОИ = Окр(((СуммаЗаказаДо-ПредоставленоСкидки)/?(ПредоставленоСкидки = 0,1,ПредоставленоСкидки)*100),2);
    КонецЕсли;

    //// ++ Доработка
    НовыйДокумент = строкаТЗ.ДокументНачисления; //----новый документ приравнивается к выборке из запроса
    НовыйКонтрагент = строкаТЗ.РегистраторКонтрагент;
    Если НовыйДокумент <> СтарыйДокумент И Не СтарыйДокумент = Неопределено Тогда
    Если ЗначениеЗаполнено(СтарыйДокумент) Тогда

    ОбластьСтрока.Параметры.Контрагент = СтарыйКонтрагент;
    ОбластьСтрока.Параметры.Адрес = СтарыйАдрес;
    ОбластьСтрока.Параметры.Территория = СтараяТерритория;
    Если ОтданоКол<>0 Тогда

    СуммаЗаказаДоРОИБонусДляИтога = СуммаЗаказаДоРОИБонусДляИтога + СуммаЗаказаДо;
    ОтгруженоБонусаРубДляИтога = ОтгруженоБонусаРубДляИтога + ОтгруженоБонусаРуб;

    ИначеЕсли НовыйКонтрагент <> СтарыйКонтрагент И Не СтарыйКонтрагент = Неопределено Тогда

    ОбластьСтрока.Параметры.РОИ = Окр(((СуммаЗаказаДо-ПредоставленоСкидки)/?(ПредоставленоСкидки = 0,1,ПредоставленоСкидки)*100),2);
    СуммаЗаказаДоРОИСкидкиДляИтога = СуммаЗаказаДоРОИСкидкиДляИтога + СуммаЗаказаДо;
    ПредоставленоСкидкиДляИтога = ПредоставленоСкидкиДляИтога + ПредоставленоСкидки;

    КонецЕсли;

    ОбластьСтрока.Параметры.РОИ = ";
    ///----показатели-числа приравниваются к 0
    СуммаЗаказаДо = 0;
    ПредоставленоСкидки = 0;
    ОтгруженоБонусаРуб = 0;
    ОтгруженоБонуса = 0;
    ОтданоКол = 0;

    Иначе

    КонецЕсли

    КонецЕсли;
    ///----показатели-строки приравниваются к выборке запроса
    СтарыйДокумент = строкаТЗ.ДокументНачисления;
    //СтарыйКонтрагент = строкаТЗ.РегистраторКонтрагент;
    СтарыйАдрес = строкаТЗ.АдресДоставки;
    СтараяТерритория = строкаТЗ.Территория;
    ///---- считаются показатели, по которым считается РОИ
    ОтданоКол = ОтданоКол + строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество;
    СуммаЗаказаДо = СуммаЗаказаДо + строкаТЗ.ИсходнаяЦена*строкаТЗ.ИсходноеКоличество;
    ПредоставленоСкидки = ПредоставленоСкидки + ?(строкаТЗ.ИсходнаяЦена>0,(строкаТЗ.ИсходнаяЦена-строкаТЗ.ЦенаПосле) * строкаТЗ.КоличествоПосле,0) ;
    ОтгруженоБонусаРуб = ОтгруженоБонусаРуб + (строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество)*строкаТЗ.БазоваяЦена;
    ОтгруженоБонуса = ОтгруженоБонуса + (строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество);
    ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
```

 и сам отчет:
---
предположу, что предоставленный код следует разместить в конце цикла перед строкой
```1c
    ТабДок.Вывести(ОбластьСтрока);
```
---
нет, все равно также выводит
---
Вам уже посоветовали сделать через запрос , тем более он уже есть просто сделаете Итоги по полю РегистраторДокументПродажи

И будет у вас что-то типа

```1c
    ОбходЗапроса = ОбходРезультатаЗапросаПоГруппировкам;

    ВыборкаДокументПродажи = Запрос.Выполнить().Выбрать(ОбходЗапроса);

    Пока ВыборкаДокументПродажи .Следующий() Цикл // цикл по документам продаж

    ДетальныеЗаписи = ВыборкаДокументПродажи.Выбрать();

    Пока ДетальныеЗаписи.Следующий() Цикл

    ОбластьСтрока = Макет.ПолучитьОбласть();
    ....
    ....
    КонецЦикла;

    // тут должно быть заполнение колонки бонусная накладная
    ОбластьСтрока.Параметры.БонуснаяНакладная = ...

    КонецЦикла
```
---
спасибо конечно, но нужно добить так, как начал уже.Тем более это в дальнейшем пригодится.
---
скорее всего новая строка в конце создается из-за того,что у ТЗ[Инд + 1].РегистраторДокументПродажи в конце "индекс находится за границами массива и так как выполняется данное условие, то и выводит лишнюю строку, в котором значение только в той колонке в которой считаю. Вот это значение "867,26" в конце выводит два раза.

```1c
    Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].РегистраторДокументПродажи <> ТЗ[Инд + 1].РегистраторДокументПродажи Тогда

    ОбластьСтрока.Параметры.РОИ = Окр(((СуммаЗаказаДо-ОтгруженоБонусаРуб)/?(ОтгруженоБонусаРуб = 0,1,ОтгруженоБонусаРуб)*100),2);
    КонецЕсли;
```

Но как это исправить?
---
1с использует "ленивое" вычисление условия. Если индекс последний, то вторая часть условия не отрабатывает. То, что у Вас там 1 еще одна появляется, находится за пределами приведенного кода.
---
да, вы правы. большое спасибо
---
Вообще такую задачу лучше запросом сделать. Сгруппировать по ссылке, получить итог и заполнять в цикле с требуемым количеством строк с одинаковой ссылкой + итог
---
М-да, не перевелись еще желающие сделать программиста из эксгибициониста...
---
Ух сколько всего! Похрустели мозгами! А что мешает к тому что уже работает добавить проверку на последнюю строку?

```1c
    ИндексПоследнейСтроки = ТЗ.Количество() - 1;

    Для Каждого Строка ИЗ ТЗ Цикл
    ТекущийДокумент = Строка.Документ;
    ТекущийИндекс = ТЗ.Индекс(Строка);

    Если ТекущийИндекс < ИндексПоследнейСтроки Тогда
    СледующийДокумент = ТЗ[ТекущийИндекс + 1].Документ;
    Иначе
    СледующийДокумент = Неопределено
    КонецЕсли;

    Если СледующийДокумент <> ТекущийДокумент Тогда
    Сообщить("Счастье!");
    КонецЕсли;
    КонецЦикла
```

P.S. А, предлагали же уже схожее решение в (23)
---
только почему-то в конце таблицы создает еще одну строку, в котором только значение колонки, которое вывожу в (42) написал, в чем дело, на мой взгляд, но не знаю ,как исправить это
---
В моем варианте уже исправлено. Индекс не вылетает за пределы диапазона
---
в вашем варианте тоже индекс выводит за диапазон
---
Давайте различать мой вариант и его реализацию вашими руками)) Надо код смотреть.
---
проблема была совсем в другом месте.оказалась,что в другом месте задействована эта строка, а я этого не знал , так как этот отчет не я написал и не очень внимательно изучил код.Спасибо
---
всем кто помог, спасибо