Работа с датами в запросах 1С:Предприятие — одна из самых востребованных задач среди бухгалтеров, аналитиков и программистов. Чаще всего требуется не просто отфильтровать данные по периоду, а сгруппировать их по месяцам, чтобы построить отчеты по динамике продаж, расходов или других показателей. Однако стандартные функции языка запросов не всегда интуитивно понятны: например, простая группировка по полю типа Дата приведет к разбивке по дням, а не по месяцам.

В этой статье разберем 5 способов работы с месяцами в запросах — от базовых конструкций до продвинутых приемов с использованием виртуальных таблиц и временных интервалов. Особое внимание уделим типичным ошибкам, которые приводят к некорректным результатам (например, когда первый и последний месяц периода "обрезаются"), а также оптимизации запросов для больших баз данных. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 и протестированы на конфигурациях Бухгалтерия 3.0, УТ 11 и ЗУП 3.1.

1. Базовый синтаксис: группировка по месяцам с помощью НАЧАЛОМЕСЯЦА()

Самый простой способ сгруппировать данные по месяцам — использовать функцию НАЧАЛОМЕСЯЦА() в разделе ГРУППИРОВКА. Эта функция возвращает первую дату месяца для любой переданной даты, что позволяет "свернуть" все дни месяца в одну группу.

Пример запроса, который выводит сумму продаж по месяцам:

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(Документ.Дата) КАК Месяц,

СУММА(Документ.СуммаДокумента) КАК СуммаПродаж

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО

НАЧАЛОМЕСЯЦА(Документ.Дата)

УПОРЯДОЧИТЬ ПО

Месяц

Обратите внимание на ключевые моменты:

  • 📅 Функция НАЧАЛОМЕСЯЦА() используется и в разделе ВЫБРАТЬ (для отображения), и в СГРУППИРОВАТЬ ПО (для логики группировки).
  • 💰 Параметры &НачалоПериода и &КонецПериода позволяют динамически задавать интервал анализа.
  • 📊 Результат будет отсортирован по месяцам в хронологическом порядке благодаря УПОРЯДОЧИТЬ ПО.
⚠️ Внимание: Если в параметрах передать даты с временем (например, 01.01.2026 12:00:00), функция НАЧАЛОМЕСЯЦА() все равно вернет начало дня (00:00:00), но сравнение в разделе ГДЕ может работать некорректно. Всегда обнуляйте время с помощью НАЧАЛОДНЯ():

ГДЕ Документ.Дата МЕЖДУ НАЧАЛОДНЯ(&НачалоПериода) И КОНЕЦДНЯ(&КонецПериода)

2. Альтернативные функции: КОНЕЦМЕСЯЦА(), ДОБАВИТЬМЕСЯЦ() и их применение

Помимо НАЧАЛОМЕСЯЦА(), в языке запросов 1С есть и другие полезные функции для работы с месяцами:

Функция Описание Пример использования
КОНЕЦМЕСЯЦА() Возвращает последнюю дату месяца (например, 31.01.2026 для января 2026). Анализ данных на конец месяца (остатки, задолженности).
ДОБАВИТЬМЕСЯЦ() Сдвигает дату на указанное количество месяцев (положительное или отрицательное). Сравнение с предыдущим месяцем: ДОБАВИТЬМЕСЯЦ(ТЕКУЩАЯДАТА(), -1).
МЕСЯЦ() Возвращает номер месяца (1–12). Группировка по номеру месяца без учета года (например, для анализа сезонности).
ГОД() Возвращает год даты. Комбинированная группировка по году и месяцу.

Пример запроса с использованием ДОБАВИТЬМЕСЯЦ() для сравнения текущего и предыдущего месяца:

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(Документ.Дата) КАК ТекущийМесяц,

СУММА(Документ.СуммаДокумента) КАК ТекущийМесяцСумма,

СУММА(

ВЫБОР

КОГДА НАЧАЛОМЕСЯЦА(Документ.Дата) = ДОБАВИТЬМЕСЯЦ(НАЧАЛОМЕСЯЦА(Документ.Дата), -1)

ТОГДА Документ.СуммаДокумента

ИНАЧЕ 0

КОНЕЦ

) КАК ПредыдущийМесяцСумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ГДЕ

