Как узнать, что цикл сейчас находится на последней строке группы документов?

1. user1202776 07.11.19 13:54 Сейчас в теме
Таблица заполняется данными из запроса
Для каждого строка из ТЗ Цикл
//Здесь заполняется таблица.....
КонецЦикла; 

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

Как узнать, что цикл сейчас находится на последней строке группы документов?
По теме из базы знаний
Найденные решения
22. karamazoff 95 07.11.19 15:28 Сейчас в теме
(21)так- же, после
строка = Тз.получить(к);
переменная строка ни чем не отличается от строки в вашем цикле

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

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


КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
23. starik-2005 3033 07.11.19 15:41 Сейчас в теме
Инд = ТЗ.Индекс(Строка);
Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].Документ <> ТЗ[Инд + 1].Документ Тогда
/// Это последний в группе
КонецЕсли;
А какой накал страстей!... )((
43. lmnlmn 69 08.11.19 09:30 Сейчас в теме
Ух сколько всего! Похрустели мозгами! А что мешает к тому что уже работает добавить проверку на последнюю строку?

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

Для Каждого Строка ИЗ ТЗ Цикл
	ТекущийДокумент = Строка.Документ;
	ТекущийИндекс = ТЗ.Индекс(Строка);
	
	Если ТекущийИндекс < ИндексПоследнейСтроки Тогда
		СледующийДокумент = ТЗ[ТекущийИндекс + 1].Документ;
	Иначе
		СледующийДокумент = Неопределено
	КонецЕсли;
	
	Если СледующийДокумент <> ТекущийДокумент Тогда
		Сообщить("Счастье!");
	КонецЕсли;
КонецЦикла
Показать


P.S. А, предлагали же уже схожее решение в (23)
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. uk09 07.11.19 14:03 Сейчас в теме
(1)
Как узнать, что цикл сейчас находится на последней строке группы документов?


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

Если ТЗ.Индекс(Строка) = ТЗ.Количество() -1 Тогда
Сообщить ("Мы - на последнем рубеже !!!");
КонецЕсли;
user1202776; Teut_Vlad; +2 Ответить
7. user1202776 07.11.19 14:19 Сейчас в теме
(3)сообщение выводит только на последней строке всей таблицы.Наверное я неправильно объяснил.
На скрине видны 2 колонки. Накладная и бонусная накладная.Все накладные документ Реализация товаров и услуг.На последней строке каждой группы накладных должна заполняться колонка "Бонусная накладная". На скрине красными черточками указал места, где должны быть значения у колонки "Бонусная накладная".
Прикрепленные файлы:
11. uk09 07.11.19 14:26 Сейчас в теме
(7)
Все накладные документ Реализация товаров и услуг

Эта таблица выводит идентичные документы вместе

Какой тогда критерий предупреждения, что это - последний документ этого вида, если все документы одного вида ?
Нужно отличить Накладную от бонусной накладной ?
12. user1202776 07.11.19 14:33 Сейчас в теме
(11)
Нужно отличить Накладную от бонусной накладной ?
- нет
Допустим в колонке "Накладная" 10 строке
1.Реализация товаров и услуг А0635041
2.Реализация товаров и услуг А0635041
3.Реализация товаров и услуг А0635041 -----здесь выводим в колонке "Бонусная накладная" выводил "ааааа"
4.Реализация товаров и услуг А0635658
5.Реализация товаров и услуг А0635658
6.Реализация товаров и услуг А0635658
7.Реализация товаров и услуг А0635658 -----здесь выводим в колонке "Бонусная накладная" выводил "ааааа"
8.Реализация товаров и услуг А0636024
9.Реализация товаров и услуг А0636024
10.Реализация товаров и услуг А0636024-----здесь выводим в колонке "Бонусная накладная" выводил "ааааа"
15. karamazoff 95 07.11.19 14:38 Сейчас в теме
(12)перед циклом
док = ТЗ.Получить(0).Документ;
Для к=0 по тз.Количество()-1 цикл
   строка = Тз.получить(к);
   Если не к = тз.Количество()-1 тогда
      следСтрока = Тз.получить(к+1);
      Если не следСтрока.Документ = док тогда
         //это последний
        док =  следСтрока.Документ;
      КонецЕсли;
   КонецЕсли;
КонецЦикла;
Показать
17. user1202776 07.11.19 15:08 Сейчас в теме
(15)
СуммаЗаказаДо = 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 ?
19. karamazoff 95 07.11.19 15:11 Сейчас в теме
(17)я написал полный вариант, Для к=0...
21. user1202776 07.11.19 15:22 Сейчас в теме
(19)у меня в этом цикле
Для каждого строка из ТЗ Цикл
заполняется таблица. Как с вашим циклом Для к=0 по тз.Количество()-1 цикл я буду заполнять таблицу?
22. karamazoff 95 07.11.19 15:28 Сейчас в теме
(21)так- же, после
строка = Тз.получить(к);
переменная строка ни чем не отличается от строки в вашем цикле

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

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


КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
24. user1202776 07.11.19 15:57 Сейчас в теме
(22)все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"
26. karamazoff 95 07.11.19 16:12 Сейчас в теме
(24)
//здесь проверка на последний элемент
Если не к = тз.Количество()-1 тогда
следСтрока = Тз.получить(к+1);
Если не следСтрока.Документ = док тогда
//это последний
док = следСтрока.Документ;
КонецЕсли;
Иначе
//это последний
КонецЕсли;
//конец проверки
Показать
user1202776; +1 Ответить
33. user1202776 07.11.19 17:08 Сейчас в теме
(26)а где именно здесь проверяется?
38. karamazoff 95 07.11.19 19:26 Сейчас в теме
(33
Иначе //т.е. к = тз.Количество()-1, значит это последняя строка таблицы
user1202776; +1 Ответить
39. user1202776 07.11.19 19:30 Сейчас в теме
(38)в этот иначе поставил,что строка другой колонки ="". И все выводит значение
41. user1202776 07.11.19 19:52 Сейчас в теме
(38)
Иначе //т.е. к = тз.Количество()-1,
- берет последнюю строку где есть документ, но почему-то в самом конце создается еще одна лишняя строка и не считает эту строку
37. user1202776 07.11.19 18:23 Сейчас в теме
(26)все-таки не понимаю как это исправить
все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"
13. user1202776 07.11.19 14:36 Сейчас в теме
(11)
Какой тогда критерий предупреждения, что это - последний документ этого вида, если все документы одного вида ?
-все документа одного типа, в этой колонке может быть только Реализация товаров и услуг
6. uk09 07.11.19 14:18 Сейчас в теме
(1)
Как узнать, что цикл сейчас находится на последней строке группы документов?


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

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

Такова картина мира ?
8. user1202776 07.11.19 14:22 Сейчас в теме
(6)
Т.е. нас интересует не последняя строка цикла, а принадлежность к последней строке группы документов?
-да,именно.

Тогда вопрос : Документы, которые потом группируются по виду, изначально, отсортированы по виду или массив неупорядоченный ?
-
документы отсортированы и у все документы имеют тип Реализация товаров и услуг.На скрине в (7) видно
10. nomad_irk 71 07.11.19 14:25 Сейчас в теме
(1)чтобы подобные вопросы не возникали, создайте список документов и обходите циклом именно этот список, а не всю "кучу" данных.
МассивДокументов = ТЗ.Скопировать(, "Накладная,ДатаНакладной");
МассивДокументов.Сортировать("ДатаНакладной");
МассивДокументов = МассивДокументов.ВыгрузитьКолонку("Накладная");

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

СтрокиПоДокументу = ТЗ.НайтиСтроки(Новый Структура("Накладная", Документ))
Для Каждого СтрокаПоДокументу Из СтрокиПоДокументу Цикл
//делаем, что необходимо
КонецЦикла;
КонецЦикла;
Показать
user1202776; +1 Ответить
2. karamazoff 95 07.11.19 13:58 Сейчас в теме
через Для каждого нельзя узнать номер текущего элемента, делайте через Для к=0 по тз.Количество()-1;
user1202776; Teut_Vlad; +2 Ответить
4. karamazoff 95 07.11.19 14:04 Сейчас в теме
(2)не допонял про группу, тогда так
типДок = ТипЗнч(ТЗ.Получить(тз.Количество()-1).Документ);

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

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

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

чтобы не мучились...
перед циклом в служебную переменную запоминаем первый документ
и в конце итерации проверяем
если слПерем <> тДокумент тогда
  Сообщитьчтото(слПерем);
  слПерем = тДокумент;
конецесли;
user1202776; nomad_irk; +2 Ответить
16. karamazoff 95 07.11.19 14:48 Сейчас в теме
(5)в вашем примере мы отловим не последний документ группы, а 1-й следующей группы, но принцип, понятно, общий
9. nomad_irk 71 07.11.19 14:22 Сейчас в теме
(2)Да ладно.....делаем счетчик и спокойно узнаем
14. magvay_k 63 07.11.19 14:38 Сейчас в теме
Как то так, надо еще в отладке доотладить

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

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

КонецЦикла;

Сообщить(СтрокаТЗ.ВтораяКолонка);
Показать
18. user1202776 07.11.19 15:10 Сейчас в теме
(14)не совсем понял логику. Зачем ВтораяКолонка если нужно узнать отловить последнюю строку?
20. user1202776 07.11.19 15:19 Сейчас в теме
(14)сделал так, но другая колонка выводит на первой строке группы документов
23. starik-2005 3033 07.11.19 15:41 Сейчас в теме
Инд = ТЗ.Индекс(Строка);
Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].Документ <> ТЗ[Инд + 1].Документ Тогда
/// Это последний в группе
КонецЕсли;
А какой накал страстей!... )((
25. user1202776 07.11.19 16:06 Сейчас в теме
(23) выводит также как в (22)
все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"

и ваш способ очень короткий конечно)
Можно как-то это исправить последней группой документов?
27. starik-2005 3033 07.11.19 16:32 Сейчас в теме
(25)
Можно как-то это исправить последней группой документов?
А есть полный код?
29. user1202776 07.11.19 16:39 Сейчас в теме
(27)
Для каждого строкаТЗ из ТЗ Цикл


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

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



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

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

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

КонецЦикла;
Показать
30. starik-2005 3033 07.11.19 16:48 Сейчас в теме
(29) В приведенном коде нет ничего о том, каким образом создается строка "ОбластьСтрока", также нет информации о том, как она выводится. По всей видимости это где-то за пределами указанного кода. Таким образом предоставленный код никак не влияет на последнюю группу документов.
31. user1202776 07.11.19 16:53 Сейчас в теме
(30)
ТЗ = новый таблицазначений;
	тз = запрос.Выполнить().Выгрузить();
	
	//тз.ВыбратьСтроку("Акции");  	//Возврат;
	
	ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("ОтчетПоАкциямМакет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) ;
                ОтгруженоБонусаРуб  = ОтгруженоБонусаРуб + (строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество)*строкаТЗ.БазоваяЦена;
                ОтгруженоБонуса     = ОтгруженоБонуса + (строкаТЗ.КоличествоПосле-строкаТЗ.ИсходноеКоличество);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Показать

и сам отчет:
Прикрепленные файлы:
222.epf
32. starik-2005 3033 07.11.19 16:55 Сейчас в теме
(31) предположу, что предоставленный код следует разместить в конце цикла перед строкой
ТабДок.Вывести(ОбластьСтрока);
34. user1202776 07.11.19 17:10 Сейчас в теме
(32)нет, все равно также выводит
35. vadim1011985 99 07.11.19 17:21 Сейчас в теме
(34) Вам уже посоветовали сделать через запрос , тем более он уже есть просто сделаете Итоги по полю РегистраторДокументПродажи

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

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

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

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

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

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

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

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

КонецЦикла
Показать
36. user1202776 07.11.19 17:27 Сейчас в теме
(35)спасибо конечно, но нужно добить так, как начал уже.Тем более это в дальнейшем пригодится.
42. user1202776 08.11.19 09:16 Сейчас в теме
(32)скорее всего новая строка в конце создается из-за того,что у ТЗ[Инд + 1].РегистраторДокументПродажи в конце "индекс находится за границами массива и так как выполняется данное условие, то и выводит лишнюю строку, в котором значение только в той колонке в которой считаю. Вот это значение "867,26" в конце выводит два раза.
Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].РегистраторДокументПродажи <> ТЗ[Инд + 1].РегистраторДокументПродажи  Тогда

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

Но как это исправить?
Прикрепленные файлы:
47. starik-2005 3033 08.11.19 09:58 Сейчас в теме
(42) 1с использует "ленивое" вычисление условия. Если индекс последний, то вторая часть условия не отрабатывает. То, что у Вас там 1 еще одна появляется, находится за пределами приведенного кода.
48. user1202776 08.11.19 10:09 Сейчас в теме
(47)да, вы правы. большое спасибо
28. JohnGalt 57 07.11.19 16:35 Сейчас в теме
Вообще такую задачу лучше запросом сделать. Сгруппировать по ссылке, получить итог и заполнять в цикле с требуемым количеством строк с одинаковой ссылкой + итог
40. user856012 13 07.11.19 19:33 Сейчас в теме
М-да, не перевелись еще желающие сделать программиста из эксгибициониста...
43. lmnlmn 69 08.11.19 09:30 Сейчас в теме
Ух сколько всего! Похрустели мозгами! А что мешает к тому что уже работает добавить проверку на последнюю строку?

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

Для Каждого Строка ИЗ ТЗ Цикл
	ТекущийДокумент = Строка.Документ;
	ТекущийИндекс = ТЗ.Индекс(Строка);
	
	Если ТекущийИндекс < ИндексПоследнейСтроки Тогда
		СледующийДокумент = ТЗ[ТекущийИндекс + 1].Документ;
	Иначе
		СледующийДокумент = Неопределено
	КонецЕсли;
	
	Если СледующийДокумент <> ТекущийДокумент Тогда
		Сообщить("Счастье!");
	КонецЕсли;
КонецЦикла
Показать


P.S. А, предлагали же уже схожее решение в (23)
44. user1202776 08.11.19 09:36 Сейчас в теме
(43)только почему-то в конце таблицы создает еще одну строку, в котором только значение колонки, которое вывожу в (42) написал, в чем дело, на мой взгляд, но не знаю ,как исправить это
45. lmnlmn 69 08.11.19 09:37 Сейчас в теме
(44) В моем варианте уже исправлено. Индекс не вылетает за пределы диапазона
46. user1202776 08.11.19 09:51 Сейчас в теме
(45)в вашем варианте тоже индекс выводит за диапазон
Прикрепленные файлы:
50. lmnlmn 69 08.11.19 10:12 Сейчас в теме
(46)Давайте различать мой вариант и его реализацию вашими руками)) Надо код смотреть.
51. user1202776 08.11.19 10:15 Сейчас в теме
(50)проблема была совсем в другом месте.оказалась,что в другом месте задействована эта строка, а я этого не знал , так как этот отчет не я написал и не очень внимательно изучил код.Спасибо
49. user1202776 08.11.19 10:09 Сейчас в теме
всем кто помог, спасибо
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)