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

· 9 мин

Содержание

Самый короткий способ — во встроенном языке: Квартал = Цел((Месяц(Дата) - 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.2024101I
31.03.202430,671I
01.04.2024412II
30.09.202492,673III
31.12.2024123,674IV

Формула работает и для даты со временем: Месяц() время игнорирует. Если нужна не только цифра, а подпись вида «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. Откройте схему компоновки, перейдите на закладку настроек структуры отчёта.
  2. Добавьте в группировку строк поле с датой (например, Дата).
  3. В типе группировки даты выберите период Квартал.

В результате строки свернутся по кварталам, а подписи СКД сформирует автоматически — «1 квартал 2024 г.» и далее.

Если данные за несколько лет, сделайте две вложенные группировки: сначала по дате с периодом Год, внутри — по дате с периодом Квартал. Тогда кварталы разных лет не смешаются и в отчёте будет понятная иерархия «год → квартал».

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

В динамическом списке на управляемой форме отдельной колонки «квартал» нет, но список можно сгруппировать по дате с периодичностью «квартал» через настройку группировки — механизм тот же, что в СКД.

Квартал и бухгалтерская отчётность: зачем он нужен

Квартал в 1С — это не абстрактная арифметика, а граница отчётного периода. По итогам квартала формируется и сдаётся основная отчётность:

  • 📄 декларация по НДС — налоговый период по налогу равен кварталу (ст. 163 НК РФ);
  • 📄 расчёт по страховым взносам (РСВ) — за квартал, полугодие, 9 месяцев и год;
  • 📄 расчёт 6-НДФЛ — ежеквартально нарастающим итогом;
  • 📄 авансовые расчёты по налогу на прибыль — отчётные периоды квартал, полугодие, 9 месяцев (ст. 285 НК РФ).

Поэтому «определить квартал» на практике чаще значит «взять данные за отчётный период». В типовых конфигурациях (БП 3.0 и других) выбор периода в отчётах и регламентированной отчётности уже оперирует кварталами — руками номер считать не нужно. В форме регламентированного отчёта период задаётся кварталом сразу, а не произвольными датами.

Важная тонкость — граница квартала и дата документа. Отчётность собирается по дате документа, а не по дате его создания или проведения. Документ, датированный 31.03, уходит в первый квартал, даже если проведён в апреле. Если документ нужно учесть в другом периоде, меняют именно дату документа, а не дату проведения.

Отдельная история — закрытие периода и запрет редактирования данных. Когда квартальная отчётность сдана, период закрывают, чтобы задним числом не поменялись проводки и суммы в декларации. В БП 3.0 это раздел Администрирование → Даты запрета изменения. Дату запрета обычно ставят на конец закрытого квартала.

Перед установкой даты запрета убедитесь, что все документы квартала проведены и перепроведены, а регламентные операции закрытия месяца выполнены по всем трём месяцам квартала. Запрет не отменяет закрытие — он только защищает уже закрытый период от правок.

Почему 1С «неправильно» определяет квартал

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

Диагностика: выберите симптом

Готовые решения под частые задачи

Собрал короткие фрагменты, которые закрывают большинство запросов «определить квартал».

Номер квартала текущей даты:

ТекущийКвартал = Цел((Месяц(ТекущаяДата()) - 1) / 3) + 1;

Первый и последний день квартала по произвольной дате:

Дата = Документ.Дата;
НачалоПериода = НачалоКвартала(Дата);
КонецПериода  = КонецКвартала(Дата);

Предыдущий квартал (для сравнения периодов):

ПрошлыйКвартал = НачалоКвартала(ДобавитьМесяц(НачалоКвартала(Дата), -3));

ДобавитьМесяц() сдвигает дату на нужное число месяцев; минус три месяца от начала квартала попадают в предыдущий квартал, а внешний НачалоКвартала() выравнивает результат на его первый день.

Следующий квартал (для планирования и графиков):

СледующийКвартал = НачалоКвартала(ДобавитьМесяц(НачалоКвартала(Дата), 3));

Плюс три месяца от начала текущего квартала гарантированно попадают в следующий, и НачалоКвартала() снова выравнивает дату на первое число. Через ДобавитьМесяц сдвигают именно на кварталы, потому что прибавление ровно 90 дней из-за разной длины месяцев иногда промахивается мимо границы.

Проверка «входит ли дата в заданный квартал»:

Функция ДатаВКвартале(Дата, ДатаКвартала)
    Возврат Дата >= НачалоКвартала(ДатаКвартала)
        И Дата <= КонецКвартала(ДатаКвартала);
КонецФункции

Эти четыре приёма перекрывают и расчёт номера, и границы периода, и сравнение кварталов — то, ради чего обычно и ищут «как определить квартал в 1С».

Проверка перед тем, как доверять номеру квартала
Выполнено: 0 / 5

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

Есть ли в 1С готовая функция `Квартал()` во встроенном языке?
Нет. Отдельной функции Квартал() в языке 1С нет — номер считают из месяца: Цел((Месяц(Дата) - 1) / 3) + 1. Готовая функция КВАРТАЛ(Дата) есть только в языке запросов.
Чем отличается `КВАРТАЛ` в запросе от расчёта во встроенном языке?
Результат одинаковый — число 1–4. В запросе удобнее группировать и отбирать данные, во встроенном языке — обрабатывать значения в коде обработки или отчёта. Границы квартала в обоих случаях дают НАЧАЛОПЕРИОДА/НачалоКвартала.
Как получить подпись «1 квартал 2024 г.» автоматически?
Функцией ПредставлениеПериода(НачалоКвартала(Дата), КонецКвартала(Дата)). Она сама подберёт формулировку, если даты совпадают с границами квартала.
Почему все документы попали в первый квартал?
Скорее всего в поле пустая дата 00010101 — у неё месяц 1, поэтому квартал считается первым. Отсекайте пустые даты условием ЗначениеЗаполнено(Дата).
Работает ли расчёт для даты со временем?
Да. Функция Месяц() и запрос КВАРТАЛ время игнорируют. Осторожность нужна только на границах суток при разных часовых поясах — тогда приводите значение к НачалоКвартала().

Источники

  • НК РФ, ст. 163 (налоговый период по НДС — квартал)
  • НК РФ, ст. 285 (отчётные периоды по налогу на прибыль — квартал, полугодие, 9 месяцев)