При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с задачей вывода агрегированных показателей, которые имеют смысл только на верхних уровнях группировки. Типичный пример — отчет по валовой прибыли, где требуется вывести общее количество уникальных сделок (заказов покупателей) в разрезе менеджеров.
Если мы просто добавим ресурс с формулой подсчета уникальных заказов, СКД автоматически рассчитает его для всех уровней группировки, включая номенклатуру. В результате напротив каждой позиции номенклатуры появится неинформативная единица (так как конкретная строка товара принадлежит одному уникальному заказу). Выясним причину такого поведения системы и разберем четыре профессиональных метода, как скрыть эти «единички» и оставить отчет чистым и читаемым.
Проанализируем ситуацию. Когда мы определяем поле Количество(Различные ЗаказПокупателя) в качестве ресурса, СКД по умолчанию рассчитывает его для всех доступных группировок отчета. На уровне группировки Менеджер система считает все уникальные документы, закрепленные за этим сотрудником. Это корректное и ожидаемое поведение.
Однако на уровне группировки Номенклатура СКД берет конкретный товар и смотрит, в каких заказах он фигурировал в рамках выборки по менеджеру. Поскольку в рамках одной строки детальной записи товар чаще всего принадлежит одному заказу, результатом вычисления ресурса становится единица. Нам нужно исключить этот расчет или скрыть его отображение для определенных уровней группировки.
Ниже мы подробно рассмотрим четыре способа решения этой задачи — от простых настроек оформления до продвинутых функций вычисления выражений в СКД.
Самый простой и логичный способ — это явное указание системе, какие поля нужно выводить для конкретной группировки, а какие нет. Вместо того чтобы рассчитывать ресурс и затем маскировать его, мы можем просто отключить вывод колонки на детальном уровне.
Разберем по шагам, как это сделать:
После применения этих настроек колонка с количеством сделок останется в отчете на уровне менеджера и общих итогов, но на уровне строк с номенклатурой ячейки будут абсолютно пустыми. Этот метод считается наиболее профессиональным, так как он не нагружает систему лишним форматированием.
Если мы хотим решить проблему на уровне схемы компоновки данных еще до этапа вывода полей, нам поможет правильное распределение расчета ресурса. Настроим СКД так, чтобы вычисление количества сделок вообще не производилось для группировки по номенклатуре.
Рассмотрим порядок действий:
Количество(Различные ЗаказПокупателя)).NULL.В результате СКД вернет значение NULL для всех неуказанных группировок (включая номенклатуру). По умолчанию пустые значения в отчетах 1С не отображаются, что мгновенно решит проблему с лишними единицами.
Этот способ отлично подойдет в тех случаях, когда структура отчета динамическая или жестко задана пользователем в режиме «1С:Предприятие». Мы можем применить условное оформление целенаправленно к определенной группировке.
Настроим оформление по шагам:
Если структура отчета сложная (содержит много уровней вложенности), ручная настройка для каждой группировки может занять много времени. Для таких ситуаций можно использовать универсальное системное условие на уровне всего отчета:
СистемныеПоля.УровеньВГруппировке > 1 (это означает, что условие сработает для всех уровней ниже первого).Благодаря этому правилу СКД автоматически скроет детальные значения на всех вложенных уровнях иерархии, сохранив их вывод только для верхнего уровня менеджеров.
Посмотрим на ситуацию шире. При простом подсчете количества уникальных документов функцией Количество(Различные ЗаказПокупателя) на уровне общего итога может возникнуть математическая погрешность.
Например, если один и тот же заказ по ошибке или в результате совместной сделки был привязан к двум разным менеджерам, то на уровне общего итога функция выдаст количество уникальных заказов по всей базе данных. Это значение будет меньше, чем сумма сделок, отображаемая по строкам менеджеров. Бухгалтеры и руководители сразу заметят, что «математика отчета не сходится».
Чтобы решить эту проблему и получить корректную сумму по строкам менеджеров в общем итоге, воспользуемся мощной системной функцией СКД. Пропишем формулу ресурса следующим образом:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Количество(Различные ЗаказПокупателя)", "Менеджер"))
Проанализируем, как работает эта конструкция:
ВычислитьВыражениеСГруппировкойМассив собирает массив значений количества уникальных сделок, предварительно сгруппированных по каждому конкретному Менеджеру.Сумма складывает полученные элементы массива.Такой подход гарантирует, что в строке «Итого» будет выведена точная сумма всех сделок, отображенных в строках менеджеров, а детальные записи номенклатуры не будут перегружены лишними расчетами.
Используйте предложенные методы в зависимости от сложности вашего отчета и требований к производительности системы. Оптимальным выбором для большинства отчетов будет сочетание Способа 2 (ограничение расчета по группировкам в ресурсах) и Способа 4 (для выравнивания итоговых сумм).