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