Разработка и Конфигурация · 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С есть собственная функция МЕСЯЦ(), которая применяется к полю типа Дата и возвращает число. Она используется в секциях выбора, условиях и группировках.
ВЫБРАТЬ
МЕСЯЦ(Продажи.Период) КАК НомерМесяца,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
МЕСЯЦ(Продажи.Период)
Также функция работает в условии ГДЕ, например для отбора документов конкретного месяца:
ГДЕ МЕСЯЦ(Документ.Дата) = &НужныйМесяц
Однако фильтрация через МЕСЯЦ() в условии — не лучшая практика для больших таблиц: индекс по полю даты при таком условии не используется, и запрос сканирует всю таблицу. Эффективнее передать в запрос границы периода (начало и конец месяца) и сравнивать дату напрямую — об этом ниже.
Группировка по месяцам: НАЧАЛОПЕРИОДА и виртуальные таблицы
Для агрегирования данных по месяцам часто удобнее не извлекать номер, а округлить дату до начала месяца функцией НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ). Тогда каждая группа однозначно привязана и к месяцу, и к году, а результат можно отсортировать хронологически.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Реализация.Дата, МЕСЯЦ) КАК Месяц,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Реализация.Дата, МЕСЯЦ)
УПОРЯДОЧИТЬ ПО
Месяц
При работе с регистрами накопления и сведений предпочтительнее использовать виртуальные таблицы оборотов с заданной периодичностью. Параметр Периодичность = Месяц заставляет платформу вернуть данные, уже сгруппированные по месяцам, — поле Период будет содержать начало каждого месяца.
ВЫБРАТЬ
Продажи.Период КАК Месяц,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(, , Месяц, ) КАК Продажи
Сравнение вариантов
Подходит для проверок условий и логики в модулях. Возвращает только число без года.
Нужен для вывода пользователю: название месяца, строка вида 03.2026. Результат — строка, не для вычислений.
Для группировок и вычисляемых полей. В условиях ГДЕ замедляет запрос на больших таблицах.
Оптимально для группировки по месяцам с учётом года и хронологической сортировки.
Месяц в СКД и отчётах
В системе компоновки данных месяц обычно выделяют двумя путями. Первый — вычисляемое поле с выражением Месяц(Дата) или НачалоПериода(Дата, "Месяц"), которое затем используется в группировках отчёта. Второй — поле периода виртуальной таблицы регистра с периодичностью «Месяц», после чего в настройках отчёта для группировки выбирается тип дополнения периода.
Для отображения названия месяца в отчёте вместо даты начала периода применяется оформление поля: в настройках СКД на закладке «Наборы данных» или в пользовательских настройках полю задаётся формат ДФ='MMMM yyyy'. Тогда пользователь видит «Март 2026», а в данных остаётся полноценная дата, корректно сортирующаяся.
Если отчёт строится на консоли запросов, сначала отладьте группировку там: проверьте, что количество строк результата соответствует числу месяцев в анализируемом периоде, а суммы сходятся с итогом без группировки.
- 1Определите контекст: код модуля, запрос или отчёт СКД.
- 2Для кода используйте Месяц(Дата) с предварительной проверкой ЗначениеЗаполнено(Дата).
- 3Для вывода пользователю примените Формат(Дата, "ДФ=MMMM") или нужный шаблон.
- 4В запросе для группировки используйте НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ), для отбора — диапазон дат вместо МЕСЯЦ() в ГДЕ.
- 5Проверьте результат на граничных данных: январь, декабрь, пустая дата, даты разных лет.
Как проверить результат и избежать ошибок
После внедрения кода проверьте поведение на пограничных значениях. Пустая дата, первая и последняя секунды месяца, переход через год — именно там проявляются ошибки. Полезно вывести промежуточные значения через Сообщить() или посмотреть их в отладчике в табло.
Для запросов контролируйте не только данные, но и производительность: если отбор по месяцу реализован через МЕСЯЦ() в условии и таблица содержит сотни тысяч записей, замерьте время выполнения до и после замены на диапазон дат. Разница обычно заметна сразу.
Отдельный случай — даты, полученные из строк при обмене данными. Перед извлечением месяца строку нужно преобразовать в дату (например, через Дата() с параметрами или функции разбора формата), иначе функция выдаст ошибку несоответствия типов.
Как проверить результат
Число от 1 до 12, соответствующее дате
Всегда 1 — вероятно, дата пустая
Ожидаемое слово на языке сеанса
Число вместо слова — неверный шаблон ДФ
Число строк равно числу месяцев периода, суммы сходятся с общим итогом
Март разных лет слит в одну строку — нет учёта года
Запрос выполняется быстро на рабочем объёме данных
Заметная задержка — МЕСЯЦ() в условии ГДЕ блокирует индекс
Частые вопросы
Как получить номер квартала из даты, если есть только месяц?
Используйте целочисленное деление: Квартал = Цел((Месяц(Дата) - 1) / 3) + 1. В запросах есть готовая функция КВАРТАЛ(Поле), а во встроенном языке — Квартал() недоступен, поэтому применяется эта формула либо НачалоКвартала(Дата).
Как вывести месяц прописью в родительном падеже («марта»)?
Штатной функции склонения месяцев нет. Обычно используют Формат(Дата, "ДЛФ=DD") — длинный формат даты вида «15 марта 2026 г.», откуда при необходимости вырезается подстрока, либо собственный массив названий месяцев в нужном падеже.
Почему Месяц() возвращает 1 для пустого реквизита?
Пустая дата в 1С — это значение 01.01.0001, а не отсутствие значения. Функция честно возвращает месяц этой даты. Проверяйте заполненность через ЗначениеЗаполнено() до вызова Месяц().
Как отобрать документы за конкретный месяц в запросе без потери скорости?
Передайте в запрос два параметра — НачалоМесяца(Дата) и КонецМесяца(Дата), вычисленные в коде, и используйте условие Документ.Дата МЕЖДУ &Начало И &Конец. Такое условие использует индекс по дате.
Можно ли выделить месяц из даты в формате «ггггММ» для сортировки?
Да: Формат(Дата, "ДФ=ггггММ") вернёт строку вида «202603», которая корректно сортируется как текст. Это удобно для имён файлов, ключей соответствий и выгрузок во внешние системы.
Работает ли функция МЕСЯЦ() в запросах к табличным частям?
Да, функция применима к любому полю типа Дата, включая реквизиты табличных частей. Ограничение то же: в условиях отбора лучше избегать её на больших выборках, а для группировки предпочтительнее НАЧАЛОПЕРИОДА().
Что важно запомнить
В коде месяц извлекается функцией Месяц(Дата) с обязательной проверкой заполненности даты, название месяца — через Формат() с шаблоном ДФ. В запросах для группировки используйте НАЧАЛОПЕРИОДА(Поле, МЕСЯЦ), а для отбора — диапазон дат вместо МЕСЯЦ() в условии, чтобы не терять индекс и производительность.