Работа с временными интервалами является одной из самых частых задач при разработке конфигураций на платформе 1С:Предприятие. Особенно это актуально при формировании регламентированной отчетности, где данные группируются по кварталам, или при построении аналитических регистров. Разработчики часто сталкиваются с необходимостью извлечь номер временного периода или определить его границы для последующих вычислений.

Существует несколько подходов к решению этой задачи: от использования встроенных функций до ручных математических вычислений. Выбор конкретного метода зависит от того, что именно требуется: просто число от 1 до 4, дата начала периода или полноценный объект для работы с календарем. Понимание нюансов работы с типом Дата гарантирует корректность отчетов.

В этой статье мы детально рассмотрим все доступные инструменты платформы для работы с кварталами. Мы разберем как стандартные функции, так и алгоритмические решения, которые могут пригодиться в нестандартных ситуациях. Особое внимание уделим производительности и читаемости кода.

Использование встроенной функции НомерКвартала

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

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

Рассмотрим простой пример использования в модуле объекта или обработки:

ТекущаяДата = ТекущаяДата();

НомерПериода = НомерКвартала(ТекущаяДата);

Сообщить("Сейчас идет " + НомерПериода + " квартал года");

Если ваша задача involves работу с fiscal year (финансовым годом), который не совпадает с календарным, данный метод потребует дополнительной логики для корректировки года перед вызовом.

💡

Функция НомерКвартала() работает быстрее ручного деления месяца на 3, так как использует оптимизированный внутренний код платформы.

Определение границ периода: НачалоКвартала и КонецКвартала

Часто разработчику требуется не просто номер, а конкретная дата начала или конца временного отрезка. Для этих целей в языке запросов и встроенном языке предусмотрены функции НАЧАЛОКВАРТАЛА() и КОНЕЦКВАРТАЛА(). Они возвращают значения типа Дата, обнуляя время до начала суток или устанавливая его на конец последних суток периода.

Эти функции критически важны при построении выборок из регистраов накопления или документов. Правильно заданные границы позволяют избежать ошибок "плюс-минус одна секунда", которые могут привести к дублированию записей или потере данных при стыковке периодов.

  • 📅 НАЧАЛОКВАРТАЛА устанавливает дату на первое число первого месяца периода (1 января, 1 апреля и т.д.) со временем 00:00:00.
  • 🏁 КОНЕЦКВАРТАЛА устанавливает дату на последнее число последнего месяца (31 марта, 30 июня и т.д.) со временем 23:59:59.
  • ⚙️ Функции могут использоваться как в коде 1С, так и непосредственно в тексте запроса к базе данных.

При использовании в запросах синтаксис остается неизменным. Вы можете передавать в функцию параметр или поле таблицы. Это позволяет динамически группировать данные прямо на уровне СУБД, что значительно повышает производительность отчетов.

⚠️ Внимание: Функция КОНЕЦКВАРТАЛА возвращает время 23:59:59. Если вы используете условие "Меньше" (<) в запросе, убедитесь, что не отсечете последние секунды дня. Лучше использовать "МеньшеИЛИРАВНО" (<=) или брать начало следующего периода.

📊 Какой метод определения границ периода вы используете чаще?
НАЧАЛОКВАРТАЛА в запросе
Ручной расчет в коде
Функции периода в СКД
Готовые обработки

Ручной расчет номера через месяц даты

В ситуациях, когда по каким-либо причинам использование встроенной функции невозможно (например, при переносе логики на сторонний язык или в специфических вычислениях внутри сложных формул), можно прибегнуть к математическому методу. Логика основана на том, что в году 12 месяцев, а квартал содержит 3 месяца.

Алгоритм прост: берем месяц из даты, вычитаем единицу (чтобы начать отсчет с нуля), делим на 3 с отбрасыванием дробной части и прибавляем 1. Это классическая формула для дискретизации временной шкалы. В коде 1С это реализуется через функцию Месяц() и целочисленное деление.

ИсходнаяДата = Дата(2023, 05, 15); // Май

НомерМесяца = Месяц(ИсходнаяДата); // 5

Результат = Цел((НомерМесяца - 1) / 3) + 1; // Получим 2

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

Почему вычитаем 1 перед делением?

Если не вычесть единицу, то для января (месяц 1) формула (1/3) даст 0, и после прибавления 1 мы получим правильный результат. Однако для марта (месяц 3) формула (3/3) даст 1, плюс 1 = 2, что неверно (март — это 1 квартал). Сдвиг на единицу выравнивает сетку координат: 0,1,2 -> квартал 1; 3,4,5 -> квартал 2.

