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

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

Как получить квартал из даты в 1С

Как получить квартал из даты в 1С: функция Квартал(), НачалоКвартала и КонецКвартала, оператор КВАРТАЛ в запросах, примеры кода и типичные ошибки.

Определение квартала по дате — одна из самых частых задач при разработке отчётов, обработок и печатных форм в 1С. Платформа предоставляет готовые средства для этого: функцию встроенного языка Квартал(), функции работы с границами периода НачалоКвартала() и КонецКвартала(), а также оператор КВАРТАЛ в языке запросов. Ручные вычисления через месяц не нужны — встроенные механизмы работают корректно с любыми датами, включая границы года.

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

Получение квартала функцией Квартал() в коде

Функция Квартал() принимает один параметр — значение типа Дата — и возвращает число от 1 до 4, соответствующее номеру квартала календарного года. Это самый прямой способ, который работает в любом модуле: общем, модуле объекта, формы или внешней обработки.

ДатаДокумента = ДокументОбъект.Дата;

НомерКвартала = Квартал(ДатаДокумента); // число от 1 до 4

Сообщить("Документ относится к " + НомерКвартала + " кварталу");

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

Типичная задача — сформировать строку вида «2 квартал» для печатной формы или заголовка отчёта:

СтрокаПериода = Строка(Квартал(ТекущаяДата())) + " квартал " + Формат(ТекущаяДата(), "ДФ=yyyy") + " г.";

// Результат: "2 квартал 2026 г."

Начало и конец квартала: НачалоКвартала() и КонецКвартала()

Часто нужен не номер квартала, а его границы — например, для отбора документов за квартал, в который попадает произвольная дата. Функции НачалоКвартала() и КонецКвартала() решают эту задачу без ручных вычислений.

ДатаВнутриПериода = '20260517';

ДатаНачала = НачалоКвартала(ДатаВнутриПериода); // 01.04.2026 0:00:00

ДатаОкончания = КонецКвартала(ДатаВнутриПериода); // 30.06.2026 23:59:59

Важная особенность: КонецКвартала() возвращает последнюю секунду последнего дня квартала (23:59:59). Это удобно для сравнений «меньше или равно», но при передаче в запросы с виртуальными таблицами регистров иногда предпочтительнее использовать параметр «Период» с началом следующего квартала и строгое неравенство — поведение зависит от конкретной таблицы.

Получение квартала в запросе: оператор КВАРТАЛ

В языке запросов 1С есть встроенная функция КВАРТАЛ(), которая применяется к полю типа Дата и возвращает номер квартала. Это позволяет группировать и фильтровать данные прямо в запросе, не выгружая их в код.

ВЫБРАТЬ

КВАРТАЛ(РеализацияТоваров.Дата) КАК Квартал,

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

ИЗ

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

ГДЕ

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

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

КВАРТАЛ(РеализацияТоваров.Дата)

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

Квартал

Для отбора документов конкретного квартала лучше передавать границы периода параметрами, а не фильтровать по функции — так запрос сможет использовать индексы по дате и отработает быстрее на больших таблицах:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ Реализация.Ссылка

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

|ГДЕ Реализация.Дата МЕЖДУ &НачалоКвартала И &КонецКвартала";

Запрос.УстановитьПараметр("НачалоКвартала", НачалоКвартала(ДатаОтбора));

Запрос.УстановитьПараметр("КонецКвартала", КонецКвартала(ДатаОтбора));

Квартал в СКД и отчётах

В системе компоновки данных квартал можно получить двумя путями. Первый — вычисляемое поле на уровне запроса набора данных с оператором КВАРТАЛ(), как показано выше. Второй — выражение языка компоновки, если дата уже выбрана в наборе и нужно только отобразить номер квартала.

Для группировки данных по кварталам в отчёте достаточно добавить в набор данных поле КВАРТАЛ(Дата) КАК Квартал и создать по нему группировку в настройках отчёта. Пользователь сможет сворачивать и разворачивать кварталы без доработки кода.

Если отчёт должен показывать данные «за квартал указанной даты», параметры периода удобно вычислять автоматически в событии ПриКомпоновкеРезультата или через выражение параметра в самой СКД, используя &НачалоКвартала и &КонецКвартала, рассчитанные функциями встроенного языка.

Порядок действий для отчёта по кварталам
  1. 1
    Добавьте в запрос набора данных поле КВАРТАЛ(Дата) КАК Квартал
  2. 2
    На закладке настроек СКД создайте группировку по полю Квартал
  3. 3
    Добавьте параметры НачалоПериода и КонецПериода, вычисляемые через НачалоКвартала() и КонецКвартала()
  4. 4
    Проверьте отчёт на датах из разных кварталов и на границах года

