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

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

Дата как месяц в запросе 1С: как получить и сгруппировать данные по месяцам

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

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

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

Ниже разобраны все рабочие способы с примерами кода, ограничения каждого подхода, типичные ошибки при группировке и способы проверить результат до включения запроса в отчёт.

Функция МЕСЯЦ: получить номер месяца из даты

Функция МЕСЯЦ() — самый прямой способ. Она принимает выражение типа «Дата» и возвращает целое число от 1 до 12. Синтаксис простой: МЕСЯЦ(Продажи.Период). Функция работает с полями таблиц, параметрами запроса и вложенными выражениями.

Типичный пример — выборка документов с номером месяца:

ВЫБРАТЬ

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

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

МЕСЯЦ(РеализацияТоваровУслуг.Дата) КАК НомерМесяца

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.Проведен

Важно понимать: МЕСЯЦ() возвращает только номер, без года. Если в выборке данные за несколько лет, то январь 2023 и январь 2026 дадут одинаковое значение 1. Для различения периодов добавляйте ГОД() или используйте НАЧАЛОПЕРИОДА().

Функцию можно применять и в условии отбора. Например, выбрать все документы за март любого года: ГДЕ МЕСЯЦ(Документ.Дата) = 3. Однако такой отбор не использует индекс по дате и при больших объёмах работает медленнее, чем сравнение дат напрямую.

НАЧАЛОПЕРИОДА: привести дату к месяцу для группировки

Когда нужно сгруппировать данные по месяцам, функция НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) подходит лучше, чем МЕСЯЦ(). Она возвращает дату — первое число месяца в 00:00:00. Например, 15.03.2026 14:22 превратится в 01.03.2026 0:00:00. Поскольку результат остаётся датой, январь разных лет не склеивается, а сортировка идёт в естественном хронологическом порядке.

Пример группировки оборотов по месяцам:

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц,

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

ИЗ

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

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

НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)

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

Месяц

У НАЧАЛОПЕРИОДА есть парная функция КОНЕЦПЕРИОДА(Дата, МЕСЯЦ), возвращающая последнюю секунду месяца (например, 31.03.2026 23:59:59). Она нужна для отборов вида «документы за месяц»: ГДЕ Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ).

Ещё одно преимущество НАЧАЛОПЕРИОДА — результат можно соединять с другими таблицами. Например, с плановыми показателями, хранящимися с датой на начало месяца, или с виртуальной таблицей оборотов, у которой задана периодичность «Месяц».

МЕСЯЦ или НАЧАЛОПЕРИОДА

МЕСЯЦ(Дата)

Нужен номер месяца числом для вывода или отбора. Не различает годы, неудобен для соединений.

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

Группировка, соединения, хронологическая сортировка. Результат — дата, годы не смешиваются.

Периодичность виртуальной таблицы

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

Группировка по месяцам в виртуальных таблицах регистров

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

В конструкторе запроса это делается на закладке выбора таблицы: выделите виртуальную таблицу, откройте её параметры и укажите периодичность. В тексте запроса это выглядит так:

ВЫБРАТЬ

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

ПродажиОбороты.Номенклатура КАК Номенклатура,

ПродажиОбороты.КоличествоОборот КАК Количество

ИЗ

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

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

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

Как сгруппировать обороты по месяцам
  1. 1
    Откройте консоль запросов и добавьте виртуальную таблицу Обороты нужного регистра
  2. 2
    В параметрах таблицы установите Периодичность = Месяц
  3. 3
    Выберите поле Период и нужные ресурсы с агрегатной функцией СУММА
  4. 4
    Выполните запрос и проверьте, что Период содержит первые числа месяцев
  5. 5
    При необходимости включите дополнение периодов для пустых месяцев

Вывод названия месяца: строка вместо числа

Номер месяца и дата-начало удобны для расчётов, но пользователю в отчёте обычно нужно показать «Январь», «Февраль» или «Март 2026». В чистом языке запросов возможности ограничены: функция ПРЕДСТАВЛЕНИЕ() для даты вернёт строку вида «01.03.2026», а не название месяца.

Рабочие варианты:

  • В СКД и динамических списках примените к полю форматную строку ДФ='MMMM yyyy' — поле даты отобразится как «Март 2026». Настраивается в свойствах поля на закладке «Наборы данных» или в пользовательских полях.
  • В запросе получите название через соединение с таблицей значений или со справочником периодов, где номеру месяца сопоставлено имя. Это оправдано, когда форматирование на стороне СКД недоступно.
  • Используйте оператор ВЫБОР с двенадцатью ветками: ВЫБОР КОГДА МЕСЯЦ(Дата) = 1 ТОГДА "Январь" ... КОНЕЦ. Способ громоздкий, но работает везде, включая отчёты на обычных запросах без СКД.

Для построителя отчётов и СКД предпочтителен первый вариант: форматная строка не меняет тип поля, поэтому сортировка остаётся хронологической, а не алфавитной по названиям месяцев. Это частая причина «неправильного» порядка месяцев в отчётах, где месяц выведен строкой.

