Группировка данных по временным периодам в запросах 1С:Предприятие 8.3

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

В 1С:Предприятие 8.3 часто возникает необходимость вывести в отчёте показатели‚ разбитые по определённым временным интервалам (дни‚ недели‚ месяцы‚ кварталы и т.д.). Ниже рассмотрены основные подходы‚ которые позволяют решить эту задачу прямо в тексте запроса‚ без обращения к внешним циклам или сложным конструкциям СКД.

Основные понятия

  • Период – интервал времени‚ заданный начальной и конечной датой (например‚  – ).
  • Группировка по периоду – операция‚ при которой строки результата объединяются по одинаковому значению периода (месяц‚ квартал‚ год).
  • Виртуальная таблица Периоды – специальная таблица‚ генерируемая платформой‚ содержащая все даты из указанного диапазона и позволяющая выполнять соединения по датам.

Способ 1: Фильтрация через условие Дата между …

Самый простой способ – передать в запрос параметры ДатаНачала и ДатаОкончания и отобрать записи‚ попадающие в этот интервал.

Пример запроса:

SELECT
  Документ.Ссылка AS Документ‚
  Документ.Дата AS Дата‚
  Документ.Сумма AS Сумма
FROM
  Документ.Продажа AS Документ
WHERE
  Документ.Дата BETWEEN &ДатаНачала AND &ДатаОкончания

Здесь параметры &ДатаНачала и &ДатаОкончания задаются внешне (например‚ в обработке или отчёте). Такой подход удобен‚ когда нужен один фиксированный период.

Если требуется получить итоги за каждый день/месяц/квартал внутри одного запроса‚ удобно использовать механизм итогов.

Пошаговая инструкция:

  1. Откройте конструктор запроса.
  2. Перетащите нужные поля (например‚ Документ.Дата‚ Документ.Сумма) в область выбора.
  3. Найдите строку с полем‚ по которому нужно группировать (например‚ Документ.Дата).
  4. Установите галочку «Периодами» и выберите нужный вид периода (День‚ Неделя‚ Месяц‚ Квартал‚ Год).
  5. Нажмите «OK» – платформа автоматически добавит выражение типа ПЕРИОД(Документ.Дата‚ МЕСЯЦ) в список группировки.

Полученный запрос будет выглядеть примерно так:

SELECT
  ПЕРИОД(Документ.Дата‚ МЕСЯЦ) AS Период‚
  СУММА(Документ.Сумма) AS Сумма
FROM
  Документ.Продажа AS Документ
GROUP BY
  ПЕРИОД(Документ.Дата‚ МЕСЯЦ)

Результат – одна строка за каждый месяц с суммой продаж за этот месяц.

Способ 3: Использование виртуальной таблицы Периоды

Когда необходимо вывести показатели за все периоды диапазона‚ даже если за некоторые периоды нет данных‚ удобно выполнить LEFT JOIN с виртуальной таблицей Периоды.

Пример: выручка по месяцам за 2026 год‚ включая нулевые значения.

SELECT
  Периоды.Дата AS ПериодStart‚
  ДОБАВИТЬКДАТЕ(Периоды.Дата‚ 1‚ МЕСЯЦ) ⎻ 1 AS ПериодEnd‚
  КОАЛЕСЦЕ(СУММА(Документ.Сумма)‚ 0) AS Выручка
FROM
  ВТ Периоды( &ДатаНачала‚ &ДатаОкончания‚ МЕСЯЦ ) AS Периоды
LEFT JOIN
  Документ.Продажа AS Документ
  ON Документ.Дата BETWEEN Периоды.Дата AND ДОБАВИТЬКДАТЕ(Периоды.Дата‚ 1‚ МЕСЯЦ) ⎻ 1
GROUP BY
  Периоды.Дата
ORDER BY
  Периоды.Дата

Пояснения:

  • Виртуальная таблица ВТ Периоды(Начало‚ Конец‚ Единица) генерирует последовательность дат с шагом‚ заданным параметром Единица (в примере – месяц).
  • Левое соединение гарантирует наличие строки для каждого периода‚ даже если в документах за этот период нет записей.
  • Функция КОАЛЕСЦЕ заменяет NULL на ноль.

Способ 4: Цикл по месяцам в запросе (не рекомендуется)

Иногда встречают подход‚ при котором в обработке формируют цикл по месяцам‚ каждый раз вызывая запрос с параметрами ДатаНачала и ДатаОкончания для конкретного месяца. Этот метод работает‚ но имеет серьёзные недостатки:

  • Увеличивает количество обращений к базе данных (один запрос за каждый месяц).
  • Сложнее поддерживать и отлаживать.
  • Потребляет больше ресурсов сервера.

Поэтому предпочтительно использовать один из первых трёх способов‚ которые позволяют получить все необходимые данные за один проход по базе.

Лучшие практики при работе с периодами в запросах

  • Всегда задавайте границы периода через параметры (&ДатаНачала‚ &ДатаОкончания) – это делает запрос переиспользуемым и защищает от SQL‑инъекций.
  • Для группировки по периодам используйте функцию ПЕРИОД – она чётко определяет‚ к какому интервалу относится дата.
  • Если нужно показать пустые периоды‚ применяйте LEFT JOIN с виртуальной таблицей Периоды.
  • Избегайте вложенных подзапросов и циклов по периодам в обработке – они снижают производительность.
  • Проверяйте типы данных: параметры дат должны быть типа Дата‚ а не строка.
  • При больших объёмах данных добавляйте индексы по полям‚ участвующим в условиях BETWEEN и соединениях.

Получить данные по периодам в запросе 1С можно несколькими способами:

  1. Простая фильтрация через условие Дата между … – подходит для одного фиксированного периода.
  2. Левое соединение с виртуальной таблицей Периоды – позволяет вывести все периоды диапазона‚ заполняя отсутствующие данные нулями.
  3. Цикл по месяцам в обработке – работает‚ но не рекомендуется из‑за низкой производительности.

Выбирайте метод в зависимости от задачи: если нужен один отчёт за конкретный период – используйте первый способ; если требуется разбивка по периодам с возможностью показа нулевых значений – третий способ будет наиболее эффективным и гибким.

Надеюсь‚ представленные примеры и рекомендации помогут вам быстро и корректно реализовать вывод данных по периодам в ваших запросах 1С:Предприятие.