2-уровневый обход результата запроса

1. DWZ2 22.04.19 09:42 Сейчас в теме
Имеется периодический регистр сведений "ТВ_Программа" (см. рис)

Требуется при помощи запроса вычислять некоторую величину для блока передач по одному часу каждый (в примере - сумму длин , но не суть)

Проблема в том, что обе группировки - и внешняя и внутренняя ходят по всем передачам, а надо, чтобы внешняя срабатывала 1 раз на каждый час, а внутренняя - на каждую передачу ИЗ ЭТОГО ЧАСА.

Вот код

&НаСервереБезКонтекста
Функция ОпределитьМаксДлинуБлокаПрограммНаСервере(пчДатаСтарт, пчДатаФиниш, пбЭтоПерваяПоловина)
	лчМаксДлина=0;
	
	лсТекстЗапроса="ВЫБРАТЬ
	               |	ТВ_Программа.Период КАК Период,
	               |	ТВ_Программа.ТВ_Передача КАК ТВ_Передача,
	               |	ТВ_Программа.ЭтоПерваяПоловина КАК ЭтоПерваяПоловина,
	               |	ТВ_Программа.ЧасыСмещенияДоДругойПоловины КАК ЧасыСмещенияДоДругойПоловины,
	               |	НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ЧАС) КАК НачалоБлока
	               |ИЗ
	               |	РегистрСведений.ТВ_Программа КАК ТВ_Программа
	               |ГДЕ
	               |	ТВ_Программа.ЭтоПерваяПоловина = &ЭтоПерваяПоловина
	               |	И МИНУТА(ТВ_Программа.Период) < 47
	               |	И ТВ_Программа.Период МЕЖДУ &ДатаСтарт И &ДатаФиниш
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ЧАС),
	               |	ТВ_Программа.ТВ_Передача,
	               |	ТВ_Программа.Период,
	               |	ТВ_Программа.ЭтоПерваяПоловина,
	               |	ТВ_Программа.ЧасыСмещенияДоДругойПоловины
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Период,
	               |	ТВ_Передача";
	
	лаЗапрос=Новый Запрос;
	лаЗапрос.Текст=лсТекстЗапроса;
	лаЗапрос.УстановитьПараметр("ЭтоПерваяПоловина", пбЭтоПерваяПоловина);
	лаЗапрос.УстановитьПараметр("ДатаСтарт", пчДатаСтарт);
	лаЗапрос.УстановитьПараметр("ДатаФиниш", пчДатаФиниш);
	
	ВыборкаЧас=лаЗапрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	Пока ВыборкаЧас.Следующий() Цикл
		
		лсСоставБлока=""; лбПервыйРаз=Истина;
		
		ВыборкаПередача=ВыборкаЧас.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
		Пока ВыборкаПередача.Следующий() Цикл
			
			Если лбПервыйРаз Тогда
				лбПервыйРаз=Ложь;
			Иначе
				лсСоставБлока=лсСоставБлока+"/";
			КонецЕсли;
			
			лсСоставБлока=лсСоставБлока+ВыборкаПередача.ТВ_Передача.Наименование;
		КонецЦикла; // ВыборкаПередача
		
		лчДлина=СтрДлина(лсСоставБлока);
		Если лчМаксДлина<лчДлина Тогда
			лчМаксДлина=лчДлина;
		КонецЕсли;
	КонецЦикла; // ВыборкаЧас
	
	Возврат лчМаксДлина;
КонецФункции
Показать


Что я делаю не так?