Работа с периодами в запросах к базе данных

Язык запросов 1С предоставляет мощные средства для группировки данных по временным интервалам. Использование виртуальных таблиц и функций периода позволяет получать сводные данные без написания сложного кода на клиенте или сервере. Это особенно важно для тяжелых отчетов.

При формировании отчета в СКД (Система Компоновки Данных) часто возникает необходимость динамического определения периода. Вы можете передавать параметры в запрос, используя конструкцию &Параметр, и применять к ним функции работы с датами прямо в тексте запроса.

Функция запроса Описание действия Пример результата для 15.05.2023
НАЧАЛОКВАРТАЛА(Дата) Возвращает дату начала периода 01.04.2023 0:00:00
КОНЕЦКВАРТАЛА(Дата) Возвращает дату конца периода 30.06.2023 23:59:59
НОМЕРКВАРТАЛА(Дата) Возвращает порядковый номер 2
ГОД(Дата) Извлекает год для группировки 2023

Группировка по вычисляемым полям в запросе позволяет строить иерархические отчеты. Например, сначала данные группируются по году, затем внутри года по кварталу. Это стандартная практика для финансовых отчетов типа "ОПиУ" или "Баланс".

💡

Использование функций периода непосредственно в тексте запроса перекладывает вычисления на сервер СУБД, что ускоряет формирование отчетов в десятки раз.

Форматирование вывода и представление периода

После того как вы получили номер или границы, часто требуется вывести эту информацию пользователю в понятном виде. Просто число "2" может быть непонятно без контекста года. Для формирования строки вида "2 квартал 2023 года" удобно использовать функцию Формат() или конкатенацию строк.

В современных версиях платформы 1С:Предприятие 8.3 доступны гибкие строки формата. Вы можете использовать предопределенные форматы для дат, которые автоматически подставляют названия периодов на языке интерфейса пользователя. Это важно для многоязычных конфигураций.

  • 📝 Используйте Формат(Дата, "ДФ='I квартал yyyy'") для получения строки с римской цифрой.
  • 🔢 Для арабских цифр подойдет формат "ДФ='# квартал yyyy'".
  • 🌐 Учитывайте локаль пользователя, чтобы названия месяцев и кварталов отображались корректно.

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

⚠️ Внимание: При использовании строки формата "ДФ" (Date Format) убедитесь, что вы используете правильные коды языков. Код "ru" может отличаться от "ru-RU" в зависимости от настроек операционной системы сервера.

Типичные ошибки и нюансы високосных лет

Хотя функции работы с датами в 1С надежны, разработчики часто допускают логические ошибки при обработке граничных условий. Самая распространенная проблема — неверное определение конца года при переходе на следующий период. Кварталы жестко привязаны к календарю, но программисты иногда забывают про високосные годы.

Високосный год добавляет один день в феврале, что сдвигает количество дней в первом квартале с 90 до 91. Если вы используете ручные расчеты дней ("дата + 90 дней"), вы гарантированно получите ошибку во втором и последующих кварталах. Всегда используйте системные функции КОНЕЦКВАРТАЛА, они автоматически учитывают календарные особенности.

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

☑️ Проверка корректности работы с датами

Выполнено: 0 / 4

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

Часто задаваемые вопросы (FAQ)

Как получить квартал для даты из прошлого века?

Функции НомерКвартала и НачалоКвартала работают с любым диапазоном дат, поддерживаемым типом Дата в 1С (от 01.01.0001 до 31.12.9999). Ограничений по году нет, алгоритм универсален для любой эпохи.

Можно ли использовать эти функции в управляемых формах?

Да, все перечисленные функции доступны в любом контексте выполнения: на клиенте, на сервере, в модуле формы, модуле объекта или в запросе. Однако вызов ТекущаяДата() на клиенте вернет время локального компьютера, а на сервере — время сервера 1С.

Что делать, если финансовый год начинается не с января?

Стандартные функции ориентированы на календарный год. Для финансового года вам потребуется сдвинуть дату. Например, если год начинается в апреле, вычтите 3 месяца из даты перед определением квартала, а номер года скорректируйте аналогично.

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

Логика аналогична кварталам. Используйте формулу Цел((Месяц(Дата) - 1) / 6) + 1. Либо используйте функции НАЧАЛОПОЛУГОДИЯ и КОНЕЦПОЛУГОДИЯ, которые также встроены в платформу 1С.