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