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