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

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

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

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

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

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


КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
+
23. starik-2005 3036 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 96 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 96 07.11.19 15:11 Сейчас в теме
(17)я написал полный вариант, Для к=0...
+
21. user1202776 07.11.19 15:22 Сейчас в теме
(19)у меня в этом цикле
Для каждого строка из ТЗ Цикл
заполняется таблица. Как с вашим циклом Для к=0 по тз.Количество()-1 цикл я буду заполнять таблицу?
+
22. karamazoff 96 07.11.19 15:28 Сейчас в теме
(21)так- же, после
строка = Тз.получить(к);
переменная строка ни чем не отличается от строки в вашем цикле

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

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


КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
+
24. user1202776 07.11.19 15:57 Сейчас в теме
(22)все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"
+
26. karamazoff 96 07.11.19 16:12 Сейчас в теме
(24)
//здесь проверка на последний элемент
Если не к = тз.Количество()-1 тогда
следСтрока = Тз.получить(к+1);
Если не следСтрока.Документ = док тогда
//это последний
док = следСтрока.Документ;
КонецЕсли;
Иначе
//это последний
КонецЕсли;
//конец проверки
Показать
user1202776; +1
33. user1202776 07.11.19 17:08 Сейчас в теме
(26)а где именно здесь проверяется?
+
38. karamazoff 96 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 72 07.11.19 14:25 Сейчас в теме
(1)чтобы подобные вопросы не возникали, создайте список документов и обходите циклом именно этот список, а не всю "кучу" данных.
МассивДокументов = ТЗ.Скопировать(, "Накладная,ДатаНакладной");
МассивДокументов.Сортировать("ДатаНакладной");
МассивДокументов = МассивДокументов.ВыгрузитьКолонку("Накладная");

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

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

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

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

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

чтобы не мучились...
перед циклом в служебную переменную запоминаем первый документ
и в конце итерации проверяем
если слПерем <> тДокумент тогда
  Сообщитьчтото(слПерем);
  слПерем = тДокумент;
конецесли;
user1202776; nomad_irk; +2
16. karamazoff 96 07.11.19 14:48 Сейчас в теме
(5)в вашем примере мы отловим не последний документ группы, а 1-й следующей группы, но принцип, понятно, общий
+
9. nomad_irk 72 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 3036 07.11.19 15:41 Сейчас в теме
Инд = ТЗ.Индекс(Строка);
Если ТЗ.Количество() - 1 = Инд ИЛИ ТЗ[Инд].Документ <> ТЗ[Инд + 1].Документ Тогда
/// Это последний в группе
КонецЕсли;
А какой накал страстей!... )((
+
25. user1202776 07.11.19 16:06 Сейчас в теме
(23) выводит также как в (22)
все отлично. Но в последнюю группу добаляет одну лишнюю строку.То есть идет последняя группа документов и потом последней строкой идет пустая колонка, в котором находится итог по этим документам.Можно сделать так,чтобы также как и с другими группами документов итог располагался на последней строке группы документов?
Под итогом имею ввиду колонка "Бонусная накладная"

и ваш способ очень короткий конечно)
Можно как-то это исправить последней группой документов?
+
27. starik-2005 3036 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 3036 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 3036 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 3036 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 Сейчас в теме
М-да, не перевелись еще желающие сделать программиста из эксгибициониста...
uk09; +1
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 Сейчас в теме
всем кто помог, спасибо
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот