При разработке отчетов в системе компоновки данных (СКД) часто возникает задача создания кросс-таблиц, где по горизонтали выводятся периоды (например, дни месяца), а по вертикали — сотрудники. Проблема появляется тогда, когда нам нужно вывести дополнительный ресурс, который не должен повторяться для каждой даты, а должен отображаться один раз как итог за весь период. Типичный пример: количество отработанных часов мы видим по дням, а «Количество замен» хотим видеть одной общей цифрой в отдельной колонке.
Рассмотрим подробнее, как реализовать такую структуру отчета, чтобы избежать загромождения таблицы лишними данными и сделать отчет максимально читаемым. Разберем по шагам несколько эффективных методов решения этой задачи.
Самый простой и правильный с точки зрения архитектуры СКД способ — это ограничить расчет и вывод ресурса определенными группировками. По умолчанию СКД пытается вывести каждый ресурс в каждой доступной группировке колонок. Проанализируем, как это изменить:
Замены).Сумма(Замены).Сотрудник и Общий итог. Флажок с поля Период должен быть снят.После этой настройки ресурс перестанет выводиться в колонках, относящихся к датам, и останется только в итоговых колонках по строке сотрудника. Это позволяет визуально отделить ежедневные показатели от общих итогов за период.
Если нам требуется более сложная логика, например, использование значения замен в других вычислениях внутри каждой ячейки периода, мы можем прибегнуть к языку выражений СКД. Функция ВычислитьВыражение позволяет получить агрегатное значение в контексте любой группировки.
Рассмотрим пример создания вычисляемого поля для общего итога, который включает в себя и часы, и общие замены сотрудника за весь выбранный период. В списке вычисляемых полей создадим поле ОбщийИтогСЗаменами. В выражении ресурса для этого поля пропишем:
Сумма(КоличествоЧасов) + ВычислитьВыражение("Сумма(Замены)", "Сотрудник", "Общий")
Здесь второй параметр "Сотрудник" указывает системе, что сумму замен нужно вычислить в рамках всей группировки по сотруднику, игнорируя текущую колонку периода. Это гарантирует, что к часам за конкретный день будет прибавлено общее число замен за месяц, если это необходимо для вашей бизнес-логики.
Выясним причину, почему иногда стандартные итоги не подходят. Если пользователю нужно, чтобы колонка «Замены» стояла не в конце отчета после всех дат, а, например, сразу после ФИО сотрудника, нам поможет манипуляция со структурой отчета на закладке «Настройки».
Разберем этот метод по шагам:
Период. В её настройках (закладка «Выбранные поля») укажем только ресурс КоличествоЧасов.Замены.Такой подход позволяет жестко разделить область отчета на «Периодическую» и «Статическую». Система выведет сначала все даты с часами, а затем одну отдельную колонку с суммами замен.
Если поле Замены уже содержит итоговое значение (например, вы передаете данные из заранее подготовленной ТаблицыЗначений, где сумма уже посчитана для каждой строки), его можно вывести как дополнительное поле группировки строк.
Проанализируем ситуацию: у нас есть группировка Сотрудник. Мы можем не добавлять Замены в ресурсы вообще. Вместо этого:
Сотрудник в настройках отчета.Замены.В этом случае общее количество замен отобразится сразу после колонки с фамилией сотрудника, еще до начала таблицы с датами. Это очень удобно для оперативного анализа эффективности персонала.
При использовании ТаблицыЗначений важно правильно обрабатывать агрегацию. Если в вашей ТЗ на каждую дату для одного сотрудника прописано общее число замен (например, цифра «3» повторяется в пяти строках за разные даты), то обычная Сумма() в ресурсах выдаст 15 (3 * 5).
В такой ситуации в выражении ресурса следует использовать функции Максимум() или Среднее():
Максимум(Замены)
И обязательно указывать расчет только по группировке Сотрудник, как мы рассматривали в первом методе. Если же в ТЗ единица ставится только в тот день, когда замена действительно была, тогда смело используем Сумма().
Посмотрим на пример итоговой настройки ресурсов для сложного случая:
// Ресурс КоличествоЧасов
Выражение: Сумма(КоличествоЧасов)
Рассчитывать по: Период, Сотрудник, ОбщийИтог
// Ресурс Замены
Выражение: Сумма(Замены)
Рассчитывать по: Сотрудник, ОбщийИтог
Такая конфигурация является классической для решения задачи автора и обеспечивает корректное отображение данных в кросс-таблице без лишних дублей в колонках дат.