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

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

Как получить месяц текущей даты в 1С

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

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

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

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

Базовый способ: функция Месяц() и ТекущаяДата()

Функция Месяц() встроена в язык и не требует подключения общих модулей. Она принимает один параметр — значение типа «Дата» — и возвращает целое число: порядковый номер месяца. Для января это 1, для декабря — 12.

Минимальный рабочий пример:

НомерМесяца = Месяц(ТекущаяДата());

Сообщить(НомерМесяца); // например, 5

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

ТекДата = ТекущаяДата();

НомерМесяца = Месяц(ТекДата);

НомерГода = Год(ТекДата);

НомерДня = День(ТекДата);

Результат функции — число, а не строка. Это важно при сравнениях: условие Если НомерМесяца = 5 Тогда работает корректно, а сравнение со строкой «05» потребует преобразования типов.

ТекущаяДата() или ТекущаяДатаСеанса(): что выбрать

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

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

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

ТекущаяДата()

Подходит для интерфейсных подсказок на клиенте. Ограничение: зависит от часов компьютера пользователя, может отличаться от серверного времени.

ТекущаяДатаСеанса()

Рекомендуется для учётной логики и серверного кода. Единое время для всех пользователей, учитывает часовой пояс сеанса.

РабочаяДата

Используйте, если по настройкам пользователя документы должны датироваться не текущим, а фиксированным рабочим днём.

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

Получение месяца в запросе

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

ВЫБРАТЬ

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

СУММА(Реализация.Сумма) КАК Сумма

ИЗ

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

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

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

Чтобы передать текущий месяц в запрос как параметр, вычислите его в коде и подставьте через УстановитьПараметр:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ... ГДЕ МЕСЯЦ(Док.Дата) = &НомерМесяца";

Запрос.УстановитьПараметр("НомерМесяца", Месяц(ТекущаяДатаСеанса()));

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

Порядок действий
  1. 1
    Определите, где выполняется код: на клиенте или на сервере
  2. 2
    Для сервера и учётной логики вызовите ТекущаяДатаСеанса(), для клиентского интерфейса — ТекущаяДата()
  3. 3
    Сохраните дату в переменную, если она нужна более одного раза
  4. 4
    Получите номер месяца функцией Месяц(Дата)
  5. 5
    Для запроса используйте МЕСЯЦ(Поле) или передавайте границы периода через НачалоМесяца() и КонецМесяца()
  6. 6
    Проверьте результат выводом через Сообщить() или в отладчике

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

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

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

НазваниеМесяца = Формат(ТекДата, "ДФ=MMMM"); // "Май"

МесяцИГод = Формат(ТекДата, "ДФ='MMMM yyyy'"); // "Май 2026"

Конструкция ДФ=MMMM выводит полное название месяца, ДФ=MMM — сокращённое. Регистр букв в форматной строке имеет значение, поэтому копируйте её точно. Язык вывода можно задать параметром локализации Л=, если требуется название не на языке по умолчанию.

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

bsl
НомерМесяца = Месяц(ТекущаяДатаСеанса());
НазваниеМесяца = Формат(ТекущаяДатаСеанса(), "ДФ=MMMM");
НачалоПериода = НачалоМесяца(ТекущаяДатаСеанса());
КонецПериода = КонецМесяца(ТекущаяДатаСеанса());

Работа с границами месяца и смещением

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

  • НачалоМесяца(Дата) — первое число месяца, время 00:00:00;
  • КонецМесяца(Дата) — последнее число, время 23:59:59;
  • ДобавитьМесяц(Дата, КоличествоМесяцев) — сдвиг на указанное число месяцев вперёд или назад.

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

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

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

Проверка результата и типичные ошибки

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

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

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

Тип значения
Норма

Месяц() возвращает число от 1 до 12

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

Получена строка или Неопределено — проверьте, не потерялось ли значение даты

Источник даты
Норма

Серверная логика использует ТекущаяДатаСеанса()

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

На клиенте сбиты часы, и ТекущаяДата() даёт другой месяц

Отбор в запросе
Норма

Документы последнего дня месяца попадают в выборку

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

Данные последнего дня теряются — верхняя граница задана без КонецМесяца()

Типичные ошибки
01
Вызов ТекущаяДата() на клиенте для учётной логики — при сбитых часах пользователя документ попадает не в тот месяц
02
Сравнение номера месяца без учёта года — документы января разных лет смешиваются в одну группу
03
Сравнение даты с верхней границей без КонецМесяца() — данные последнего дня периода выпадают
04
Ожидание строки от функции Месяц() — она возвращает число, строковое форматирование нужно делать через Формат()
05
Многократный вызов ТекущаяДата() в одном алгоритме — на границе суток части даты могут относиться к разным дням

Отдельная ошибка — попытка получить месяц от пустой даты. Если переменная не заполнена, Месяц() вернёт значение для даты по умолчанию (01.01.0001), то есть 1. Перед вычислением проверяйте дату через ЗначениеЗаполнено(), особенно когда дата приходит из реквизита объекта или параметра.

Итог

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

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

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

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

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

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

Используйте функцию Формат() с форматной строкой: Формат(Дата, "ДФ=MMMM") вернёт полное название, например «Май», а "ДФ=MMM" — сокращённое. Для падежных форм придётся написать собственную функцию-соответствие.

Как получить месяц предыдущей даты или прошлого месяца?

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

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

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

Почему Месяц() возвращает 1, хотя дата другая?

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

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

Вычислите границы: НачалоМесяца(ТекущаяДатаСеанса()) и КонецМесяца(ТекущаяДатаСеанса()), передайте их в запрос параметрами и поставьте условие ГДЕ Док.Дата МЕЖДУ &Начало И &Конец. Такой фильтр не зависит от года и корректно включает последний день месяца.