К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С запрос: как получить месяц из даты

Как в запросе 1С получить месяц из даты: функция МЕСЯЦ(), группировка по месяцам, сравнение периодов, типичные ошибки и примеры кода для отчётов.

В языке запросов 1С дата хранится как единое значение с точностью до секунды, и напрямую «вытащить» из неё месяц нельзя — для этого предусмотрены специальные функции. Чаще всего задача возникает при построении отчётов: нужно сгруппировать продажи, начисления или движения по складу не по дням, а по месяцам, либо отобрать документы конкретного месяца.

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

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

Функция МЕСЯЦ(): базовый синтаксис

Функция МЕСЯЦ() принимает один аргумент — выражение типа «Дата» — и возвращает целое число от 1 до 12. Это самый простой способ получить месяц, когда нужно отфильтровать записи или вывести номер месяца как отдельную колонку.

// Выбор документов, проведённых в марте (любого года)

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.Дата,

МЕСЯЦ(Реализация.Дата) КАК НомерМесяца

ИЗ

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

ГДЕ

МЕСЯЦ(Реализация.Дата) = 3

Обратите внимание: функция возвращает именно номер, а не название месяца. Если в отчёте нужно «Январь», «Февраль» и т.д., номер придётся преобразовывать — через конструкцию ВЫБОР КОГДА ... ТОГДА либо уже на стороне СКД или при выводе результата.

Если поле может содержать пустую дату (01.01.0001), функция МЕСЯЦ() вернёт 1, что иногда искажает выборку. Перед применением стоит проверить дату на заполненность: ГДЕ Реализация.Дата <> ДАТАВРЕМЯ(1,1,1).

Приведение даты к началу месяца: НАЧАЛОПЕРИОДА

Когда требуется не номер месяца, а единая дата-признак для группировки, используется НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ). Функция возвращает первую секунду месяца, например для 15.03.2026 14:30:00 результатом будет 01.03.2026 00:00:00. Все записи одного месяца получают одинаковое значение, и по нему удобно группировать.

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

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

НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)

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

Месяц

Парная функция КОНЕЦПЕРИОДА(Дата, МЕСЯЦ) возвращает последнюю секунду месяца (23:59:59 последнего дня). Она полезна в условиях вида «период по конец указанного месяца включительно», когда верхняя граница передаётся параметром как произвольная дата.

Группировка итогов по месяцам в виртуальных таблицах

Для регистров накопления и сведений с периодичностью у виртуальных таблиц (Обороты, ОстаткиИОбороты) есть встроенный механизм периодичности. Вместо ручного приведения дат достаточно указать параметр «Периодичность» со значением «Месяц» — платформа сама разобьёт итоги по месяцам и добавит поле Период.

ВЫБРАТЬ

Обороты.Период КАК Месяц,

Обороты.Номенклатура,

СУММА(Обороты.КоличествоОборот) КАК Количество

ИЗ

РегистрНакопления.Продажи.Обороты(

&НачалоГода, &КонецГода, Месяц, ) КАК Обороты

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

Обороты.Период,

Обороты.Номенклатура

Поле Период при периодичности «Месяц» содержит начало соответствующего месяца. Этот вариант быстрее ручной группировки по таблице движений, потому что платформа использует предрассчитанные итоги, если они включены для регистра.

Когда какой способ выбрать

Сравнение вариантов

МЕСЯЦ(Дата)

Подходит для фильтрации и вывода номера месяца. Не даёт различия между годами — март 2023 и март 2026 вернут одно значение.

НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ)

Универсальный способ группировки по месяцам для любых таблиц, включая соединения нескольких источников.

Периодичность «Месяц» в виртуальной таблице

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

Отбор документов за конкретный месяц

Задача «выбрать всё за март» решается двумя путями. Первый — сравнение номера месяца и года через МЕСЯЦ() и ГОД(). Он прост, но заставляет платформу вычислять функцию для каждой строки таблицы, что на больших объёмах замедляет запрос и не использует индекс по дате.

// Медленный вариант

ГДЕ

МЕСЯЦ(Док.Дата) = 3

И ГОД(Док.Дата) = 2026

// Быстрый вариант — по диапазону дат

ГДЕ

Док.Дата МЕЖДУ ДАТАВРЕМЯ(2026,3,1) И ДАТАВРЕМЯ(2026,3,31,23,59,59)

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

Название месяца и представление в отчёте

Язык запросов не имеет функции форматирования даты, поэтому «красивое» название месяца получают одним из трёх способов. Первый — конструкция ВЫБОР с двенадцатью ветками прямо в запросе. Второй — функция Формат(Дата, "ДФ=MMMM") в коде после выполнения запроса. Третий — вычисляемое поле или ресурс оформления в СКД.

ВЫБОР

КОГДА МЕСЯЦ(Продажи.Период) = 1 ТОГДА "Январь"

КОГДА МЕСЯЦ(Продажи.Период) = 2 ТОГДА "Февраль"

