В 1С:Предприятие 8.3 часто возникает необходимость вывести в отчёте показатели‚ разбитые по определённым временным интервалам (дни‚ недели‚ месяцы‚ кварталы и т.д.). Ниже рассмотрены основные подходы‚ которые позволяют решить эту задачу прямо в тексте запроса‚ без обращения к внешним циклам или сложным конструкциям СКД.
Основные понятия
- Период – интервал времени‚ заданный начальной и конечной датой (например‚ – ).
- Группировка по периоду – операция‚ при которой строки результата объединяются по одинаковому значению периода (месяц‚ квартал‚ год).
- Виртуальная таблица
Периоды– специальная таблица‚ генерируемая платформой‚ содержащая все даты из указанного диапазона и позволяющая выполнять соединения по датам.
Способ 1: Фильтрация через условие Дата между …
Самый простой способ – передать в запрос параметры ДатаНачала и ДатаОкончания и отобрать записи‚ попадающие в этот интервал.
Пример запроса:
SELECT
Документ.Ссылка AS Документ‚
Документ.Дата AS Дата‚
Документ.Сумма AS Сумма
FROM
Документ.Продажа AS Документ
WHERE
Документ.Дата BETWEEN &ДатаНачала AND &ДатаОкончания
Здесь параметры &ДатаНачала и &ДатаОкончания задаются внешне (например‚ в обработке или отчёте). Такой подход удобен‚ когда нужен один фиксированный период.
Если требуется получить итоги за каждый день/месяц/квартал внутри одного запроса‚ удобно использовать механизм итогов.
Пошаговая инструкция:
- Откройте конструктор запроса.
- Перетащите нужные поля (например‚
Документ.Дата‚Документ.Сумма) в область выбора. - Найдите строку с полем‚ по которому нужно группировать (например‚
Документ.Дата). - Установите галочку «Периодами» и выберите нужный вид периода (День‚ Неделя‚ Месяц‚ Квартал‚ Год).
- Нажмите «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С:Предприятие.