Документ.Дата МЕЖДУ ДОБАВИТЬМЕСЯЦ(&НачалоПериода, -1) И &КонецПериода

СГРУППИРОВАТЬ ПО

НАЧАЛОМЕСЯЦА(Документ.Дата)

📊 Какой функцией для работы с месяцами вы пользуетесь чаще?
НАЧАЛОМЕСЯЦА()
ДОБАВИТЬМЕСЯЦ()
МЕСЯЦ() и ГОД()
Другие функции
Не использую

3. Группировка по году и месяцу: комбинированные подходы

Если нужно разделить данные не только по месяцам, но и по годам (например, для анализа динамики по нескольким годам), можно использовать комбинацию функций ГОД() и МЕСЯЦ(). Однако здесь есть нюанс: при группировке по двум полям порядок сортировки может нарушиться.

Правильный подход — создать составное поле для группировки, например, в формате ГГГГММ:

ВЫБРАТЬ

ФОРМАТ(ГОД(Документ.Дата), "ЧГ=0") + ФОРМАТ(МЕСЯЦ(Документ.Дата), "ЧГ=0;ЧН=2") КАК ГодМесяц,

СУММА(Документ.СуммаДокумента) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

СГРУППИРОВАТЬ ПО

ГодМесяц

УПОРЯДОЧИТЬ ПО

ГодМесяц

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

ВЫБРАТЬ

ГОД(Документ.Дата) КАК Год,

МЕСЯЦ(Документ.Дата) КАК Месяц,

СУММА(Документ.СуммаДокумента) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

СГРУППИРОВАТЬ ПО

ГОД(Документ.Дата),

МЕСЯЦ(Документ.Дата)

УПОРЯДОЧИТЬ ПО

Год,

Месяц

💡

Если вам нужно отобразить название месяца (например, "Январь" вместо "1"), используйте конструкцию ВЫБОР КОГДА МЕСЯЦ(Дата) = 1 ТОГДА "Январь" ... КОНЕЦ или функцию ФОРМАТ() с параметром "МЕСЯЦ=ДЛ;МЕС=Д" (длинный формат месяца).

4. Работа с виртуальными таблицами: остатки и обороты по месяцам

Для анализа остатков или оборотов по месяцам удобно использовать виртуальные таблицы регистров накопления. Например, чтобы получить остатки товаров на конец каждого месяца, можно написать такой запрос:

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(РегистрСрезПоследних.Период) КАК Месяц,

РегистрСрезПоследних.Номенклатура КАК Товар,

РегистрСрезПоследних.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.СрезПоследних(&КонецПериода, ) КАК РегистрСрезПоследних

ГДЕ

РегистрСрезПоследних.Период МЕЖДУ &НачалоПериода И &КонецПериода

УПОРЯДОЧИТЬ ПО

Месяц,

Товар

Для оборотов за месяц подойдет виртуальная таблица Обороты():

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(РегистрОбороты.Период) КАК Месяц,

РегистрОбороты.Номенклатура КАК Товар,

СУММА(РегистрОбороты.Количество) КАК Продажи

ИЗ

РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Месяц) КАК РегистрОбороты

СГРУППИРОВАТЬ ПО

Месяц,

Товар

⚠️ Внимание: Виртуальные таблицы Обороты() и СрезПоследних() могут значительно нагружать базу при больших периодах. Если запрос выполняется долго, разбейте период на более мелкие интервалы (например, по годам) или используйте таблицу ОборотыИОстатки() с дополнительными параметрами фильтрации.

Ограничить период минимально необходимым интервалом|Добавить отбор по ключевым измерениям (склад, номенклатура)|Использовать индексированные поля в условиях|Разбить сложный запрос на несколько простых-->

