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

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

Как взять месяц в 1С: в коде, запросе и интерфейсе

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

Фраза «взять месяц в 1С» обычно означает одну из трёх задач: получить номер месяца из даты во встроенном языке, выбрать месяц как период в отчёте или документе либо извлечь месяц в запросе для группировки данных. Все три сценария решаются штатными средствами платформы, без доработок конфигурации.

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

Как получить месяц из даты функцией Месяц() в коде

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

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

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

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

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

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

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

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

Если передать в Месяц() пустую дату (01.01.0001), функция вернёт 1. Это частый источник ошибок: незаполненный реквизит даты даёт «январь», и логика отбора срабатывает неверно. Перед вызовом проверяйте дату на заполненность.

bsl
Если ЗначениеЗаполнено(ДатаДокумента) Тогда
    НомерМесяца = Месяц(ДатаДокумента);
Иначе
    НомерМесяца = 0; // дата не задана
КонецЕсли;

Как взять месяц в запросе 1С

В языке запросов есть аналогичный оператор МЕСЯЦ(), который применяется к полю типа «Дата». Он нужен, когда требуется сгруппировать данные по месяцам, отфильтровать записи конкретного месяца или вывести номер месяца в результат.

ВЫБРАТЬ

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

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

ИЗ

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

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

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

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

Для отбора записей конкретного месяца надёжнее сравнивать дату с границами периода через МЕЖДУ, а не извлекать номер месяца: условие Период МЕЖДУ &НачалоМесяца И &КонецМесяца использует индексы и не зависит от года. Функции НачалоПериода() и КонецПериода() в коде помогут вычислить эти границы.

Как получить начало и конец месяца

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

  • НачалоМесяца(Дата) — возвращает дату первого числа месяца, время 00:00:00;
  • КонецМесяца(Дата) — возвращает последний момент последнего дня месяца, 23:59:59.
Начало = НачалоМесяца(ТекущаяДатаСеанса()); // 01.03.2026 00:00:00

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

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

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

Порядок действий: месячный диапазон для отчёта
  1. 1
    Определите базовую дату — текущую или выбранную пользователем
  2. 2
    Вычислите НачалоМесяца(Дата) и КонецМесяца(Дата)
  3. 3
    Передайте оба значения параметрами в запрос или настройку отчёта
  4. 4
    Проверьте, что в выборку попали документы первого и последнего дня месяца

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

Пользователю без программирования месяц задаётся через стандартные элементы интерфейса. В типовых отчётах (например, «Оборотно-сальдовая ведомость» или «Анализ продаж») есть поля периода. Нажмите кнопку выбора периода — откроется диалог, где можно указать произвольные даты либо выбрать стандартный период.

В списке стандартных периодов есть варианты «Месяц», «Прошлый месяц», «Этот месяц», а также выбор конкретного месяца и года из выпадающих списков. После выбора программа сама подставит первое и последнее число. Признак правильной настройки — в шапке отчёта отображаются границы вида «01.03.2026 — 31.03.2026».

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

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

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

Нужен номер месяца из даты в алгоритмеИспользуйте функцию Месяц(Дата)
Нужна группировка данных по месяцам в отчётеЗадайте периодичность «Месяц» у виртуальной таблицы или группируйте по МЕСЯЦ(Период)
Нужен диапазон дат месяца для отбораВычислите НачалоМесяца() и КонецМесяца() и передайте в параметры
Нужно просто посмотреть данные за месяц в типовом отчётеОткройте выбор периода и укажите стандартный вариант «Месяц»

Частые ошибки при работе с месяцем

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

Вторая ошибка — ручное вычисление конца месяца через НачалоМесяца(Дата) + 30*24*60*60 и подобные конструкции. Месяцы имеют разную длину, и такая арифметика даёт неверные границы. Используйте штатные КонецМесяца() и ДобавитьМесяц().

Третья ошибка — игнорирование времени в дате. Документ, проведённый 31-го числа в 23:59:59, формально попадает в месяц, но при отборе «по 31.03 00:00:00» будет потерян. Всегда берите верхнюю границу через КонецМесяца() или конец дня.

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

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

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

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

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

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

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

Нижняя граница периода
Норма

Первое число месяца, время 00:00:00

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

Другая дата или ненулевое время

Верхняя граница периода
Норма

Последнее число месяца, время 23:59:59

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

Полночь последнего дня — теряются вечерние документы

Данные за февраль
Норма

Конец периода — 28 или 29 февраля в зависимости от года

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

Дата уходит на март или обрывается раньше

FAQ

Чем Месяц() отличается от Формат(Дата, "ДФ=MM")?

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

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

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

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

Штатного оператора для названия месяца в языке запросов нет. Обычно выводят номер месяца и год, а представление формируют уже при выводе — через Формат() в коде или настройку формата поля в СКД.

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

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

Почему отбор по месяцу в динамическом списке не срабатывает?

Чаще всего причина в типе сравнения: поле даты сравнивается с неполной границей периода или с параметром не того типа. Проверьте, что параметр имеет тип «Дата» с составом «Дата и время», и что верхняя граница — конец дня, а не его начало.

Итог

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

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