Как в 1С получить номер квартала по дате
Содержание
Самый короткий способ — во встроенном языке: Квартал = Цел((Месяц(Дата) - 1) / 3) + 1. Готовой функции Квартал() в языке 1С нет, номер считают из месяца. В запросе всё проще: там есть функция КВАРТАЛ(Дата), которая сразу возвращает число от 1 до 4.
Выбор способа зависит от того, где вам нужен квартал. В модуле обработки или отчёта считайте формулой или берите готовые НачалоКвартала() и КонецКвартала(). В запросе — функцией КВАРТАЛ. В отчёте на СКД квартал даёт группировка по периоду, без единой строчки кода.
Коротко, где какой способ применять:
| Способ | Где работает | Что возвращает | Когда брать |
|---|---|---|---|
Цел((Месяц(Дата)−1)/3)+1 | встроенный язык | число 1–4 | номер квартала в коде |
НачалоКвартала/КонецКвартала | встроенный язык | даты границ | отбор и период отчёта |
КВАРТАЛ(Дата) | язык запросов | число 1–4 | группировка, отбор в запросе |
| группировка по периоду | СКД, динсписок | подпись квартала | отчёт без кода |
Формула для встроенного языка: считаем квартал из месяца
Во встроенном языке 1С берём номер месяца и делим на три. Квартал — это Цел((Месяц(Дата) - 1) / 3) + 1. Функция Месяц() возвращает число 1–12, Цел() отбрасывает дробную часть.
Функция КварталПоДате(Дата)
Возврат Цел((Месяц(Дата) - 1) / 3) + 1;
КонецФункции
Проверим на крайних месяцах:
| Дата | Месяц | (Месяц − 1) / 3 | Цел(...) + 1 | Квартал |
|---|---|---|---|---|
| 15.01.2024 | 1 | 0 | 1 | I |
| 31.03.2024 | 3 | 0,67 | 1 | I |
| 01.04.2024 | 4 | 1 | 2 | II |
| 30.09.2024 | 9 | 2,67 | 3 | III |
| 31.12.2024 | 12 | 3,67 | 4 | IV |
Формула работает и для даты со временем: Месяц() время игнорирует. Если нужна не только цифра, а подпись вида «I квартал 2024 г.», соберите её из номера и года:
Квартал = КварталПоДате(Дата);
Подпись = Формат(Квартал, "ЧГ=0") + " квартал " + Формат(Год(Дата), "ЧГ=0") + " г.";
Число со строкой в 1С напрямую не склеивают: Формат(Квартал, "ЧГ=0") убирает разделитель групп, иначе год может превратиться в «2 024».
Эту формулу удобнее один раз завернуть в функцию общего модуля и вызывать по всему коду. Разворачивать квартал через Если … ИначеЕсли по месяцам тоже можно, но это пять веток вместо одной строки — читается и сопровождается хуже.
Границы квартала: НачалоКвартала и КонецКвартала
Когда нужен не номер, а сами даты начала и конца квартала (для отбора, для периода отчёта), в языке 1С есть готовые функции — ничего считать не надо.
Начало = НачалоКвартала(Дата); // 01.04.2024 00:00:00
Конец = КонецКвартала(Дата); // 30.06.2024 23:59:59
НачалоКвартала() возвращает первое мгновение первого дня квартала, КонецКвартала() — последнюю секунду последнего дня. Это ровно те границы, которые нужны для отбора документов за квартал.
Готовую подпись периода даёт функция ПредставлениеПериода():
Текст = ПредставлениеПериода(НачалоКвартала(Дата), КонецКвартала(Дата));
// "1 квартал 2024 г."
Она сама подбирает формулировку: если переданные даты точно совпадают с границами квартала, вернёт «1 квартал 2024 г.», для произвольного интервала — другую формулировку. Удобно для шапок печатных форм и отчётов.
КонецКвартала() отдаёт время 23:59:59. При сравнении «меньше либо равно» документ последнего дня попадёт в отбор, при строгом «меньше» — нет. Проверьте условие, если документы датируются концом дня.
Функции НачалоКвартала и КонецКвартала — часть одного семейства вместе с НачалоГода, НачалоМесяца, НачалоДня и их парными «концами». Логика у всех одинаковая, поэтому, разобравшись с кварталом, вы одинаково считаете границы любого периода. Результат — значение типа «Дата», его сразу можно подставлять в отбор или в параметр запроса.
Квартал в запросе: функция КВАРТАЛ
В языке запросов определять квартал проще всего — есть встроенная функция КВАРТАЛ(<Дата>), которая возвращает номер от 1 до 4.
ВЫБРАТЬ
Продажи.Ссылка КАК Документ,
Продажи.Дата КАК Дата,
КВАРТАЛ(Продажи.Дата) КАК Квартал
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
Если данные за несколько лет, один номер квартала склеит, например, I квартал 2023-го и I квартал 2024-го. Чтобы разделить, добавьте год:
ВЫБРАТЬ
ГОД(Продажи.Дата) КАК Год,
КВАРТАЛ(Продажи.Дата) КАК Квартал,
СУММА(Продажи.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
СГРУППИРОВАТЬ ПО
ГОД(Продажи.Дата),
КВАРТАЛ(Продажи.Дата)
Для отбора «за квартал» в запросе удобнее опираться не на номер, а на границы периода — их даёт НАЧАЛОПЕРИОДА:
ГДЕ
Продажи.Дата МЕЖДУ
НАЧАЛОПЕРИОДА(&ДатаВПериоде, КВАРТАЛ)
И КОНЕЦПЕРИОДА(&ДатаВПериоде, КВАРТАЛ)
НАЧАЛОПЕРИОДА(Дата, КВАРТАЛ) и КОНЕЦПЕРИОДА(Дата, КВАРТАЛ) работают так же, как НачалоКвартала/КонецКвартала во встроенном языке. Сдвинуть дату на целый квартал вперёд или назад помогает ДОБАВИТЬКДАТЕ(Дата, КВАРТАЛ, 1).
Когда в отчёте нужна читаемая подпись, а не цифра, номер квартала разворачивают в текст через ВЫБОР:
ВЫБОР
КОГДА КВАРТАЛ(Продажи.Дата) = 1 ТОГДА "I квартал"
КОГДА КВАРТАЛ(Продажи.Дата) = 2 ТОГДА "II квартал"
КОГДА КВАРТАЛ(Продажи.Дата) = 3 ТОГДА "III квартал"
ИНАЧЕ "IV квартал"
КОНЕЦ КАК КварталТекст
Такое поле удобно выводить в шапку отчёта или как группировку, когда цифра 1–4 выглядит неинформативно.
Квартал в отчётах на СКД: без кода
Для отчёта писать формулу не нужно. Система компоновки данных умеет группировать даты по кварталам сама.
- Откройте схему компоновки, перейдите на закладку настроек структуры отчёта.
- Добавьте в группировку строк поле с датой (например,
Дата). - В типе группировки даты выберите период
Квартал.
В результате строки свернутся по кварталам, а подписи СКД сформирует автоматически — «1 квартал 2024 г.» и далее.
Если данные за несколько лет, сделайте две вложенные группировки: сначала по дате с периодом Год, внутри — по дате с периодом Квартал. Тогда кварталы разных лет не смешаются и в отчёте будет понятная иерархия «год → квартал».
Если нужно именно число квартала как отдельную колонку (1, 2, 3, 4), добавьте в запрос схемы компоновки вычисляемое поле с функцией КВАРТАЛ(Дата) и выведите его как реквизит группировки. Это удобно, когда квартал используется в условном оформлении или в формуле другого показателя.
В динамическом списке на управляемой форме отдельной колонки «квартал» нет, но список можно сгруппировать по дате с периодичностью «квартал» через настройку группировки — механизм тот же, что в СКД.
Квартал и бухгалтерская отчётность: зачем он нужен
Квартал в 1С — это не абстрактная арифметика, а граница отчётного периода. По итогам квартала формируется и сдаётся основная отчётность:
- 📄 декларация по НДС — налоговый период по налогу равен кварталу (ст. 163 НК РФ);
- 📄 расчёт по страховым взносам (РСВ) — за квартал, полугодие, 9 месяцев и год;
- 📄 расчёт 6-НДФЛ — ежеквартально нарастающим итогом;
- 📄 авансовые расчёты по налогу на прибыль — отчётные периоды квартал, полугодие, 9 месяцев (ст. 285 НК РФ).
Поэтому «определить квартал» на практике чаще значит «взять данные за отчётный период». В типовых конфигурациях (БП 3.0 и других) выбор периода в отчётах и регламентированной отчётности уже оперирует кварталами — руками номер считать не нужно. В форме регламентированного отчёта период задаётся кварталом сразу, а не произвольными датами.
Важная тонкость — граница квартала и дата документа. Отчётность собирается по дате документа, а не по дате его создания или проведения. Документ, датированный 31.03, уходит в первый квартал, даже если проведён в апреле. Если документ нужно учесть в другом периоде, меняют именно дату документа, а не дату проведения.
Отдельная история — закрытие периода
и запрет редактирования данных. Когда квартальная отчётность сдана, период закрывают, чтобы задним числом не поменялись проводки и суммы в декларации. В БП 3.0 это раздел Администрирование → Даты запрета изменения. Дату запрета обычно ставят на конец закрытого квартала.
Перед установкой даты запрета убедитесь, что все документы квартала проведены и перепроведены, а регламентные операции закрытия месяца выполнены по всем трём месяцам квартала. Запрет не отменяет закрытие — он только защищает уже закрытый период от правок.
Почему 1С «неправильно» определяет квартал
Чаще всего виновата не платформа, а данные или формула. Сам расчёт квартала в 1С детерминирован: при одной и той же дате результат всегда одинаков, поэтому «плавающий» номер — это почти всегда ошибка во входных данных или в условии отбора. Разберём типичные причины.
Цел((Месяц(Дата) - 1) / 3) + 1. Без - 1 январь даст квартал «1» только случайно, а март уедет во второй квартал.00010101. У неё месяц = 1, значит квартал = 1. Отсекайте пустую дату условием ЗначениеЗаполнено(Дата).ГОД(Дата) рядом с КВАРТАЛ(Дата).КонецКвартала() возвращает 23:59:59 — используйте <= или функцию КОНЕЦПЕРИОДА.НачалоКвартала(), а не сравнивайте «сырые» даты со временем.Готовые решения под частые задачи
Собрал короткие фрагменты, которые закрывают большинство запросов «определить квартал».
Номер квартала текущей даты:
ТекущийКвартал = Цел((Месяц(ТекущаяДата()) - 1) / 3) + 1;
Первый и последний день квартала по произвольной дате:
Дата = Документ.Дата;
НачалоПериода = НачалоКвартала(Дата);
КонецПериода = КонецКвартала(Дата);
Предыдущий квартал (для сравнения периодов):
ПрошлыйКвартал = НачалоКвартала(ДобавитьМесяц(НачалоКвартала(Дата), -3));
ДобавитьМесяц() сдвигает дату на нужное число месяцев; минус три месяца от начала квартала попадают в предыдущий квартал, а внешний НачалоКвартала() выравнивает результат на его первый день.
Следующий квартал (для планирования и графиков):
СледующийКвартал = НачалоКвартала(ДобавитьМесяц(НачалоКвартала(Дата), 3));
Плюс три месяца от начала текущего квартала гарантированно попадают в следующий, и НачалоКвартала() снова выравнивает дату на первое число. Через ДобавитьМесяц сдвигают именно на кварталы, потому что прибавление ровно 90 дней из-за разной длины месяцев иногда промахивается мимо границы.
Проверка «входит ли дата в заданный квартал»:
Функция ДатаВКвартале(Дата, ДатаКвартала)
Возврат Дата >= НачалоКвартала(ДатаКвартала)
И Дата <= КонецКвартала(ДатаКвартала);
КонецФункции
Эти четыре приёма перекрывают и расчёт номера, и границы периода, и сравнение кварталов — то, ради чего обычно и ищут «как определить квартал в 1С».
Частые вопросы
Есть ли в 1С готовая функция `Квартал()` во встроенном языке?
Квартал() в языке 1С нет — номер считают из месяца: Цел((Месяц(Дата) - 1) / 3) + 1. Готовая функция КВАРТАЛ(Дата) есть только в языке запросов.Чем отличается `КВАРТАЛ` в запросе от расчёта во встроенном языке?
НАЧАЛОПЕРИОДА/НачалоКвартала.Как получить подпись «1 квартал 2024 г.» автоматически?
ПредставлениеПериода(НачалоКвартала(Дата), КонецКвартала(Дата)). Она сама подберёт формулировку, если даты совпадают с границами квартала.Почему все документы попали в первый квартал?
00010101 — у неё месяц 1, поэтому квартал считается первым. Отсекайте пустые даты условием ЗначениеЗаполнено(Дата).Работает ли расчёт для даты со временем?
Месяц() и запрос КВАРТАЛ время игнорируют. Осторожность нужна только на границах суток при разных часовых поясах — тогда приводите значение к НачалоКвартала().Источники
- НК РФ, ст. 163 (налоговый период по НДС — квартал)
- НК РФ, ст. 285 (отчётные периоды по налогу на прибыль — квартал, полугодие, 9 месяцев)