Имеется периодический регистр сведений "ТВ_Программа" (см. рис)

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

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

Вот код

```1c
    &НаСервереБезКонтекста
    Функция ОпределитьМаксДлинуБлокаПрограммНаСервере(пчДатаСтарт, пчДатаФиниш, пбЭтоПерваяПоловина)
    лчМаксДлина=0;

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

    лаЗапрос=Новый Запрос;
    лаЗапрос.Текст=лсТекстЗапроса;
    лаЗапрос.УстановитьПараметр("ЭтоПерваяПоловина", пбЭтоПерваяПоловина);
    лаЗапрос.УстановитьПараметр("ДатаСтарт", пчДатаСтарт);
    лаЗапрос.УстановитьПараметр("ДатаФиниш", пчДатаФиниш);

    ВыборкаЧас=лаЗапрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    Пока ВыборкаЧас.Следующий() Цикл

    лсСоставБлока="; лбПервыйРаз=Истина;

    ВыборкаПередача=ВыборкаЧас.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    Пока ВыборкаПередача.Следующий() Цикл

    Если лбПервыйРаз Тогда
    лбПервыйРаз=Ложь;
    Иначе
    лсСоставБлока=лсСоставБлока+"/";
    КонецЕсли;

    лсСоставБлока=лсСоставБлока+ВыборкаПередача.ТВ_Передача.Наименование;
    КонецЦикла; // ВыборкаПередача

    лчДлина=СтрДлина(лсСоставБлока);
    Если лчМаксДлина<лчДлина Тогда
    лчМаксДлина=лчДлина;
    КонецЕсли;
    КонецЦикла; // ВыборкаЧас

    Возврат лчМаксДлина;
    КонецФункции
```

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

P.S. Группировки "ТВ_Программа.Период" и ниже внёс Конструктор, если их убрать - Запрос ругается.
---
потому что в запросе вы не указали итоги по полям - нужно ИТОГИ ПО Период и ТВ_Передача
---
почему тип обхода ПоГруппировкамСИерархией, если нужно просто ПоГруппировкам
---
Просто ПоГруппировкам не заходит во внутреннюю
---
потому что в запросе вы не указали итоги по полям - нужно ИТОГИ ПО Период и ТВ_Передача
---
Только для красоты нужно 3 группировки

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

а то передачи идут не по порядку. Для суммарной длины наплевать, а вот для сверки ...
---
А почему не создать в самом запросе Для таблицы НачПериода И КонПериода, а потом объединится с другой таблицей по период между, например:
Код создания синтктического периода
```1c
    ВЫБРАТЬ
    ПланыПроизводстваОбороты.Номенклатура,
    ПланыПроизводстваОбороты.ПериодДень,
    СУММА(ПланыПроизводстваОбороты.КоличествоОборот) КАК План
    ПОМЕСТИТЬ ВтПлан
    ИЗ
    РегистрНакопления.ПланыПроизводства.Обороты(, , Авто, ) КАК ПланыПроизводстваОбороты

    СГРУППИРОВАТЬ ПО
    ПланыПроизводстваОбороты.Номенклатура,
    ПланыПроизводстваОбороты.ПериодДень
    ;

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

    СГРУППИРОВАТЬ ПО
    ВтПлан.Номенклатура,
    ВтПлан.ПериодДень,
    ВтПлан.План
```
---
потому что это регистр сведений
---
А в чем разница? Если он периодический брать Период как первое значение, а потом создать к нему нужное приращивание, если нет нужных значений для периода, то создать таблицу типа:
22.04.2019 начПериода 00.00 конПериода 01.00
22.04.2019 начПериода 01.00 конПериода 02.00
И т.д., а потом расположить в ней нужные значения по периодам
---
Вот с регистром сведений:

```1c
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    КурсыВалют.Период,
    КурсыВалют.Валюта
    ПОМЕСТИТЬ ВтКурс
    ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
    ГДЕ
    КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
    ;

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

    СГРУППИРОВАТЬ ПО
    ВтКурс.Период,
    ВтКурс.Валюта
```
---
я все понял - вместо

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

Нужно

 | НАЧАЛОПЕРИОДА(ТВ_Программа.Период, День) КАК Период
---
Нет, внутренняя группировка по прежнему ходит по всем передачам, причём последняя передача часа проходит дважды.