Как в отчете СКД сгруппировать данные по дням недели и настроить их правильную сортировку?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Метод 1: Использование функций языка запросов

Рассмотрим самый первый этап — получение номера дня недели непосредственно в запросе. Для этого в языке запросов 1С предусмотрена функция ДЕНЬНЕДЕЛИ. Проанализируем пример того, как это может выглядеть в тексте запроса:


ВЫБРАТЬ
    Продажи.Менеджер КАК Менеджер,
    Продажи.СуммаОборот КАК Сумма,
    ДЕНЬНЕДЕЛИ(Продажи.Период) КАК НомерДняНедели,
    Продажи.Период КАК Период
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи

Функция ДЕНЬНЕДЕЛИ возвращает число от 1 (понедельник) до 7 (воскресенье). Это поле идеально подходит для технической группировки и сортировки, но в шапке отчета пользователю будет непонятно, что означает цифра 1 или 5. Разберем, как преобразовать эти данные в читаемый вид.

Метод 2: Настройка представления поля через «Выбор Когда»

Если мы хотим, чтобы вместо цифр выводились названия, мы можем использовать конструкцию ВЫБОР прямо в наборе данных или в самом запросе. Посмотрим на реализацию этого механизма:


ВЫБОР
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 1 ТОГДА "Понедельник"
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 2 ТОГДА "Вторник"
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 3 ТОГДА "Среда"
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 4 ТОГДА "Четверг"
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 5 ТОГДА "Пятница"
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 6 ТОГДА "Суббота"
    КОГДА ДЕНЬНЕДЕЛИ(Период) = 7 ТОГДА "Воскресенье"
КОНЕЦ

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

Метод 3: Использование выражения представления и системного форматирования

Наиболее профессиональным и гибким способом является использование встроенных возможностей форматирования дат в СКД. Вместо того чтобы писать сложные конструкции ВЫБОР КОГДА, мы можем использовать стандартную функцию Формат.

Рассмотрим по шагам, как это настроить на вкладке Наборы данных:

  1. Найдем в списке полей наше поле с датой (например, ДатаДокумента).
  2. В колонке Выражение представления пропишем: Формат(ДатаДокумента, "ДФ=дддд"). Это укажет системе, что вместо полной даты нужно выводить полное наименование дня недели.
  3. Если нам нужны краткие названия (Пн, Вт, Ср), используем формат "ДФ=дд".

Преимущество этого метода: он учитывает локализацию системы. Если пользователь запустит отчет на английском языке, он автоматически увидит "Monday", а не жестко прописанный в коде "Понедельник".

Настройка правильной сортировки (хронологической)

Чтобы дни недели в таблице или диаграмме располагались правильно (с понедельника по воскресенье), выполним следующую настройку в схеме компоновки:

Проанализируем вкладку Наборы данных. Для строкового поля (где у нас названия дней) найдем колонку Поле упорядочивания. В этой колонке нужно выбрать числовое поле, содержащее номер дня недели (полученное через ДЕНЬНЕДЕЛИ в запросе). Таким образом, визуально пользователь будет видеть текст, но система при компоновке будет знать, что "Понедельник" (1) меньше "Вторника" (2).

Метод 4: Вычисляемые поля для разгрузки запроса

Иногда полезно оставить запрос максимально простым, а все преобразования перенести на уровень компоновки. Выясним, как это сделать через Вычисляемые поля:

  1. Переходим на вкладку Вычисляемые поля.
  2. Добавляем новое поле, назовем его ДеньНеделиТекст.
  3. В колонке Выражение пишем: ДеньНедели(Дата) (это функция языка выражений СКД, аналогичная функции в запросе).
  4. В колонке Оформление устанавливаем параметр Формат и в строке формата пишем ДФ=дддд.

Теперь это поле можно использовать в группировках строк или колонок таблицы.

Как вывести все дни недели, даже если нет данных?

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

  1. В настройках СКД выберем группировку по полю даты.
  2. Перейдем на вкладку Настройки группировки -> Дополнительные настройки (или в некоторых версиях прямо в окне выбора полей группировки).
  3. Установим Тип дополнения — "День".
  4. Укажем начальную и конечную дату (обычно это параметры &НачалоПериода и &КонецПериода).

Теперь СКД принудительно создаст строки для каждого дня, входящего в выбранный диапазон, и наш отчет по дням недели станет "плотным" и информативным.

Итоги

Мы разобрали несколько подходов к созданию отчета по дням недели. Подведем итог: наиболее эффективным сочетанием является использование функции ДЕНЬНЕДЕЛИ в запросе для корректной сортировки и использование Формата или Выражения представления для вывода красивых названий. Это гарантирует правильный порядок дней в отчете и корректную работу в разных языковых версиях платформы 1С.

← На главную