Разработка и Конфигурация · 10 мин
Как в 1С получить номер месяца из даты
Разбираем, как в 1С получить номер месяца из даты: функция Месяц(), работа в запросах, форматирование даты, типичные ошибки и примеры кода для разработчика.
Задача получить номер месяца из даты возникает в 1С постоянно: при группировке отчётов, расчёте периодических показателей, формировании номеров документов и проверке условий в коде. Встроенный язык 1С предоставляет для этого штатную функцию, а язык запросов — собственный аналог, поэтому важно понимать, где какой инструмент применять.
Основной способ в коде — функция Месяц(), которая принимает значение типа Дата и возвращает целое число от 1 до 12. В запросах используется одноимённая функция МЕСЯЦ(), а для представления месяца в виде строки с ведущим нулём или названием применяется функция Формат() с форматной строкой.
Ниже разобраны все рабочие варианты: от простейшего вызова до получения номера месяца в запросе, в СКД и при работе с периодами. Отдельно рассмотрены типичные ошибки — например, передача пустой даты или попытка сравнить результат функции со строкой.
Функция Месяц() — основной способ в коде
Функция Месяц() относится к группе функций работы с датами встроенного языка. Она принимает единственный параметр — значение типа Дата — и возвращает число от 1 до 12, соответствующее порядковому номеру месяца. Время в составе даты игнорируется.
Типичный пример использования в модуле:
ДатаДокумента = ДокументОбъект.Дата;
НомерМесяца = Месяц(ДатаДокумента); // например, 3 для марта
Если НомерМесяца = 12 Тогда
// действия для декабря
КонецЕсли;
Обратите внимание на тип возвращаемого значения — это число, а не строка. Поэтому сравнение вида Месяц(Дата) = "3" всегда даст Ложь, а конкатенация с числом потребует явного преобразования через Строка() или Формат().
Если передать в функцию пустую дату (значение '00010101'), результатом будет 1 — январь. Это частый источник ошибок: незаполненный реквизит даты молча превращается в «первый месяц», и логика отчёта искажается без каких-либо сообщений об ошибке.
Как получить номер месяца текущей даты
Для текущей даты сначала получают её значение, затем извлекают месяц. На клиенте и на сервере функции текущей даты различаются, и это принципиально важно для корректности учётных данных.
// На клиенте (тонкий клиент, управляемые формы)
НомерМесяца = Месяц(ТекущаяДата());
// На сервере
НомерМесяца = Месяц(ТекущаяДатаСеанса());
Функция ТекущаяДата() на клиенте возвращает дату компьютера пользователя, которая может отличаться от серверной. Для учётных операций — проведения документов, расчёта периодов — следует использовать ТекущаяДатаСеанса(), чтобы все пользователи опирались на единое серверное время.
Проверка попадания в конкретный месяц
Частый сценарий — проверить, относится ли дата к заданному месяцу. Здесь надёжнее сравнивать не только номер месяца, но и год, иначе март прошлого года и март текущего будут неразличимы:
Если Месяц(ПроверяемаяДата) = Месяц(ТекущаяДатаСеанса())
И Год(ПроверяемаяДата) = Год(ТекущаяДатаСеанса()) Тогда
// дата в текущем месяце текущего года
КонецЕсли;
Номер месяца в запросе 1С
В языке запросов используется функция МЕСЯЦ(), которая работает аналогично: принимает поле типа Дата и возвращает число от 1 до 12. Это позволяет группировать и фильтровать данные прямо на уровне СУБД, не выгружая лишние строки.
ВЫБРАТЬ
МЕСЯЦ(Продажи.Период) КАК НомерМесяца,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
МЕСЯЦ(Продажи.Период)
Такой запрос удобен для помесячной аналитики. Однако группировка только по номеру месяца объединит данные разных лет — если регистр содержит сведения за несколько лет, добавьте в группировку ГОД(Продажи.Период).
Фильтрация по месяцу в условии ГДЕ
Фильтровать по МЕСЯЦ() в условии ГДЕ допустимо, но неэффективно на больших таблицах: функция применяется к каждой строке, и индекс по полю даты не используется. Производительнее передавать границы периода параметрами:
ГДЕ
Продажи.Период МЕЖДУ &НачалоМесяца И &КонецМесяца
Границы удобно вычислить функциями НачалоПериода(Дата, Месяц) и КонецПериода(Дата, Месяц) перед выполнением запроса.
НомерМесяца = Месяц(ТекущаяДатаСеанса()); // число от 1 до 12Номер месяца в виде строки: Формат() и ведущий ноль
Когда номер месяца нужен не для вычислений, а для отображения — в номере документа, имени файла, заголовке печатной формы, — часто требуется двузначный формат: 01, 02, …, 12. Функция Месяц() вернёт просто 1 или 2, поэтому используют Формат() с форматной строкой.
СтрокаМесяца = Формат(ДатаДокумента, "ДФ=MM"); // "03"
МесяцПрописью = Формат(ДатаДокумента, "ДФ=MMMM"); // "Март"
МесяцИГод = Формат(ДатаДокумента, "ДФ='MMMM yyyy'"); // "Март 2026"
Обратите внимание на регистр в форматной строке: MM — месяц, а mm — минуты. Это одна из самых распространённых ошибок: вместо «03» (март) разработчик получает «00», потому что минуты в дате документа равны нулю.
Если двузначный номер нужен как число с лидирующим нулём без Формат(), можно использовать конструкцию Формат(Месяц(Дата), "ЧЦ=2; ЧВН="), но вариант с ДФ=MM короче и читается лучше.
Номер месяца в СКД и отчётах
В системе компоновки данных номер месяца обычно получают двумя путями: через вычисляемое поле в наборе данных или через функции языка выражений СКД. Если источник данных — запрос, проще всего добавить поле МЕСЯЦ(Период) КАК НомерМесяца прямо в текст запроса, как показано выше.
Для группировки по месяцам в отчёте часто удобнее использовать не номер, а периодичность: в настройках СКД у группировки по полю даты можно указать тип периода «Месяц». Тогда платформа сама сгруппирует данные по месяцам с учётом года и выведет понятные заголовки.
Если нужен именно порядковый номер месяца с начала года для расчётов (например, для нарастающего итога или план-факт анализа), вычисляемое поле с выражением Месяц(Период) на языке выражений СКД решает задачу без изменения запроса.
Выбор способа под конкретную задачу
Единственно верного способа нет — выбор зависит от того, где выполняется код и что нужно на выходе. Ниже сопоставлены основные варианты.
| Задача | Способ | Результат |
|---|---|---|
| Номер месяца в коде модуля | Месяц(Дата) | Число 1–12 |
| Группировка в запросе | МЕСЯЦ(Поле) | Число 1–12 |
| Двузначный номер для строки | Формат(Дата, "ДФ=MM") | Строка «01»–«12» |
| Название месяца | Формат(Дата, "ДФ=MMMM") | Строка «Январь»… |
| Группировка в отчёте СКД | Периодичность «Месяц» | Группировка с учётом года |
Для вычислений всегда берите числовой вариант (Месяц()), для отображения — форматирование. Смешивание подходов, например сравнение строкового представления с числом, приводит к трудноуловимым ошибкам логики.
Как выбрать действие
Проверка результата и контрольные точки
После внедрения кода полезно проверить поведение на граничных значениях: первое января, 31 декабря, пустая дата, дата с временем 23:59:59. Функция Месяц() игнорирует время, поэтому 31.12 23:59 корректно вернёт 12.
Для быстрой проверки в конфигураторе удобно вывести значение через Сообщить() или посмотреть в табло отладчика. В запросах результат проверяется в консоли запросов: убедитесь, что колонка с номером месяца содержит ожидаемые числа и что данные разных лет не смешались.
Как проверить результат
Число 3
Строка «3» или «03» — значит, применено форматирование там, где нужно число
Двузначный номер, например «03»
«00» — перепутан регистр, использовано mm (минуты)
Отдельные строки для каждого месяца каждого года
Одна строка на месяц со склеенной суммой — не хватает ГОД() в группировке
Ветка кода обрабатывает незаполненность явно
Месяц() молча возвращает 1, и данные попадают в январь
Часто задаваемые вопросы
Что вернёт Месяц(), если дата не заполнена?
Пустая дата в 1С равна 01.01.0001, поэтому функция вернёт 1. Чтобы избежать искажения данных, перед вызовом проверяйте дату через ЗначениеЗаполнено() или сравнение с '00010101'.
Чем Месяц() в модуле отличается от МЕСЯЦ() в запросе?
По сути — ничем, обе возвращают число от 1 до 12. Разница в месте выполнения: функция модуля работает с уже полученным значением даты, а функция запроса вычисляется на стороне СУБД и позволяет группировать и фильтровать данные без выгрузки в память.
Как получить номер месяца с ведущим нулём, например «05»?
Используйте Формат(Дата, "ДФ=MM"). Функция Месяц() сама по себе возвращает число без форматирования, поэтому для строкового представления с нулём нужна именно форматная строка. Главное — не перепутать MM (месяц) с mm (минуты).
Можно ли получить номер месяца от произвольной даты, заданной строкой?
Сначала строку нужно преобразовать в тип Дата — например, через Дата("20260315") или разбор строки. После этого к полученному значению применяется обычная функция Месяц(). Передавать строку напрямую в Месяц() нельзя — возникнет ошибка несоответствия типов.
Как сгруппировать данные по месяцам, если в базе несколько лет?
Одной группировки по МЕСЯЦ(Период) недостаточно — данные разных лет объединятся. Добавьте в группировку ГОД(Период) либо группируйте по выражению НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), которое даёт уникальное значение для каждого месяца каждого года.
Как получить название месяца, а не его номер?
Используйте Формат(Дата, "ДФ=MMMM") — вернётся полное название («Март»), а Формат(Дата, "ДФ=MMM") даст сокращение («мар»). Результат зависит от региональных настроек информационной базы.
Что важно запомнить
Номер месяца в коде получают функцией Месяц(Дата) — результат число от 1 до 12; в запросе — функцией МЕСЯЦ(). Для строкового вида с ведущим нулём применяйте Формат(Дата, "ДФ=MM"), не путая MM с mm. Всегда проверяйте заполненность даты и добавляйте ГОД() при группировке данных за несколько лет.