При разработке отчетов или обработок в 1С часто возникает задача сгруппировать данные по периодам, которые не укладываются в стандартные возможности функции НАЧАЛОПЕРИОДА. Например, если вам нужно получить отчет с шагом в 30 минут, 3 часа или любой другой промежуток, стандартный механизм НАЧАЛОПЕРИОДА(Дата, ЧАС) не подойдет, так как он ограничен жесткими интервалами платформы. Рассмотрим подробнее, как эффективно решить эту задачу с помощью математических вычислений.
Суть предложенного решения заключается в том, чтобы перевести дату в числовой формат, представляющий собой «количество шагов» от начала отсчета времени. Если мы разделим это число на размер нашего интервала, то все даты, попадающие в один и тот же промежуток, получат одинаковый результат деления. Именно этот результат мы и будем использовать в секции СГРУППИРОВАТЬ ПО.
Давайте разберем процесс реализации по шагам:
Посмотрим на пример кода, который реализует эту логику:
ВЫБРАТЬ
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), КурсыВалют.Период, МИНУТА) / &Периодичность КАК ЧИСЛО(14, 0)) КАК ПериодГруппировки,
МАКСИМУМ(КурсыВалют.Курс) КАК Максимум,
МИНИМУМ(КурсыВалют.Курс) КАК Минимум
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), КурсыВалют.Период, МИНУТА) / &Периодичность КАК ЧИСЛО(14, 0))
УПОРЯДОЧИТЬ ПО
ПериодГруппировки
Обратите внимание на использование функции РАЗНОСТЬДАТ. Она позволяет вычислить количество минут, прошедших от фиксированной начальной точки до значения в вашем поле Период. Деление на параметр &Периодичность позволяет создать «окна» нужного размера. Важно использовать ВЫРАЗИТЬ(... КАК ЧИСЛО(14, 0)), чтобы отбросить дробную часть и получить целое число, которое и будет отвечать за объединение записей в группы.
Почему это работает? Всякий раз, когда время находится внутри интервала, результат целочисленного деления будет идентичным. Например, при группировке по 180 минут, любые даты с 00:00 до 02:59 будут преобразованы в одно и то же число, что заставит систему сгруппировать их вместе.
Хотя этот метод крайне эффективен для решения бизнес-задач, стоит учитывать несколько моментов:
ГДЕ или СГРУППИРОВАТЬ ПО может негативно сказаться на производительности при работе с очень большими объемами данных, так как оптимизатор запросов не сможет эффективно использовать индексы по полю Период.В завершение, проанализировав ситуацию, можно сказать, что математический подход через РАЗНОСТЬДАТ является наиболее гибким и универсальным инструментом для программиста 1С, позволяющим создавать отчеты с любой произвольной детализацией по времени.