5. Типичные ошибки и как их избежать

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

  1. "Обрезание" первого и последнего месяца.

    Если в параметрах передать даты без учета времени (например, 01.01.2026 и 31.01.2026), то документы за 31 января могут не попасть в выборку. Всегда используйте НАЧАЛОДНЯ() и КОНЕЦДНЯ():

    ГДЕ Документ.Дата МЕЖДУ НАЧАЛОДНЯ(&НачалоПериода) И КОНЕЦДНЯ(&КонецПериода)
  2. Некорректная сортировка при группировке по МЕСЯЦ().

    Если группировать только по номеру месяца (1–12), данные за январь 2026 и январь 2023 сольются в одну группу. Всегда добавляйте год:

    ГРУППИРОВАТЬ ПО ГОД(Дата), МЕСЯЦ(Дата)
  3. Игнорирование временных зон.

    В распределенных базах (например, с подключенными терминалами) даты могут храниться в разных временных зонах. Используйте НАЧАЛОДНЯ() с явным указанием часового пояса:

    НАЧАЛОДНЯ(Дата, "Europe/Moscow")
Почему запрос с НАЧАЛОМЕСЯЦА() работает медленно?

Если в таблице миллионы записей, функция НАЧАЛОМЕСЯЦА() применяется к каждой строке, что тормозит выполнение. Решение:

1. Добавьте индекс по полю Дата в конфигураторе.

2. Используйте предварительную фильтрацию по диапазону дат в разделе ГДЕ.

3. Для больших периодов разбейте запрос на подзапросы по годам.

6. Продвинутые техники: временные интервалы и аналитика

Для сложного анализа (например, сравнения среднемесячных продаж или расчета трендов) можно использовать:

  • 📈 Скользящее среднее: расчет среднего значения за последние N месяцев.
    ВЫБРАТЬ
    

    НАЧАЛОМЕСЯЦА(Документ.Дата) КАК Месяц,

    СУММА(Документ.СуммаДокумента) КАК ТекущийМесяц,

    (

    ВЫБРАТЬ СРЕДНЕЕ(ВнутрЗапрос.Сумма)

    ИЗ (

    ВЫБРАТЬ СУММА(Док.СуммаДокумента) КАК Сумма

    ИЗ Документ.РеализацияТоваровУслуг КАК Док

    ГДЕ Док.Дата МЕЖДУ ДОБАВИТЬМЕСЯЦ(Документ.Дата, -2) И Документ.Дата

    ) КАК ВнутрЗапрос

    ) КАК СреднееЗа3Месяца

    ...

  • 📊 Кумулятивные суммы: накопление итогов с начала года.

    Используйте оконные функции (в новых версиях 1С) или подзапросы с условием Дата <= ТекущаяДата.

  • 🔍 Аномалии: поиск месяцев с отклонениями от среднего.

    Добавьте в запрос вычисление стандартного отклонения или используйте условие ГДЕ АБС(ТекущийМесяц - Среднее) > Среднее * 0.2.

Критический нюанс: В запросах с подзапросами или оконными функциями нельзя использовать параметры (например, &НачалоПериода) внутри вложенных выборок. В этом случае придется дублировать условие фильтрации или использовать временные таблицы.

7. Практические примеры для типовой конфигурации "Бухгалтерия 3.0"

Рассмотрим несколько готовых запросов, которые пригодятся бухгалтерам и аналитикам:

  1. Движение денежных средств по месяцам (по банковским счетам):
    ВЫБРАТЬ
    

    НАЧАЛОМЕСЯЦА(ДвижениеДенежныхСредств.Дата) КАК Месяц,

    ДвижениеДенежныхСредств.СчетУчета КАК Счет,

    СУММА(ДвижениеДенежныхСредств.Сумма) КАК СуммаДвижения

    ИЗ

    РегистрНакопления.ДвижениеДенежныхСредств.Обороты(, Месяц) КАК ДвижениеДенежныхСредств

    ГДЕ

    ДвижениеДенежныхСредств.Период МЕЖДУ &НачалоПериода И &КонецПериода

    СГРУППИРОВАТЬ ПО

    Месяц,

    Счет

    УПОРЯДОЧИТЬ ПО

    Месяц,

    Счет

  2. Расчет среднемесячной зарплаты по сотрудникам:
    ВЫБРАТЬ
    

    НачислениеЗарплаты.Сотрудник КАК Сотрудник,

    НАЧАЛОМЕСЯЦА(НачислениеЗарплаты.Период) КАК Месяц,

    СУММА(НачислениеЗарплаты.Сумма) / КОЛИЧЕСТВО(RAZN(НачислениеЗарплаты.Сотрудник)) КАК СредняяЗарплата

    ИЗ

    РегистрНакопления.Зарплата.Обороты(, Месяц) КАК НачислениеЗарплаты

    ГДЕ

    НачислениеЗарплаты.Период МЕЖДУ &НачалоПериода И &КонецПериода

    СГРУППИРОВАТЬ ПО

    Сотрудник,

    Месяц