КОГДА МЕСЯЦ(Продажи.Период) = 3 ТОГДА "Март"

// ... и так далее до 12

КОНЕЦ КАК НазваниеМесяца

При сортировке по названию месяца помните: строки упорядочатся по алфавиту («Август» раньше «Апреля»), а не по календарю. Сортируйте по исходному полю даты или номеру месяца, а название используйте только для отображения.

Порядок действий для отчёта по месяцам
  1. 1
    Определите источник: виртуальная таблица регистра или физическая таблица документов.
  2. 2
    Для регистра задайте периодичность «Месяц», для документов — вычислите НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ).
  3. 3
    Добавьте поле месяца в секцию СГРУППИРОВАТЬ ПО вместе с аналитикой.
  4. 4
    Отсортируйте результат по полю даты-начала месяца, а не по его названию.
  5. 5
    Проверьте итоги на одном месяце, сверив с типовым отчётом конфигурации.

Типичные ошибки и как их проверить

Самая частая проблема — потеря года при использовании МЕСЯЦ() в группировке: данные разных лет сливаются в одну строку. Решение — группировать по НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ), где год сохраняется, либо добавлять ГОД(Дата) отдельным полем группировки.

Вторая ошибка — неверная верхняя граница периода. Если задать условие Дата <= ДАТАВРЕМЯ(2026,3,31), будут отобраны записи только до 00:00:00 31 марта, а все документы за этот день пропадут. Используйте КОНЕЦПЕРИОДА() или функцию КонецМесяца() при передаче параметра.

Типичные ошибки
01
Группировка по МЕСЯЦ(Дата) без учёта года — данные разных лет складываются в одну строку.
02
Условие Дата <= конец месяца без указания времени 23:59:59 — теряется последний день периода.
03
Сортировка по названию месяца — получается алфавитный, а не календарный порядок.
04
Применение МЕСЯЦ() к пустой дате без проверки — пустые даты дают месяц 1 и попадают в январь.
05
Фильтр через МЕСЯЦ() в ГДЕ на больших таблицах — запрос не использует индекс и выполняется медленно.
Контрольные точки

Как проверить результат

Количество строк-групп
Норма

Число строк равно количеству месяцев с данными в выбранном периоде

Тревожный признак

Строк меньше, чем месяцев, или одна строка на все годы

Суммы по месяцу
Норма

Итог за месяц совпадает с типовым отчётом конфигурации за тот же период

Тревожный признак

Расхождения на сумму документов последнего дня месяца

Порядок строк
Норма

Месяцы идут в календарной последовательности

Тревожный признак

Алфавитный порядок или хаотичная выдача

Отличия в клиент-серверном варианте и СКД

Функции МЕСЯЦ(), НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() поддерживаются всеми СУБД, с которыми работает платформа 1С, поэтому запрос переносим между файловым и клиент-серверным вариантами. Однако план выполнения может отличаться: на больших таблицах в клиент-серверном режиме вычисление функции в условии особенно заметно замедляет выборку.

В системе компоновки данных дополнительно доступны вычисляемые поля и функции языка выражений СКД, например форматирование даты для представления. Это позволяет вынести «украшательства» из текста запроса в настройки отчёта и оставить запрос максимально простым и быстрым.

Итог

Что важно запомнить

Номер месяца из даты даёт функция МЕСЯЦ(Дата). Для группировки по месяцам используйте НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) или периодичность «Месяц» в виртуальных таблицах регистров. Для отбора за месяц передавайте диапазон дат параметрами, а не вычисляйте функцию в условии. Всегда учитывайте год и проверяйте итоги на контрольном периоде.

Частые вопросы

Как получить месяц и год одним полем?

Используйте НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) — результат содержит и год, и месяц в виде даты первого дня. Если нужна строка вида «03.2026», сформируйте её функцией Формат() в коде после выполнения запроса или вычисляемым полем в СКД.

Почему МЕСЯЦ() возвращает 1 для пустого поля?

Пустая дата в 1С — это 01.01.0001, и её месяц формально равен январю. Перед применением функции отфильтруйте такие записи условием Дата <> ДАТАВРЕМЯ(1,1,1) или обработайте их через ВЫБОР КОГДА.

Что быстрее: МЕСЯЦ() в условии или диапазон дат?

Диапазон дат. Условие Дата МЕЖДУ &Начало И &Конец позволяет СУБД использовать индекс по полю даты, а вызов функции для каждой строки заставляет сканировать таблицу целиком. На больших регистрах разница во времени выполнения существенна.

Как сгруппировать по месяцам в запросе к документам?

Добавьте в поля выборки НАЧАЛОПЕРИОДА(Док.Дата, МЕСЯЦ) КАК Месяц и повторите то же выражение в секции СГРУППИРОВАТЬ ПО. Числовые поля оберните агрегатными функциями СУММА(), КОЛИЧЕСТВО() и т.д.

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

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

Работает ли МЕСЯЦ() в параметрах виртуальной таблицы?

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