Разработка и Конфигурация · 12 мин
Как получить текущий месяц в 1С
Как получить текущий месяц в 1С: функции ТекущаяДата, Месяц, НачалоМесяца, Формат. Примеры кода для встроенного языка, запросов и СКД с пояснениями.
Получение текущего месяца — одна из базовых задач при разработке и доработке конфигураций 1С. Она встречается при формировании заголовков отчётов, заполнении периодов документов, построении отборов и расчёте начислений. В зависимости от контекста — встроенный язык, запрос, СКД или управляемая форма — используются разные инструменты, и у каждого есть свои особенности.
Ключевой момент, который нужно понимать сразу: «текущий месяц» в 1С может означать три разные вещи — номер месяца (число от 1 до 12), дату начала месяца (первое число) или строковое название («январь», «Март»). Для каждого варианта есть своя функция, и путаница между ними — частая причина ошибок в отчётах и проведении документов.
Дополнительная сложность — разница между датой клиента и датой сервера. В клиент-серверном режиме функция ТекущаяДата() на клиенте и на сервере может вернуть разные значения, если часы компьютеров расходятся или пользователь работает через тонкий клиент из другого часового пояса. Это критично для учётных задач, где месяц влияет на период проведения.
Получение номера текущего месяца функцией Месяц()
Самый простой способ — комбинация двух встроенных функций. ТекущаяДата() возвращает текущую дату и время сеанса, а Месяц() извлекает из даты порядковый номер месяца в виде целого числа.
НомерМесяца = Месяц(ТекущаяДата());
// Например, если сейчас март, результат: 3
Результат всегда числовой, без ведущего нуля: не «03», а «3». Если номер нужен для вывода пользователю в привычном двузначном виде, применяйте функцию Формат() с форматной строкой или дополняйте строку вручную.
НомерМесяцаСтрокой = Формат(Месяц(ТекущаяДата()), "ЧЦ=2; ЧВН=");
// Результат: "03"
Учтите, что Месяц() принимает на вход значение типа Дата. Если передать строку или число, будет ошибка выполнения. Перед вызовом убедитесь, что переменная действительно содержит дату — особенно при работе с данными, полученными извне (из файлов, веб-сервисов, COM-объектов).
Получение даты начала и конца текущего месяца
Для отборов, запросов и установки периодов документов чаще нужен не номер, а границы месяца. Встроенный язык предоставляет две функции: НачалоМесяца() и КонецМесяца().
НачалоТекущегоМесяца = НачалоМесяца(ТекущаяДата());
// Например: 01.03.2026 0:00:00
КонецТекущегоМесяца = КонецМесяца(ТекущаяДата());
// Например: 31.03.2026 23:59:59
Обе функции возвращают значение типа Дата. НачалоМесяца() сбрасывает время на 0:00:00, а КонецМесяца() устанавливает последнюю секунду последнего дня — 23:59:59. Это важно при сравнении дат документов: если у документа время 23:59:59.5 или вы используете границу с включением/исключением точки, сравнение может дать неожиданный результат.
Типовой сценарий — установка периода отчёта или отбора динамического списка на текущий месяц. В этом случае пару функций удобно оформить через стандартный период:
СтандартныйПериод = Новый СтандартныйПериод;
СтандартныйПериод.ДатаНачала = НачалоМесяца(ТекущаяДата());
СтандартныйПериод.ДатаОкончания = КонецМесяца(ТекущаяДата());
Название месяца и представление для пользователя
Когда месяц нужно показать пользователю в заголовке отчёта, печатной форме или надписи на форме, используют функцию Формат() с форматной строкой даты. Она возвращает локализованное название месяца с учётом языка сеанса.
НазваниеМесяца = Формат(ТекущаяДата(), "ДФ=MMMM");
// Результат: "март" (или "March" при английском языке сеанса)
МесяцИГод = Формат(ТекущаяДата(), "ДФ='MMMM yyyy'");
// Результат: "март 2026"
МесяцПрописью = Формат(ТекущаяДата(), "ДЛФ=DD");
// Полное представление даты, например: "15 марта 2026 г."
Обратите внимание на регистр и падеж: MMMM возвращает название в именительном падеже («март»), а формат ДЛФ=DD — в родительном («марта»). Для заголовка отчёта «Продажи за март» подойдёт первый вариант, для фразы «по состоянию на 15 марта» — второй.
Если название месяца используется в склоняемой фразе и штатных форматов не хватает, в типовых конфигурациях часто применяют массив названий месяцев или функции общих модулей работы со строками. Самодельный массив из 12 названий — рабочее решение, но оно не будет автоматически переключаться на другой язык интерфейса.
При формировании названий файлов выгрузки не вставляйте в имя результат Формат() с длинной датой — в нём могут быть пробелы и недопустимые для файловой системы символы. Для имён файлов лучше подходит формат ДФ=yyyy-MM или ДФ=MM-yyyy.
Текущий месяц в запросах 1С
В языке запросов встроенные функции встроенного языка напрямую недоступны — там действуют свои конструкции. Номер месяца из поля даты извлекается функцией МЕСЯЦ(), а границы периода — функциями НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА().
ВЫБРАТЬ
МЕСЯЦ(&ТекущаяДата) КАК НомерМесяца,
НАЧАЛОПЕРИОДА(&ТекущаяДата, МЕСЯЦ) КАК НачалоМесяца,
КОНЕЦПЕРИОДА(&ТекущаяДата, МЕСЯЦ) КАК КонецМесяца
Текущую дату в запрос обычно передают параметром, а не вычисляют внутри него. Это даёт два преимущества: запрос можно тестировать на произвольной дате, и значение фиксируется на момент выполнения — не будет расхождений, если запрос выполняется долго и дата сменилась в процессе.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ...";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
В запросах к виртуальным таблицам регистров (Остатки, Обороты) границы текущего месяца передают в параметры виртуальной таблицы. Это эффективнее, чем фильтровать результат запроса через условие ГДЕ, потому что отбор накладывается на этапе выборки данных из таблицы итогов.
Месяц(ТекущаяДата()) // номер месяца, число 1–12Текущий месяц в СКД и настройках отчётов
В системе компоновки данных для полей дат доступны выражения языка выражений СКД, но чаще текущий месяц задаётся через параметры. Типовой подход — создать параметры «НачалоПериода» и «КонецПериода» и заполнить их выражениями на встроенном языке в модуле объекта отчёта или при компоновке настроек.
Если отчёт должен по умолчанию открываться за текущий месяц, в типовых конфигурациях на БСП используются стандартные периоды и обработчики заполнения параметров. В собственных отчётах проще всего установить значения параметров в событии ПриКомпоновкеРезультата или при создании формы отчёта.
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));
Альтернатива — использовать вариант стандартного периода «Этот месяц», который платформа предлагает пользователю в диалоге выбора периода. Он подходит, когда пользователь должен иметь возможность менять период вручную, а текущий месяц нужен только как значение по умолчанию.
ТекущаяДата() против ТекущаяДатаСеанса(): что выбрать
Функция ТекущаяДата() возвращает дату и время того компьютера, где выполняется код: на клиенте — дату клиентской машины, на сервере — дату сервера. ТекущаяДатаСеанса() всегда возвращает дату сеанса на сервере, скорректированную с учётом часового пояса сеанса, и доступна только в серверном контексте.
Для учётных данных — проведения документов, расчёта периодов, отборов в отчётах — правильным выбором считается ТекущаяДатаСеанса(). Иначе пользователь с неверно установленными часами на компьютере может создать документ не в том месяце, а отчёты у разных пользователей будут строиться по разным периодам.
| Критерий | ТекущаяДата() | ТекущаяДатаСеанса() |
|---|---|---|
| Источник значения | Компьютер, где выполняется код | Сервер, с учётом часового пояса сеанса |
| Доступность | Клиент и сервер | Только сервер |
| Риск расхождения | Высокий при разных настройках ПК | Минимальный |
| Рекомендуемое применение | Интерфейсные подсказки, метки на клиенте | Учётные данные, проведение, отборы |
Типичные ошибки и их последствия
Первая распространённая ошибка — использование Месяц() там, где нужна дата начала периода. Номер месяца «3» нельзя подставить в параметр отбора по периоду: отбор просто не сработает или выдаст ошибку несоответствия типов.
Вторая ошибка — сравнение даты документа с КонецМесяца() без учёта времени. Если документ создан в последний день месяца в 23:59:59, сравнение «меньше или равно» сработает, но при использовании границ или точности до миллисекунд возможны нюансы. Надёжнее сравнивать с началом следующего месяца по условию «меньше».
Третья группа ошибок связана с локализацией: разработчики жёстко прописывают русские названия месяцев в коде, а потом базу открывают пользователи с английским интерфейсом. Если название нужно только для отображения, всегда используйте Формат() — он подстроится под язык сеанса.
Проверка результата
Быстрее всего проверить выражение через встроенный язык в консоли кода (обработка «Консоль кода» или аналогичный инструмент разработчика) либо через команду «Вычислить выражение» (Shift+F9) в конфигураторе при отладке.
Как проверить результат
Целое число от 1 до 12, совпадает с текущим календарным месяцем
Число не совпадает с реальным месяцем — проверьте дату на сервере или клиенте
Первое число текущего месяца, время 0:00:00
Другое число или ненулевое время — проверьте, что передана дата, а не строка
Название месяца на языке сеанса
Пустая строка или цифры — проверьте форматную строку и регистр букв
Если значение вычисляется внутри запроса или СКД, проверяйте его отдельно от основного запроса: выполните тестовый запрос, выводящий только вычисляемые границы периода, и сверьте с календарём. Это отделит ошибки вычисления даты от ошибок основной логики выборки.
Что важно запомнить
Номер месяца — Месяц(ТекущаяДата()), границы периода — НачалоМесяца() и КонецМесяца(), название — Формат() с ДФ=MMMM. В запросах — МЕСЯЦ() и НАЧАЛОПЕРИОДА(). Для учётных данных используйте ТекущаяДатаСеанса() на сервере, чтобы избежать расхождений из-за часов рабочих станций.
Частые вопросы
Как получить номер предыдущего месяца?
Используйте функцию ДобавитьМесяц() с отрицательным смещением: Месяц(ДобавитьМесяц(ТекущаяДата(), -1)). Функция корректно обрабатывает переход через год: для января вернёт 12.
Почему ТекущаяДата() недоступна в некоторых контекстах?
В управляемых формах в серверных процедурах без контекста и в некоторых режимах исполнения функция может быть ограничена. В этих случаях применяйте ТекущаяДатаСеанса() — она доступна везде на сервере и возвращает более предсказуемое значение.
Как получить текущий месяц в виде «03.2026» для печатной формы?
Примените форматную строку: Формат(ТекущаяДата(), "ДФ='MM.yyyy'"). Одинарные кавычки внутри строки нужны, чтобы точка воспринималась как литерал, а не как элемент шаблона.
Можно ли получить текущий месяц в запросе без передачи параметра?
Напрямую функции текущей даты в языке запросов нет. Стандартная практика — передать ТекущаяДатаСеанса() параметром. Это также делает запрос воспроизводимым и удобным для тестирования.
Что вернёт НачалоМесяца() для пустой даты?
Для пустой даты (01.01.0001) функция вернёт начало месяца этой же пустой даты. Если переменная может быть не заполнена, проверяйте её через ЗначениеЗаполнено() до вычисления границ периода.
Как получить название месяца в родительном падеже для фразы «отчёт за март»?
Штатного формата с падежами нет. Вариант ДЛФ=DD даёт родительный падеж вместе с числом и годом. Если нужно только название месяца, используют массив названий в нужном падеже и индексируют его значением Месяц(ТекущаяДата()) - 1.