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

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

Как выбрать месяц из даты в 1С

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

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

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

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

Функция Месяц() во встроенном языке 1С

Основной способ — встроенная функция Месяц(). Она принимает значение типа Дата и возвращает число от 1 до 12 — порядковый номер месяца. Функция доступна на тонком, толстом и веб-клиенте, а также на сервере, то есть работает везде без ограничений.

Пример использования:

ДатаДокумента = ДокументОбъект.Дата;

НомерМесяца = Месяц(ДатаДокумента); // число от 1 до 12

Если НомерМесяца = 12 Тогда

Сообщить("Документ относится к декабрю");

КонецЕсли;

Если передать в функцию пустую дату ('00010101'), результатом будет 1 — январь, поскольку пустая дата в 1С соответствует 1 января года 1. Это частая причина логических ошибок: перед сравнением месяца проверяйте, заполнена ли дата, через ЗначениеЗаполнено() или сравнение с пустой датой.

Обратите внимание: Месяц() возвращает именно число, а не строку. Если результат нужно сравнить со строкой или вывести с лидирующим нулём («01», «02»), потребуется преобразование через Формат():

СтрокаМесяца = Формат(Месяц(ТекущаяДатаСеанса()); "ЧЦ=2; ЧВН="); // "05"

Получение месяца в запросе: функция МЕСЯЦ()

Когда данные выбираются запросом, извлекать месяц нужно на уровне запроса, а не в цикле обхода — это быстрее и позволяет группировать и фильтровать сразу. В языке запросов 1С есть функция МЕСЯЦ(), которая работает аналогично: принимает поле типа Дата и возвращает число.

ВЫБРАТЬ

МЕСЯЦ(Продажи.Период) КАК НомерМесяца,

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

ИЗ

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

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

МЕСЯЦ(Продажи.Период)

Функцию МЕСЯЦ() можно использовать не только в списке выборки, но и в условии ГДЕ и в секции ИМЕЮЩИЕ. Например, отбор документов только за март:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

Название месяца: функция Формат() и её шаблоны

Числовой номер подходит для расчётов, но в печатных формах и отчётах обычно нужно название: «март», «Март» или «марта» в родительном падеже. Для этого служит функция Формат() с форматной строкой даты.

Формат(Дата; "ДФ=MMMM");      // "Март"

Формат(Дата; "ДФ=MMM"); // "мар"

Формат(Дата; "ДФ='дд MMMM гггг'"); // "15 марта 2026" (зависит от региональных настроек)

Регистр букв в шаблоне влияет на результат: MMMM выводит полное название месяца, MMM — сокращённое, MM — номер с ведущим нулём, M — номер без нуля. Падеж и регистр названия зависят от региональных настроек информационной базы или сеанса, поэтому на разных серверах результат может отличаться.

Если требуется гарантированный результат независимо от настроек сервера, например для выгрузки в XML или обмена с внешней системой, используйте явный массив названий:

Месяцы = СтрРазделить("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь", ",");

НазваниеМесяца = Месяцы[Месяц(Дата) - 1];

Начало и конец месяца: НачалоМесяца() и КонецМесяца()

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

Начало = НачалоМесяца(Дата);  // 01.03.2026 0:00:00

Конец = КонецМесяца(Дата); // 31.03.2026 23:59:59

КонецМесяца() возвращает время 23:59:59 последнего дня. Это важно при сравнениях: условие Дата <= КонецМесяца(Период) корректно включает весь последний день, тогда как ручное указание «31.03.2026» без времени означает полночь и «отрезает» весь день.

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

Месяц

Месяц в СКД и отчётах

В системе компоновки данных месяц обычно получают двумя путями: на уровне запроса набора данных или вычисляемым полем. Первый способ предпочтительнее — группировка выполняется СУБД, что заметно быстрее на больших объёмах.

Если запрос уже сформирован и менять его нельзя, добавьте вычисляемое поле с выражением Месяц(Период) — в выражениях СКД доступны функции встроенного языка. Для названия месяца в вычисляемом поле используется Формат(Период, "ДФ=MMMM").

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

Типичные ошибки
01
Группировка только по МЕСЯЦ() без ГОД() — данные одного месяца разных лет суммируются в одну строку
02
Сортировка по названию месяца — строки выстраиваются по алфавиту, а не по календарю; сортируйте по номеру или дате начала месяца
03
Сравнение результата Месяц() со строкой — функция возвращает число, сравнение со строкой "3" даст ложь
04
Игнорирование пустой даты — Месяц('00010101') возвращает 1, и пустые даты попадают в январь
05
Условие ГДЕ МЕСЯЦ(Дата) = N на больших таблицах — индекс не используется, запрос резко замедляется

