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