При разработке отчетов на базе Системы Компоновки Данных (СКД) часто возникает задача группировки данных по периодам. Стандартный механизм Тип дополнения — Неделя жестко привязан к календарному понедельнику. Если бизнес-процессы вашей компании требуют отсчета недели, например, со среды, стандартные инструменты не справятся с этой задачей напрямую. Давайте разберем, как реализовать такую логику собственными силами.
Функция НачалоПериода(Дата, Неделя) в языке запросов 1С всегда возвращает дату ближайшего понедельника. Если мы просто попытаемся прибавить к результату этой функции несколько дней с помощью ДобавитьКДате(), мы столкнемся с проблемой логической целостности данных: понедельник и вторник будут «выпадать» из текущей недели и ошибочно относиться к предыдущей. СКД ожидает непрерывную временную шкалу, поэтому нам нужно создать собственный «ключ» для группировки, который будет приводить любую дату к началу нашей «своей» недели.
Самый надежный способ решить эту задачу — не пытаться «обмануть» встроенные механизмы дополнения дат, а создать вычисляемое поле, которое станет уникальным ключом для группировки. В запросе СКД мы сформируем поле, значение которого будет одинаковым для всех дней одной нашей «средовой» недели.
Для формирования такого ключа используем оператор ВЫБОР и функцию ДеньНедели(). Допустим, нам нужно, чтобы неделя начиналась со среды (день недели 3):
ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(Таблица.Дата) >= 3
ТОГДА НАЧАЛОПЕРИОДА(Таблица.Дата, НЕДЕЛЯ)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(Таблица.Дата, НЕДЕЛЯ), "ДЕНЬ", -7)
КОНЕЦ КАК ПериодСреда
Более простой вариант, если достаточно простого смещения, которое визуально объединит данные:
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(Таблица.Дата, НЕДЕЛЯ), "ДЕНЬ", 3)
Однако помните: если вы используете второй вариант, важно понимать, что НачалоПериода все равно привяжет дату к понедельнику, а сдвиг на 3 дня лишь визуально сместит метку. Для корректной группировки в сложных отчетах используйте конструкцию ВЫБОР, приведенную выше.
После того как мы подготовили поле ПериодСреда, нам необходимо правильно настроить схему:
Наборы данных.Вычисляемые поля, указав выражение, аналогичное запросному.Роль не установлено значение Период, если вы хотите управлять группировкой вручную.ПериодСреда.Так как СКД не будет «знать», что это стандартная неделя, заголовки в отчете могут отображаться не так, как вы привыкли. Чтобы пользователь видел понятные даты начала и окончания недели:
ДФ=dd.MM.yyyy, чтобы вместо системного имени недели выводилась конкретная дата начала периода (среда).Важное предостережение: Не пытайтесь подменять значения параметров ДатаНачала и ДатаОкончания в выражении параметров СКД через ДобавитьКДате. Это приведет к тому, что СКД будет некорректно отсекать данные при формировании выборки (WHERE), так как параметры должны задавать границы диапазона, а не менять математическую природу дат внутри запроса.
Используя этот метод, вы создадите гибкую структуру отчета, которая будет опираться на ваши собственные правила бизнес-логики, сохраняя при этом всю мощь аналитических инструментов 1С.