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

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

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

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

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

Ключевой момент, который нужно понять сразу: месяц можно получить либо как число (от 1 до 12), либо как строку («Январь», «03», «2026-05»). Это разные результаты, и функции для них разные. Путаница между ними — самая частая причина ошибок вида «преобразование значения к типу Число не может быть выполнено».

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

Функция Месяц(): получить номер месяца числом

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

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

НомерМесяца = Месяц(ДатаДокумента); // например, 5 для мая

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

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

КонецЕсли;

Числовой результат удобен для сравнений, вычислений и отборов. Например, чтобы определить квартал, достаточно выражения Цел((Месяц(Дата) - 1) / 3) + 1. Для проверки попадания даты в конкретный месяц сравнивайте пару «год + месяц», иначе январь одного года совпадёт с январём другого.

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

Функция Формат(): вывести месяц строкой в нужном виде

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

ДатаОтчета = ТекущаяДатаСеанса();

Формат(ДатаОтчета, "ДФ=MM"); // "05" — две цифры

Формат(ДатаОтчета, "ДФ=MMM"); // "мая" — краткое название

Формат(ДатаОтчета, "ДФ=MMMM"); // "Май" — полное название

Формат(ДатаОтчета, "ДФ='ММММ'"); // "Май" — регистронезависимо

Шаблон можно комбинировать с другими элементами даты. Например, Формат(Дата, "ДФ='MMMM yyyy'") вернёт строку вида «Май 2026» — типичный заголовок для отчёта за месяц. Кавычки внутри шаблона нужны, чтобы буквы текста не интерпретировались как управляющие символы формата.

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

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

Месяц(Дата)

Возвращает число 1–12. Подходит для сравнений, вычислений, отборов. Не даёт название месяца.

Формат(Дата, "ДФ=MMMM")

Возвращает строку с названием месяца. Подходит для вывода пользователю и печати. Не пригоден для сравнений в многоязычной среде.

МЕСЯЦ() в запросе

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

Месяц из даты в запросе 1С

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

ВЫБРАТЬ

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

СУММА(Реализация.СуммаДокумента) КАК Сумма

ИЗ

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

ГДЕ

Реализация.Проведен

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

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

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

НомерМесяца

Такой запрос сгруппирует документы по номеру месяца. Но здесь кроется частая ошибка: группировка только по месяцу склеит данные разных лет. Если отбор охватывает больше одного года, добавляйте в группировку и ГОД(Реализация.Дата), иначе январь прошлого и текущего года сольются в одну строку.

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

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

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

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

Для произвольных запросов в наборе данных автоматические поля-периоды тоже появляются, если поле даты выбрано в запросе. Если их нет — проверьте, что у поля установлен тип Дата, а не Строка: приведение даты к строке в запросе лишает СКД возможности строить периодические группировки.

Группировка отчёта СКД по месяцам
  1. 1
    Убедитесь, что в запросе набора данных выбрано поле типа Дата (например, Период)
  2. 2
    Откройте закладку «Настройки» схемы компоновки
  3. 3
    В списке доступных полей найдите «Период месяц»
  4. 4
    Перетащите его в группировку строк отчёта
  5. 5
    Сформируйте отчёт и проверьте, что строки сгруппированы по месяцам

Месяц в печатных формах и макетах

В печатных формах месяц чаще всего нужен в текстовом виде: «г. Москва, май» или дата прописью. Здесь работает тот же Формат() — результат присваивается параметру макета перед выводом области. Для даты вида «15 мая 2026 г.» используйте шаблон ДЛФ=D (длинный формат даты), который сам подставит название месяца.

ОбластьШапка.Параметры.ДатаДокумента =

Формат(Документ.Дата, "ДЛФ=D"); // "15 мая 2026 г."

ОбластьШапка.Параметры.МесяцОтчета =

Формат(Документ.Дата, "ДФ='MMMM yyyy'"); // "май 2026"

