Разработка и Конфигурация · 11 мин
Как выбрать месяц из даты в 1С
Как получить месяц из даты в 1С: функция Месяц(), МЕСЯЦ() в запросе, формат даты, название месяца прописью. Примеры кода, типичные ошибки и FAQ.
Задача получить номер или название месяца из даты встречается в 1С постоянно: при группировке отчётов, формировании печатных форм, проверке периодов документов и выгрузке данных. В зависимости от контекста — встроенный язык, запрос, форматная строка или СКД — используются разные инструменты, и путаница между ними приводит к типичным ошибкам.
Во встроенном языке 1С для этого есть функция Месяц(), в языке запросов — функция МЕСЯЦ(), для вывода в печатных формах применяется функция Формат() с шаблоном даты. Каждый вариант возвращает результат в своём виде: число, строку или значение для группировки.
Ниже разобраны все рабочие способы с примерами кода, различия между платформами 8.2 и 8.3, а также ситуации, когда стандартные функции не подходят и нужны обходные решения.
Функция Месяц() во встроенном языке 1С
Основной способ — встроенная функция Месяц(). Она принимает значение типа Дата и возвращает число от 1 до 12 — порядковый номер месяца. Функция доступна на тонком, толстом и веб-клиенте, а также на сервере, то есть работает везде без ограничений.
Пример использования:
ДатаДокумента = ДокументОбъект.Дата;
НомерМесяца = Месяц(ДатаДокумента); // число от 1 до 12
Если НомерМесяца = 12 Тогда
Сообщить("Документ относится к декабрю");
КонецЕсли;
Если передать в функцию пустую дату ('00010101'), результатом будет 1 — январь, поскольку пустая дата в 1С соответствует 1 января года 1. Это частая причина логических ошибок: перед сравнением месяца проверяйте, заполнена ли дата, через ЗначениеЗаполнено() или сравнение с пустой датой.
Обратите внимание: Месяц() возвращает именно число, а не строку. Если результат нужно сравнить со строкой или вывести с лидирующим нулём («01», «02»), потребуется преобразование через Формат():
СтрокаМесяца = Формат(Месяц(ТекущаяДатаСеанса()); "ЧЦ=2; ЧВН="); // "05"
Получение месяца в запросе: функция МЕСЯЦ()
Когда данные выбираются запросом, извлекать месяц нужно на уровне запроса, а не в цикле обхода — это быстрее и позволяет группировать и фильтровать сразу. В языке запросов 1С есть функция МЕСЯЦ(), которая работает аналогично: принимает поле типа Дата и возвращает число.
ВЫБРАТЬ
МЕСЯЦ(Продажи.Период) КАК НомерМесяца,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
МЕСЯЦ(Продажи.Период)
Функцию МЕСЯЦ() можно использовать не только в списке выборки, но и в условии ГДЕ и в секции ИМЕЮЩИЕ. Например, отбор документов только за март:
ВЫБРАТЬ
Реализация.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
МЕСЯЦ(Реализация.Дата) = 3
Для группировки по месяцам с учётом года одной функции МЕСЯЦ() недостаточно — данные января разных лет склеятся. Используйте пару функций ГОД() и МЕСЯЦ() в группировке либо функцию периодичности НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), которая приводит дату к началу месяца и сохраняет год.
Название месяца: функция Формат() и её шаблоны
Числовой номер подходит для расчётов, но в печатных формах и отчётах обычно нужно название: «март», «Март» или «марта» в родительном падеже. Для этого служит функция Формат() с форматной строкой даты.
Формат(Дата; "ДФ=MMMM"); // "Март"
Формат(Дата; "ДФ=MMM"); // "мар"
Формат(Дата; "ДФ='дд MMMM гггг'"); // "15 марта 2026" (зависит от региональных настроек)
Регистр букв в шаблоне влияет на результат: MMMM выводит полное название месяца, MMM — сокращённое, MM — номер с ведущим нулём, M — номер без нуля. Падеж и регистр названия зависят от региональных настроек информационной базы или сеанса, поэтому на разных серверах результат может отличаться.
Если требуется гарантированный результат независимо от настроек сервера, например для выгрузки в XML или обмена с внешней системой, используйте явный массив названий:
Месяцы = СтрРазделить("Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь", ",");
НазваниеМесяца = Месяцы[Месяц(Дата) - 1];
Начало и конец месяца: НачалоМесяца() и КонецМесяца()
Часто «выбрать месяц из даты» означает на практике получить границы месяца, которому принадлежит дата, — для отборов, расчётов остатков и периодов в отчётах. Для этого есть две встроенные функции:
Начало = НачалоМесяца(Дата); // 01.03.2026 0:00:00
Конец = КонецМесяца(Дата); // 31.03.2026 23:59:59
КонецМесяца() возвращает время 23:59:59 последнего дня. Это важно при сравнениях: условие Дата <= КонецМесяца(Период) корректно включает весь последний день, тогда как ручное указание «31.03.2026» без времени означает полночь и «отрезает» весь день.
В запросах аналогичные действия выполняют функции НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) и КОНЕЦПЕРИОДА(Дата, МЕСЯЦ). Они удобны для группировки по месяцам с сохранением года:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)
УПОРЯДОЧИТЬ ПО
Месяц
Месяц в СКД и отчётах
В системе компоновки данных месяц обычно получают двумя путями: на уровне запроса набора данных или вычисляемым полем. Первый способ предпочтительнее — группировка выполняется СУБД, что заметно быстрее на больших объёмах.
Если запрос уже сформирован и менять его нельзя, добавьте вычисляемое поле с выражением Месяц(Период) — в выражениях СКД доступны функции встроенного языка. Для названия месяца в вычисляемом поле используется Формат(Период, "ДФ=MMMM").
В настройках отчёта поле «Месяц» добавляется в группировку строк. Чтобы месяцы шли в хронологическом порядке, а не по алфавиту (что случается со строковыми названиями: «Август» раньше «Апреля»), сортируйте по числовому полю месяца или по НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), а название выводите вторым полем.
Различия платформ и режимов работы
Функции Месяц(), НачалоМесяца(), КонецМесяца() и запросные МЕСЯЦ(), НАЧАЛОПЕРИОДА() работают одинаково в платформах 8.2 и 8.3, на клиенте и на сервере. Различий в синтаксисе между управляемыми и обычными формами нет.
Отличия проявляются в побочных моментах. Функция ТекущаяДата() на клиенте в управляемом приложении возвращает дату компьютера пользователя, а ТекущаяДатаСеанса() — дату сеанса с учётом часового пояса сервера. При выделении месяца из «текущей даты» в серверных процедурах используйте ТекущаяДатаСеанса(), иначе документы около полуночи могут попасть не в тот месяц.
В мобильной платформе и внешних компонентах набор функций может отличаться — перед использованием проверяйте синтакс-помощник под конкретную целевую платформу. Для запросов к внешним источникам данных функции дат транслируются в диалект конкретной СУБД, и там поведение МЕСЯЦ() может зависеть от настроек подключения.
Как выбрать способ
Проверка результата и отладка
После внедрения кода проверьте результат на граничных значениях: 1 января, 31 декабря, 29 февраля високосного года и пустой дате. Именно на границах проявляются ошибки смещения периодов и неверные сравнения.
Для быстрой проверки в отладчике вычислите выражение Месяц(Дата) и убедитесь, что тип результата — Число. В запросе временно выведите поле МЕСЯЦ(Период) без группировки и просмотрите несколько строк: значения должны соответствовать датам в исходной таблице.
Если название месяца выводится не в том падеже или не на том языке, проверьте региональные настройки информационной базы (Администрирование — Региональные настройки) и параметр локализации сеанса. Для критичных выгрузок замените Формат() на явный массив названий — это исключает зависимость от окружения.
Как проверить результат
Число от 1 до 12
Строка или дата — значит, применена другая функция
Январь каждого года — отдельная строка
Все январи слиты в одну строку — не хватает ГОД() или НАЧАЛОПЕРИОДА
Январь, февраль, март по порядку
Август идёт первым — сортировка по строковому названию
Отфильтрованы или обработаны отдельно
Попали в январь — Месяц('00010101') возвращает 1
Частые вопросы
Как получить название месяца в родительном падеже, например «марта»?
Стандартный шаблон Формат(Дата; "ДФ=MMMM") обычно возвращает именительный падеж. Для гарантированного родительного используйте собственный массив: СтрРазделить("января,февраля,марта,...", ",") и выбор элемента по индексу Месяц(Дата)-1. В конфигурациях на БСП есть готовые функции работы с представлениями периодов.
Чем отличается МЕСЯЦ() в запросе от Месяц() в коде?
Результат одинаков — число от 1 до 12. Разница в месте выполнения: запросная функция вычисляется на стороне СУБД при выборке, что позволяет группировать и фильтровать без обхода результата в цикле. Обрабатывать месяц в цикле после запроса — лишняя работа и потеря производительности.
Почему условие ГДЕ МЕСЯЦ(Дата) = 5 работает медленно?
Применение функции к полю в условии отбора отключает использование индекса по этому полю — СУБД вынуждена вычислить месяц для каждой строки таблицы. Если нужен конкретный месяц конкретного года, замените условие на Дата МЕЖДУ &Начало И &Конец, передав границы параметрами.
Как получить месяц с ведущим нулём, например «03»?
Функция Месяц() возвращает число, поэтому преобразуйте его: Формат(Месяц(Дата); "ЧЦ=2; ЧВН="). Альтернатива — сразу форматировать дату: Формат(Дата; "ДФ=MM") вернёт двузначный номер месяца строкой.
Месяц из даты в запросе возвращает 1 для пустых дат — как убрать?
Пустая дата в 1С — это 01.01.0001, поэтому МЕСЯЦ() честно возвращает 1. Добавьте в запрос условие ГДЕ Таблица.Дата <> ДАТАВРЕМЯ(1,1,1) либо обработайте через ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА NULL ИНАЧЕ МЕСЯЦ(Дата) КОНЕЦ.
Как сгруппировать данные по месяцам за несколько лет?
Одной функции МЕСЯЦ() недостаточно — она объединит одноимённые месяцы разных лет. Группируйте по НАЧАЛОПЕРИОДА(Период, МЕСЯЦ): каждый месяц каждого года станет отдельной строкой с датой начала месяца, которую удобно сортировать и форматировать для вывода.
Что важно запомнить
Номер месяца в коде — Месяц(Дата), в запросе — МЕСЯЦ(Поле). Название месяца — через Формат() с шаблоном ДФ=MMMM или явный массив. Для группировок за несколько лет используйте НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), для отборов по конкретному месяцу — сравнение дат вместо функции в условии ГДЕ. Всегда проверяйте поведение на пустых датах и границах года.