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

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

Как из даты выделить месяц в 1С

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

Задача выделить месяц из даты возникает в 1С постоянно: при группировке данных в отчётах, формировании печатных форм, проверке условий в коде и построении запросов. В зависимости от контекста — встроенный язык, язык запросов или СКД — используются разные инструменты, и у каждого есть свои особенности.

Основных способа три: функция Месяц() встроенного языка возвращает число от 1 до 12, функция Формат() позволяет получить название месяца или строку заданного вида, а в запросах применяется функция МЕСЯЦ() языка запросов. Ниже разобран каждый вариант с примерами кода и типичными ошибками.

Функция Месяц() во встроенном языке

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

ДатаДокумента = Дата(2026, 3, 15);

НомерМесяца = Месяц(ДатаДокумента); // результат: 3

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

Если дата хранится в реквизите объекта, сначала убедитесь, что реквизит заполнен. Надёжная конструкция выглядит так:

Если ЗначениеЗаполнено(Объект.Дата) Тогда

НомерМесяца = Месяц(Объект.Дата);

Иначе

НомерМесяца = 0; // признак незаполненной даты

КонецЕсли;

Получение названия месяца через Формат()

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

ДатаДокумента = Дата(2026, 3, 15);

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

НазваниеПрописью = Формат(ДатаДокумента, "ДФ='ММММ'"); // зависит от регистра шаблона

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

Регистр букв в шаблоне влияет на результат: MMMM даёт название с заглавной буквы, mmmm — строчными. Шаблон MM возвращает номер месяца с ведущим нулём («03»), а M — без него («3»). Это удобно, когда месяц нужен строкой для склейки с другими данными.

Учитывайте, что Формат() возвращает строку, а не число. Если результат потом участвует в сравнениях или сортировке, строковые номера месяцев без ведущего нуля («1», «10», «2») отсортируются неправильно — используйте шаблон с двумя символами.

Выделение месяца в запросе: функция МЕСЯЦ()

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Также функция работает в условии ГДЕ, например для отбора документов конкретного месяца:

ГДЕ МЕСЯЦ(Документ.Дата) = &НужныйМесяц

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

Типичные ошибки
01
Отбор вида ГДЕ МЕСЯЦ(Дата) = 3 на большой таблице: индекс не используется, запрос выполняется медленно. Правильнее — Дата МЕЖДУ &НачалоМесяца И &КонецМесяца.
02
Сравнение только по номеру месяца без учёта года: март прошлого и март текущего года попадут в одну выборку. Добавляйте условие по ГОД() или используйте НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ).
03
Применение Месяц() к пустой дате: получается 1 вместо сигнала об ошибке, и январь в отчётах необоснованно раздувается.

Группировка по месяцам: НАЧАЛОПЕРИОДА и виртуальные таблицы

Для агрегирования данных по месяцам часто удобнее не извлекать номер, а округлить дату до начала месяца функцией НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ). Тогда каждая группа однозначно привязана и к месяцу, и к году, а результат можно отсортировать хронологически.

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Реализация.Дата, МЕСЯЦ) КАК Месяц,

СУММА(Реализация.СуммаДокумента) КАК Сумма

ИЗ

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

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

НАЧАЛОПЕРИОДА(Реализация.Дата, МЕСЯЦ)

УПОРЯДОЧИТЬ ПО

Месяц

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

ВЫБРАТЬ

Продажи.Период КАК Месяц,

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

ИЗ

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

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

Месяц(Дата) в коде

Подходит для проверок условий и логики в модулях. Возвращает только число без года.

Формат(Дата, ДФ=...)

Нужен для вывода пользователю: название месяца, строка вида 03.2026. Результат — строка, не для вычислений.

МЕСЯЦ() в запросе

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

НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ)

Оптимально для группировки по месяцам с учётом года и хронологической сортировки.

Месяц в СКД и отчётах

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

Для отображения названия месяца в отчёте вместо даты начала периода применяется оформление поля: в настройках СКД на закладке «Наборы данных» или в пользовательских настройках полю задаётся формат ДФ='MMMM yyyy'. Тогда пользователь видит «Март 2026», а в данных остаётся полноценная дата, корректно сортирующаяся.

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

Порядок действий
  1. 1
    Определите контекст: код модуля, запрос или отчёт СКД.
  2. 2
    Для кода используйте Месяц(Дата) с предварительной проверкой ЗначениеЗаполнено(Дата).
  3. 3
    Для вывода пользователю примените Формат(Дата, "ДФ=MMMM") или нужный шаблон.
  4. 4
    В запросе для группировки используйте НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ), для отбора — диапазон дат вместо МЕСЯЦ() в ГДЕ.
  5. 5
    Проверьте результат на граничных данных: январь, декабрь, пустая дата, даты разных лет.

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

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

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

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

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

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

Месяц от заполненной даты
Норма

Число от 1 до 12, соответствующее дате

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

Всегда 1 — вероятно, дата пустая

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

Ожидаемое слово на языке сеанса

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

Число вместо слова — неверный шаблон ДФ

Группировка в запросе
Норма

Число строк равно числу месяцев периода, суммы сходятся с общим итогом

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

Март разных лет слит в одну строку — нет учёта года

Скорость отбора по месяцу
Норма

Запрос выполняется быстро на рабочем объёме данных

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

Заметная задержка — МЕСЯЦ() в условии ГДЕ блокирует индекс

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

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

Используйте целочисленное деление: Квартал = Цел((Месяц(Дата) - 1) / 3) + 1. В запросах есть готовая функция КВАРТАЛ(Поле), а во встроенном языке — Квартал() недоступен, поэтому применяется эта формула либо НачалоКвартала(Дата).

Как вывести месяц прописью в родительном падеже («марта»)?

Штатной функции склонения месяцев нет. Обычно используют Формат(Дата, "ДЛФ=DD") — длинный формат даты вида «15 марта 2026 г.», откуда при необходимости вырезается подстрока, либо собственный массив названий месяцев в нужном падеже.

Почему Месяц() возвращает 1 для пустого реквизита?

Пустая дата в 1С — это значение 01.01.0001, а не отсутствие значения. Функция честно возвращает месяц этой даты. Проверяйте заполненность через ЗначениеЗаполнено() до вызова Месяц().

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

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

Можно ли выделить месяц из даты в формате «ггггММ» для сортировки?

Да: Формат(Дата, "ДФ=ггггММ") вернёт строку вида «202603», которая корректно сортируется как текст. Это удобно для имён файлов, ключей соответствий и выгрузок во внешние системы.

Работает ли функция МЕСЯЦ() в запросах к табличным частям?

Да, функция применима к любому полю типа Дата, включая реквизиты табличных частей. Ограничение то же: в условиях отбора лучше избегать её на больших выборках, а для группировки предпочтительнее НАЧАЛОПЕРИОДА().

Итог

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

В коде месяц извлекается функцией Месяц(Дата) с обязательной проверкой заполненности даты, название месяца — через Формат() с шаблоном ДФ. В запросах для группировки используйте НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ), а для отбора — диапазон дат вместо МЕСЯЦ() в условии, чтобы не терять индекс и производительность.