В типовых конфигурациях для документов часто доступны общие модули работы с датами (например, функции формирования даты прописью в БСП). Перед тем как писать собственное форматирование, проверьте, нет ли готовой функции в общих модулях конфигурации — это избавит от расхождений в оформлении разных печатных форм.

Если в макете месяц должен склоняться или стоять в родительном падеже («от 15 мая»), длинный формат ДЛФ=D уже даёт нужную форму. Самостоятельно склонять название месяца строковыми операциями не стоит — используйте шаблоны формата, они учитывают правила языка.

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

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

Вторая ошибка — сравнение результата Месяц() со строкой. Выражение Месяц(Дата) = "5" ложно даже для мая, потому что сравниваются разные типы. Сравнивайте с числом или явно приводите тип через Строка() / Число().

Третья ошибка — игнорирование года при группировках и отборах, о чём уже говорилось выше. Четвёртая — использование ТекущаяДата() в серверном коде там, где нужна дата сеанса: в клиент-серверном режиме время клиента и сервера могут различаться, и документ, проведённый в ночь на первое число, может попасть не в тот месяц. Для серверной логики применяйте ТекущаяДатаСеанса().

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

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

После внедрения кода проверьте его на граничных значениях: первое и последнее число месяца, переход через год (31 декабря и 1 января), пустая дата. Для запроса с группировкой по месяцам убедитесь, что суммы по строкам совпадают с контрольным отчётом за тот же период без группировки.

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

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

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

Числовой месяц
Норма

Месяц(Дата) возвращает число от 1 до 12, совпадающее с календарём

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

Возвращается 1 при пустой дате или ошибка преобразования типа

Название месяца
Норма

Формат с ДФ=MMMM выводит полное название на языке конфигурации

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

Выводятся цифры или название на другом языке

Группировка в запросе
Норма

Каждая строка результата — отдельный месяц отдельного года

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

Данные разных лет объединены в одну строку

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

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

Функция Формат() с шаблоном ДФ=MMMM возвращает название с заглавной буквы («Май»), а ДФ=MMMM в сочетании с ДЛФ=D — в составе даты прописью в нужном падеже. Если нужно изменить регистр уже полученной строки, используйте функции ВРег(), НРег() или ТРег().

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

Используйте функции НачалоМесяца(Дата) и КонецМесяца(Дата). Первая возвращает дату с временем 00:00:00 первого числа, вторая — 23:59:59 последнего. Эти же функции удобны для передачи границ периода параметрами в запрос вместо отбора по МЕСЯЦ().

Работает ли функция Месяц() на клиенте?

Да, функция доступна в любом контексте: на толстом, тонком и веб-клиенте, а также на сервере. Ограничений по директивам компиляции у неё нет, поэтому её можно вызывать и в форме, и в модуле объекта, и в общем модуле.

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

Надёжнее всего передать в запрос два параметра — НачалоМесяца(Дата) и КонецМесяца(Дата) — и написать условие ГДЕ Документ.Дата МЕЖДУ &Начало И &Конец. Такой вариант использует индекс по дате и работает быстрее, чем МЕСЯЦ(Дата) = &Месяц, особенно на больших таблицах.

Почему Месяц() возвращает 1 для незаполненной даты?

Пустая дата в 1С — это 01.01.0001 00:00:00, а её месяц — январь, то есть 1. Функция отрабатывает корректно, проблема в логике: перед извлечением месяца проверяйте дату через ЗначениеЗаполнено() и обрабатывайте пустое значение отдельно.

Как вывести месяц и год в одном поле отчёта?

В коде используйте Формат(Дата, "ДФ='ММММ yyyy'") — получите строку вида «Май 2026». В СКД добавьте вычисляемое поле с аналогичным выражением либо используйте группировку по полю «Период месяц», которое платформа формирует автоматически для полей типа Дата.

Итог

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

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