⚠️ Внимание: В конфигурации ЗУП 3.1 для анализа зарплаты лучше использовать регистр НачисленияОрганизаций вместо Зарплата, так как он учитывает распределение по организациям и подразделениям.

💡

Для ускорения запросов по зарплате всегда добавляйте отбор по организации и периоду накопления (например, НачислениеЗарплаты.ПериодНачисления = &ТекущийМесяц).

FAQ: Частые вопросы по работе с месяцами в запросах 1С

Как в запросе получить название месяца на русском языке?

Используйте функцию ФОРМАТ() с параметром "МЕСЯЦ=ДЛ" (длинный формат) или "МЕС=Д" (сокращенный):

ВЫБРАТЬ

ФОРМАТ(Дата, "МЕСЯЦ=ДЛ;МЕС=Д") КАК НазваниеМесяца

Пример результата: "Январь" или "Янв".

Почему при группировке по НАЧАЛОМЕСЯЦА() некоторые месяцы пропадают?

Это происходит, если в параметрах запроса передаются даты с временем (например, 31.01.2026 23:59:59). Функция НАЧАЛОМЕСЯЦА() обрезает время, но сравнение в разделе ГДЕ может не включать последнюю дату. Решение:

ГДЕ Документ.Дата >= НАЧАЛОДНЯ(&НачалоПериода)

И Документ.Дата <= КОНЕЦДНЯ(&КонецПериода)

Как посчитать количество рабочих дней в каждом месяце?

В 1С нет встроенной функции для подсчета рабочих дней, но можно использовать календарь или создать временную таблицу с предварительно рассчитанными значениями. Пример с использованием регистра Календарь:

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(Календарь.Дата) КАК Месяц,

СУММА(ВЫБОР КОГДА Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейНедели.Рабочий) ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК РабочиеДни

ИЗ

РегистрСведений.Календарь КАК Календарь

ГДЕ

Календарь.Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО

Месяц

Можно ли в одном запросе получить данные и по месяцам, и по кварталам?

Да, для этого используйте конструкцию ВЫБОР КОГДА ... ТОГДА для создания дополнительного поля группировки:

ВЫБРАТЬ

НАЧАЛОМЕСЯЦА(Документ.Дата) КАК Месяц,

ВЫБОР

КОГДА МЕСЯЦ(Документ.Дата) <= 3 ТОГДА "1 квартал"

КОГДА МЕСЯЦ(Документ.Дата) <= 6 ТОГДА "2 квартал"

...

КОНЕЦ КАК Квартал,

СУММА(Документ.СуммаДокумента) КАК Сумма

ИЗ ...

СГРУППИРОВАТЬ ПО

Месяц,

Квартал

Как экспортировать результаты запроса по месяцам в Excel с сохранением формата даты?

При экспорте через ЗаписатьВФайлExcel() даты в формате НАЧАЛОМЕСЯЦА() могут отображаться как числа. Решение:

  1. Добавьте в запрос поле с форматированной датой: ФОРМАТ(НАЧАЛОМЕСЯЦА(Дата), "ДФ=dd.MM.yyyy") КАК МесяцСтрокой.
  2. В Excel настройте формат ячеек как Дата.