P.S. Группировки "ТВ_Программа.Период" и ниже внёс Конструктор, если их убрать - Запрос ругается.
Прикрепленные файлы:
Найденные решения
8. MaxxiMiliSan 253 22.04.19 10:43 Сейчас в теме
(7) потому что в запросе вы не указали итоги по полям - нужно ИТОГИ ПО Период и ТВ_Передача
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MaxxiMiliSan 253 22.04.19 10:06 Сейчас в теме
(1) почему тип обхода ПоГруппировкамСИерархией, если нужно просто ПоГруппировкам
7. DWZ2 22.04.19 10:41 Сейчас в теме
(2) Просто ПоГруппировкам не заходит во внутреннюю
8. MaxxiMiliSan 253 22.04.19 10:43 Сейчас в теме
(7) потому что в запросе вы не указали итоги по полям - нужно ИТОГИ ПО Период и ТВ_Передача
11. DWZ2 22.04.19 11:16 Сейчас в теме
(8) Только для красоты нужно 3 группировки

ВЫБРАТЬ
	               |	ТВ_Программа.Период КАК Период,
	               |	ТВ_Программа.ТВ_Передача КАК ТВ_Передача,
	               |	ТВ_Программа.ЭтоПерваяПоловина КАК ЭтоПерваяПоловина,
	               |	ТВ_Программа.ЧасыСмещенияДоДругойПоловины КАК ЧасыСмещенияДоДругойПоловины,
				   |	НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ЧАС) КАК НачалоБлока
	               |ИЗ
	               |	РегистрСведений.ТВ_Программа КАК ТВ_Программа
	               |ГДЕ
	               |	ТВ_Программа.ЭтоПерваяПоловина = &ЭтоПерваяПоловина
	               |	И МИНУТА(ТВ_Программа.Период) < 47
	               |	И ТВ_Программа.Период МЕЖДУ &ДатаСтарт И &ДатаФиниш
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	НачалоБлока,
	               |	Период
	               |ИТОГИ ПО
	               |	НачалоБлока,
				   |	Период,
	               |	ТВ_Передача
Показать


а то передачи идут не по порядку. Для суммарной длины наплевать, а вот для сверки ...
3. user995537 38 22.04.19 10:08 Сейчас в теме
(1)А почему не создать в самом запросе Для таблицы НачПериода И КонПериода, а потом объединится с другой таблицей по период между, например:
Код создания синтктического периода
4. MaxxiMiliSan 253 22.04.19 10:11 Сейчас в теме
(3) потому что это регистр сведений
5. user995537 38 22.04.19 10:18 Сейчас в теме
(4)А в чем разница? Если он периодический брать Период как первое значение, а потом создать к нему нужное приращивание, если нет нужных значений для периода, то создать таблицу типа:
22.04.2019 начПериода 00.00 конПериода 01.00
22.04.2019 начПериода 01.00 конПериода 02.00
И т.д., а потом расположить в ней нужные значения по периодам
9. user995537 38 22.04.19 10:43 Сейчас в теме
(4)Вот с регистром сведений:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	КурсыВалют.Период,
	КурсыВалют.Валюта
ПОМЕСТИТЬ ВтКурс
ИЗ
	РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
	КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтКурс.Период КАК НачПериода,
	ВтКурс.Валюта,
	МАКСИМУМ(ЕСТЬNULL(ВтКурс1.Период, &КонецПериода)) КАК КонПериода
ИЗ
	ВтКурс КАК ВтКурс
		ЛЕВОЕ СОЕДИНЕНИЕ ВтКурс КАК ВтКурс1
		ПО ВтКурс.Валюта = ВтКурс1.Валюта
			И ВтКурс.Период < ВтКурс1.Период

СГРУППИРОВАТЬ ПО
	ВтКурс.Период,
	ВтКурс.Валюта
Показать
6. MaxxiMiliSan 253 22.04.19 10:33 Сейчас в теме
(6) я все понял - вместо

| ТВ_Программа.Период КАК Период,

Нужно

| НАЧАЛОПЕРИОДА(ТВ_Программа.Период, День) КАК Период
10. DWZ2 22.04.19 10:49 Сейчас в теме
(6) Нет, внутренняя группировка по прежнему ходит по всем передачам, причём последняя передача часа проходит дважды.
Оставьте свое сообщение

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