При разработке аналитических отчетов в системе компоновки данных (СКД) часто возникает задача распределения показателей не просто по датам, а по дням недели. Это позволяет проанализировать активность продаж, посещаемость или загрузку персонала в разрезе циклического недельного графика. Однако начинающие разработчики часто сталкиваются с тем, что дни недели либо отображаются в виде цифр, либо сортируются по алфавиту (Воскресенье, Вторник, Понедельник...), что неудобно для конечного пользователя. В этой статье мы подробно разберем, как правильно реализовать группировку по дням недели, задать им понятные названия и обеспечить хронологический порядок вывода.
Рассмотрим самый первый этап — получение номера дня недели непосредственно в запросе. Для этого в языке запросов 1С предусмотрена функция ДЕНЬНЕДЕЛИ. Проанализируем пример того, как это может выглядеть в тексте запроса:
ВЫБРАТЬ
Продажи.Менеджер КАК Менеджер,
Продажи.СуммаОборот КАК Сумма,
ДЕНЬНЕДЕЛИ(Продажи.Период) КАК НомерДняНедели,
Продажи.Период КАК Период
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
Функция ДЕНЬНЕДЕЛИ возвращает число от 1 (понедельник) до 7 (воскресенье). Это поле идеально подходит для технической группировки и сортировки, но в шапке отчета пользователю будет непонятно, что означает цифра 1 или 5. Разберем, как преобразовать эти данные в читаемый вид.
Если мы хотим, чтобы вместо цифр выводились названия, мы можем использовать конструкцию ВЫБОР прямо в наборе данных или в самом запросе. Посмотрим на реализацию этого механизма:
ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(Период) = 1 ТОГДА "Понедельник"
КОГДА ДЕНЬНЕДЕЛИ(Период) = 2 ТОГДА "Вторник"
КОГДА ДЕНЬНЕДЕЛИ(Период) = 3 ТОГДА "Среда"
КОГДА ДЕНЬНЕДЕЛИ(Период) = 4 ТОГДА "Четверг"
КОГДА ДЕНЬНЕДЕЛИ(Период) = 5 ТОГДА "Пятница"
КОГДА ДЕНЬНЕДЕЛИ(Период) = 6 ТОГДА "Суббота"
КОГДА ДЕНЬНЕДЕЛИ(Период) = 7 ТОГДА "Воскресенье"
КОНЕЦ
Однако здесь мы сталкиваемся с проблемой: при попытке отсортировать отчет по этому текстовому полю, 1С выстроит их в алфавитном порядке. "Воскресенье" окажется первым, а "Среда" последней. Чтобы этого избежать, нам нужно использовать Поле упорядочивания.
Наиболее профессиональным и гибким способом является использование встроенных возможностей форматирования дат в СКД. Вместо того чтобы писать сложные конструкции ВЫБОР КОГДА, мы можем использовать стандартную функцию Формат.
Рассмотрим по шагам, как это настроить на вкладке Наборы данных:
ДатаДокумента).Формат(ДатаДокумента, "ДФ=дддд"). Это укажет системе, что вместо полной даты нужно выводить полное наименование дня недели."ДФ=дд".Преимущество этого метода: он учитывает локализацию системы. Если пользователь запустит отчет на английском языке, он автоматически увидит "Monday", а не жестко прописанный в коде "Понедельник".
Чтобы дни недели в таблице или диаграмме располагались правильно (с понедельника по воскресенье), выполним следующую настройку в схеме компоновки:
Проанализируем вкладку Наборы данных. Для строкового поля (где у нас названия дней) найдем колонку Поле упорядочивания. В этой колонке нужно выбрать числовое поле, содержащее номер дня недели (полученное через ДЕНЬНЕДЕЛИ в запросе). Таким образом, визуально пользователь будет видеть текст, но система при компоновке будет знать, что "Понедельник" (1) меньше "Вторника" (2).
Иногда полезно оставить запрос максимально простым, а все преобразования перенести на уровень компоновки. Выясним, как это сделать через Вычисляемые поля:
ДеньНеделиТекст.ДеньНедели(Дата) (это функция языка выражений СКД, аналогичная функции в запросе).ДФ=дддд.Теперь это поле можно использовать в группировках строк или колонок таблицы.
Рассмотрим ситуацию: в среду и четверг продаж не было. В обычном отчете эти колонки просто исчезнут, что может исказить общую картину недели. Чтобы обеспечить вывод всех семи дней, проанализируем механизм Дополнения периодов:
&НачалоПериода и &КонецПериода).Теперь СКД принудительно создаст строки для каждого дня, входящего в выбранный диапазон, и наш отчет по дням недели станет "плотным" и информативным.
Мы разобрали несколько подходов к созданию отчета по дням недели. Подведем итог: наиболее эффективным сочетанием является использование функции ДЕНЬНЕДЕЛИ в запросе для корректной сортировки и использование Формата или Выражения представления для вывода красивых названий. Это гарантирует правильный порядок дней в отчете и корректную работу в разных языковых версиях платформы 1С.