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