Различия платформ и режимов работы

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

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

В мобильной платформе и внешних компонентах набор функций может отличаться — перед использованием проверяйте синтакс-помощник под конкретную целевую платформу. Для запросов к внешним источникам данных функции дат транслируются в диалект конкретной СУБД, и там поведение МЕСЯЦ() может зависеть от настроек подключения.

Маршрут решения

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

Нужен номер месяца в коде для расчётов или сравненийИспользуйте Месяц(Дата) — возвращает число от 1 до 12
Нужно сгруппировать или отфильтровать данные запросаПрименяйте МЕСЯЦ() в запросе, а для отбора по конкретному месяцу года — сравнение дат МЕЖДУ
Нужно название месяца в печатной форме или отчётеИспользуйте Формат(Дата; "ДФ=MMMM") или массив названий для гарантированного падежа
Нужны границы месяца для отбора или остатковНачалоМесяца() и КонецМесяца() в коде, НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() в запросе
Группировка по месяцам за несколько летГруппируйте по НАЧАЛОПЕРИОДА(Период, МЕСЯЦ) или паре ГОД()+МЕСЯЦ()

Проверка результата и отладка

После внедрения кода проверьте результат на граничных значениях: 1 января, 31 декабря, 29 февраля високосного года и пустой дате. Именно на границах проявляются ошибки смещения периодов и неверные сравнения.

Для быстрой проверки в отладчике вычислите выражение Месяц(Дата) и убедитесь, что тип результата — Число. В запросе временно выведите поле МЕСЯЦ(Период) без группировки и просмотрите несколько строк: значения должны соответствовать датам в исходной таблице.

Если название месяца выводится не в том падеже или не на том языке, проверьте региональные настройки информационной базы (Администрирование — Региональные настройки) и параметр локализации сеанса. Для критичных выгрузок замените Формат() на явный массив названий — это исключает зависимость от окружения.

Контрольные точки

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

Тип возвращаемого значения Месяц()
Норма

Число от 1 до 12

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

Строка или дата — значит, применена другая функция

Группировка по месяцам за несколько лет
Норма

Январь каждого года — отдельная строка

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

Все январи слиты в одну строку — не хватает ГОД() или НАЧАЛОПЕРИОДА

Порядок месяцев в отчёте
Норма

Январь, февраль, март по порядку

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

Август идёт первым — сортировка по строковому названию

Пустые даты в выборке
Норма

Отфильтрованы или обработаны отдельно

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

Попали в январь — Месяц('00010101') возвращает 1

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

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

Стандартный шаблон Формат(Дата; "ДФ=MMMM") обычно возвращает именительный падеж. Для гарантированного родительного используйте собственный массив: СтрРазделить("января,февраля,марта,...", ",") и выбор элемента по индексу Месяц(Дата)-1. В конфигурациях на БСП есть готовые функции работы с представлениями периодов.

Чем отличается МЕСЯЦ() в запросе от Месяц() в коде?

Результат одинаков — число от 1 до 12. Разница в месте выполнения: запросная функция вычисляется на стороне СУБД при выборке, что позволяет группировать и фильтровать без обхода результата в цикле. Обрабатывать месяц в цикле после запроса — лишняя работа и потеря производительности.

Почему условие ГДЕ МЕСЯЦ(Дата) = 5 работает медленно?

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

Как получить месяц с ведущим нулём, например «03»?

Функция Месяц() возвращает число, поэтому преобразуйте его: Формат(Месяц(Дата); "ЧЦ=2; ЧВН="). Альтернатива — сразу форматировать дату: Формат(Дата; "ДФ=MM") вернёт двузначный номер месяца строкой.

Месяц из даты в запросе возвращает 1 для пустых дат — как убрать?

Пустая дата в 1С — это 01.01.0001, поэтому МЕСЯЦ() честно возвращает 1. Добавьте в запрос условие ГДЕ Таблица.Дата <> ДАТАВРЕМЯ(1,1,1) либо обработайте через ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА NULL ИНАЧЕ МЕСЯЦ(Дата) КОНЕЦ.

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

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

Итог

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

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