При построении отчетов в Системе Компоновки Данных (СКД), где логические сутки начинаются не в полночь (например, в 06:00 для ТВ-программ), часто возникает проблема с порядком следования группировок. Стандартный часовой формат выводит данные по календарному времени, из-за чего часы с 00 по 05 оказываются «выше» часов с 06 по 23. Рассмотрим, как решить эту задачу и добиться правильной визуализации данных.
Самый надежный способ управления порядком группировки — это использование технического поля, которое не участвует в выводе, но задает правило упорядочивания. Разберем этот процесс по шагам:
ДОБАВИТЬКДАТЕ или простой арифметикой с типом Дата.Посмотрим на пример правильного запроса:
ВЫБРАТЬ
ТВ_Программа.ТВ_Передача.Наименование КАК ТВ_Передача,
НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(ТВ_Программа.Период, ЧАС, -6), ДЕНЬ) КАК День,
ЧАС(ТВ_Программа.Период) КАК Час,
ЧАС(ДОБАВИТЬКДАТЕ(ТВ_Программа.Период, ЧАС, -6)) КАК ЧасДляСортировки
ИЗ
РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
ТВ_Программа.Период МЕЖДУ &С И &По
После того как данные получены, переходим в настройки СКД. В группировке Час необходимо установить сортировку. Важно: не пытайтесь использовать поле ЧасДляСортировки в списке выбранных полей, если вы не хотите видеть его в отчете. Достаточно зайти на вкладку Настройки, выбрать группировку по полю Час и в разделе Сортировка указать поле ЧасДляСортировки.
Если вы хотите избежать добавления лишних полей в запрос, можно использовать выражения непосредственно в настройках СКД. Это более лаконичный способ, который позволяет сделать код запроса «чистым».
Для этого в настройках группировки Час откройте свойство Выражение упорядочивания и впишите туда формулу расчета сдвига. Можно использовать как функцию ЧАС с ДОБАВИТЬКДАТЕ, так и прямое вычитание секунд (в 6 часах содержится 21600 секунд):
ЧАС(ДОБАВИТЬКДАТЕ(Период, ЧАС, -6)) или ЧАС(Период - 21600)
Этот подход гарантирует, что Система Компоновки Данных будет ранжировать строки согласно сдвинутому времени, при этом в ячейках отчета будет отображаться привычное для пользователя значение Час.
При реализации подобных задач всегда учитывайте следующие моменты:
НАЧАЛОПЕРИОДА(..., ДЕНЬ) в связке с вычетом 6 часов позволяет объединить данные за 00:00–05:59 текущего дня с данными за 06:00–23:59 предыдущего дня в один эфирный цикл.Период - 21600) выполняется системой немного быстрее, чем вызов функции ДОБАВИТЬКДАТЕ, так как Дата в 1С технически представляет собой количество секунд. Однако с точки зрения читаемости кода, ДОБАВИТЬКДАТЕ предпочтительнее.Анализируя задачу, мы видим, что ключом к успеху является четкое разделение данных для отображения (нормальный час) и данных для логики (час со сдвигом). Используя эти методы, вы сможете настроить корректный вывод любого эфирного отчета.