Как сгруппировать данные в запросе 1С по произвольным временным интервалам?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов или обработок в 1С часто возникает задача сгруппировать данные по периодам, которые не укладываются в стандартные возможности функции НАЧАЛОПЕРИОДА. Например, если вам нужно получить отчет с шагом в 30 минут, 3 часа или любой другой промежуток, стандартный механизм НАЧАЛОПЕРИОДА(Дата, ЧАС) не подойдет, так как он ограничен жесткими интервалами платформы. Рассмотрим подробнее, как эффективно решить эту задачу с помощью математических вычислений.

Разбор математического метода группировки

Суть предложенного решения заключается в том, чтобы перевести дату в числовой формат, представляющий собой «количество шагов» от начала отсчета времени. Если мы разделим это число на размер нашего интервала, то все даты, попадающие в один и тот же промежуток, получат одинаковый результат деления. Именно этот результат мы и будем использовать в секции СГРУППИРОВАТЬ ПО.

Пошаговый алгоритм реализации

Давайте разберем процесс реализации по шагам:

  1. Определите длительность интервала в минутах. Например, если вам нужна группировка по 3 часам, это будет 180 минут (3 * 60).
  2. В запросе создайте вычисляемое поле, которое переводит дату в количество минут от начала эры, а затем делит его на ваш интервал.
  3. Используйте полученное число как ключ группировки.

Посмотрим на пример кода, который реализует эту логику:


ВЫБРАТЬ
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), КурсыВалют.Период, МИНУТА) / &Периодичность КАК ЧИСЛО(14, 0)) КАК ПериодГруппировки,
    МАКСИМУМ(КурсыВалют.Курс) КАК Максимум,
    МИНИМУМ(КурсыВалют.Курс) КАК Минимум
ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), КурсыВалют.Период, МИНУТА) / &Периодичность КАК ЧИСЛО(14, 0))
УПОРЯДОЧИТЬ ПО
    ПериодГруппировки

Важные замечания по реализации

Обратите внимание на использование функции РАЗНОСТЬДАТ. Она позволяет вычислить количество минут, прошедших от фиксированной начальной точки до значения в вашем поле Период. Деление на параметр &Периодичность позволяет создать «окна» нужного размера. Важно использовать ВЫРАЗИТЬ(... КАК ЧИСЛО(14, 0)), чтобы отбросить дробную часть и получить целое число, которое и будет отвечать за объединение записей в группы.

Почему это работает? Всякий раз, когда время находится внутри интервала, результат целочисленного деления будет идентичным. Например, при группировке по 180 минут, любые даты с 00:00 до 02:59 будут преобразованы в одно и то же число, что заставит систему сгруппировать их вместе.

Особенности производительности

Хотя этот метод крайне эффективен для решения бизнес-задач, стоит учитывать несколько моментов:

В завершение, проанализировав ситуацию, можно сказать, что математический подход через РАЗНОСТЬДАТ является наиболее гибким и универсальным инструментом для программиста 1С, позволяющим создавать отчеты с любой произвольной детализацией по времени.

← На главную