1c
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц,
	СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
	РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК Продажи
СГРУППИРОВАТЬ ПО
	НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)
УПОРЯДОЧИТЬ ПО
	Месяц

Фильтрация документов за конкретный месяц

Отбор за месяц — обратная задача: есть дата или номер месяца, нужно выбрать записи. Правильный способ — сравнение дат с границами периода, а не функция от поля. Запрос ГДЕ Продажи.Период МЕЖДУ &НачалоМесяца И &КонецМесяца использует индекс и работает быстро, а ГДЕ МЕСЯЦ(Продажи.Период) = 3 заставляет СУБД вычислять функцию для каждой строки.

Границы удобно вычислять прямо в запросе от одной даты-параметра:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаОтбора, МЕСЯЦ)

И КОНЕЦПЕРИОДА(&ДатаОтбора, МЕСЯЦ)

И РеализацияТоваровУслуг.Проведен

Обратите внимание на деталь: КОНЕЦПЕРИОДА возвращает 23:59:59 последнего дня. Если в базе возможны документы, проведённые «вручную» с датой без времени или с особыми значениями времени, убедитесь, что граница их захватывает. Для регистров с периодичностью «по позиции документа» надёжнее передавать границу через объект Граница в коде, но в типовых сценариях с документами достаточно КОНЕЦПЕРИОДА.

Проверка результата и типичные ошибки

Прежде чем переносить запрос в отчёт, проверьте его в консоли запросов на реальных данных. Первый контроль — количество строк результата: при группировке по месяцам за год должно получиться не более 12 строк на каждую аналитику. Если строк больше — вероятно, группировка идёт по полной дате, а не по месяцу, либо в выборку попало лишнее поле-измерение.

Второй контроль — значение поля месяца. Для НАЧАЛОПЕРИОДА это всегда первое число в 00:00:00; для МЕСЯЦ — число 1–12. Если вместо этого видны разные дни месяца, функция не применилась к нужному полю — проверьте, не группируете ли вы по Период виртуальной таблицы с периодичностью «День» или «Запись».

Третий контроль — суммы. Сверьте итог по сгруппированным месяцам с итогом без группировки за тот же период: значения должны совпасть. Расхождение обычно означает, что часть записей отсеклась условием ГДЕ, применённым к неагрегированному полю, либо потерялась часть периода из-за неверных границ.

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

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

Значение поля месяца
Норма

01.03.2026 0:00:00 или число 3

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

Разные дни и время внутри месяца

Количество строк за год
Норма

До 12 строк на аналитику

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

Сотни строк — группировка по дате, а не по месяцу

Итоговая сумма
Норма

Совпадает с суммой без группировки

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

Меньше — часть данных отсечена отбором

Порядок месяцев
Норма

Хронологический

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

Алфавитный (Август раньше Января) — месяц выведен строкой

Типичные ошибки
01
Группировка только по МЕСЯЦ() при данных за несколько лет — январь разных лет склеивается в одну строку
02
Отбор МЕСЯЦ(Дата) = N вместо сравнения дат — теряется индекс, запрос тормозит на больших таблицах
03
Вывод месяца строкой через ВЫБОР — сортировка становится алфавитной, порядок месяцев нарушается
04
Граница периода задана как конец дня 00:00:00 вместо КОНЕЦПЕРИОДА — документы последнего дня выпадают из выборки
05
Ожидание названия месяца от ПРЕДСТАВЛЕНИЕ(Дата) — функция вернёт строку полной даты, а не 'Январь'

FAQ: частые вопросы о работе с месяцем в запросах 1С

Как получить месяц и год одним полем?

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

Почему в отчёте месяцы идут не по порядку?

Почти всегда причина в том, что месяц выведен строкой («Август», «Апрель»), и сортировка выполняется по алфавиту. Оставьте поле типа «Дата» (НАЧАЛОПЕРИОДА), отсортируйте по нему, а название покажите форматной строкой ДФ='MMMM yyyy' в настройках СКД.

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

Передайте в запрос параметр с текущей датой из кода (ТекущаяДатаСеанса()) и используйте НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА от него. В чистом языке запросов функции «текущая дата» нет — значение всегда приходит параметром.

Можно ли получить название месяца прямо в запросе?

Штатной функции нет. Варианты: оператор ВЫБОР с двенадцатью ветками по МЕСЯЦ(Дата), соединение с таблицей соответствия номеров и названий, либо форматирование даты на стороне СКД — последний способ предпочтителен для отчётов.

Чем отличается периодичность «Месяц» виртуальной таблицы от НАЧАЛОПЕРИОДА?

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

Почему запрос с МЕСЯЦ() в условии работает медленно?

Функция над полем в условии ГДЕ не даёт СУБД использовать индекс по дате: значение вычисляется для каждой строки. Замените условие на сравнение поля с границами периода, рассчитанными от параметра, — индекс заработает снова.

Итог

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

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