Обратная задача: дата по номеру квартала и году

Иногда исходные данные — не дата, а номер квартала и год, и нужно получить границы периода. Прямой функции для этого нет, но задача решается простой арифметикой месяцев:

Функция ГраницыКвартала(НомерКвартала, Год)

ПервыйМесяц = (НомерКвартала - 1) * 3 + 1;

Начало = Дата(Год, ПервыйМесяц, 1);

Окончание = КонецКвартала(Начало);

Возврат Новый Структура("Начало, Окончание", Начало, Окончание);

КонецФункции

Здесь стоит добавить проверку входных данных: номер квартала должен быть в диапазоне от 1 до 4, иначе функция Дата() выдаст ошибку или неожиданный результат. Для защиты от некорректного ввода пользователя используйте проверку условием или вызов исключения с понятным текстом.

Типичные ошибки и ограничения

Самая распространённая ошибка — ручное вычисление квартала через месяц с неправильным округлением. Формулы вида Цел((Месяц(Дата) - 1) / 3) + 1 работают, но менее читаемы и чаще приводят к ошибкам при доработках, чем встроенная функция.

Вторая частая проблема — сравнение дат с потерей времени. Если дата документа содержит время 23:59:59 последнего дня квартала, а граница отбора задана как просто дата без времени, документ может выпасть из выборки. Используйте КонецКвартала(), которая корректно выставляет время.

Третья ошибка — путаница между календарным и финансовым (бюджетным) годом. Функция Квартал() всегда считает по календарному году с января. Если в организации отчётный год начинается не с января, потребуется собственная функция со смещением месяцев.

Типичные ошибки
01
Ручной расчёт квартала через Месяц() вместо функции Квартал() — код сложнее читать и проще сломать
02
Фильтрация в запросе через КВАРТАЛ(Дата) = &Номер вместо отбора по границам периода — потеря индекса и медленный запрос
03
Игнорирование времени в дате на границе квартала — документы последнего дня выпадают из выборки
04
Смешение календарного и финансового квартала без явной проверки требований учёта

Проверка результата

После внедрения кода проверьте его на контрольных датах: первый и последний день каждого квартала, а также 1 января и 31 декабря. Для 15.02 ожидается квартал 1, для 01.04 — квартал 2, для 30.09 — квартал 3, для 31.12 — квартал 4.

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

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

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

Дата 01.01 и 31.03
Норма

Квартал(Дата) возвращает 1

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

Возвращается 0, 4 или ошибка типа

Дата 31.12 с временем 23:59:59
Норма

Попадает в отбор МЕЖДУ НачалоКвартала И КонецКвартала

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

Документ выпадает из выборки

Сумма по 4 кварталам года
Норма

Равна итогу за год

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

Есть расхождение — проверяйте границы и отборы

Итог

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

В коде используйте Квартал(Дата), в запросах — оператор КВАРТАЛ, для границ периода — НачалоКвартала() и КонецКвартала(). Фильтруйте большие таблицы по границам периода, а не по функции от даты, и проверяйте результат на граничных датах.

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

Что возвращает функция Квартал() в 1С?

Функция принимает значение типа Дата и возвращает число от 1 до 4 — номер календарного квартала. Время в дате игнорируется, пустая дата (01.01.0001) даст квартал 1.

Как получить квартал из даты в запросе 1С?

Используйте оператор языка запросов КВАРТАЛ(ПолеДаты). Он работает в секциях ВЫБРАТЬ, ГДЕ и СГРУППИРОВАТЬ ПО, но для отбора по периоду эффективнее передавать границы квартала параметрами.

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

Примените функции НачалоКвартала(Дата) и КонецКвартала(Дата). Первая вернёт 00:00:00 первого дня квартала, вторая — 23:59:59 последнего дня.

Как по номеру квартала и году получить дату начала?

Вычислите первый месяц квартала по формуле (НомерКвартала - 1) * 3 + 1 и сконструируйте дату: Дата(Год, ПервыйМесяц, 1). Конец квартала затем получите через КонецКвартала().

Учитывает ли функция Квартал() финансовый год организации?

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

Почему запрос с условием КВАРТАЛ(Дата) = &Номер работает медленно?

Применение функции к полю в условии отбора мешает оптимизатору использовать индекс по дате, и таблица сканируется целиком. Замените условие на отбор Дата МЕЖДУ &НачалоКвартала И &КонецКвартала.