Как в СКД не выводить итоги по колонке «Цена», а по остальным выводить?

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

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

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

Метод 1. Настройка расчета ресурса по конкретным группировкам

Это самый простой и правильный с точки зрения архитектуры СКД способ. Мы укажем системе, что рассчитывать ресурс Цена нужно только для детальных записей или конкретной нижней группировки (например, Номенклатура), а для вышестоящих группировок и общих итогов расчет производиться не должен.

Выполним настройку по шагам:

  1. Откроем схему компоновки данных и перейдем на вкладку Ресурсы.
  2. Найдем в списке поле Цена. Если его там нет, добавим.
  3. Обратим внимание на колонку Рассчитывать по.... По умолчанию это поле пустое, что означает расчет по всем доступным группировкам и общим итогам отчета.
  4. Нажмем на кнопку выбора в колонке Рассчитывать по... для поля Цена.
  5. В появившемся окне выбора полей укажем только ту группировку, на уровне которой цена имеет смысл — например, Номенклатура. Флажки с «Все поля» и «Общие итоги» должны быть сняты.

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

Метод 2. Дублирование ресурса со значением NULL для итогов

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

  1. Перейдем на вкладку Ресурсы схемы компоновки.
  2. Добавим поле Цена в список ресурсов дважды (создадим две отдельные строки для одного и того же поля):

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

Метод 3. Использование выражений СКД с проверкой на группу

Если в отчете используется иерархическая группировка (например, справочник Номенклатура с выводом групп и элементов), то стандартное ограничение «Рассчитывать по...» может работать некорректно на уровнях иерархии. В этом случае мы можем управлять расчетом программно, используя язык выражений СКД.

Рассмотрим пример выражения для ресурса Цена на вкладке Ресурсы:


Выбор 
    Когда Номенклатура.ЭтоГруппа Тогда NULL 
    Иначе Максимум(Цена) 
Конец

Разберем, как работает эта конструкция. При обходе дерева группировок система компоновки данных проверяет свойство текущего элемента. Если текущая запись является группой (папкой) справочника номенклатуры, выражение возвращает NULL, и итог по этой строке не выводится. Если это конечный элемент — рассчитывается значение цены.

Для более сложных иерархических структур, где нет прямой привязки к реквизиту ЭтоГруппа, можно использовать системные функции СКД. Например, функцию ограничения контекста:

ВычислитьВыражение("Максимум(Цена)", "Номенклатура", "Группировка")

Данная функция жестко указывает системе рассчитывать максимум цены исключительно в контексте группировки Номенклатура. При попытке рассчитать значение в контексте общих итогов функция вернет NULL.

Метод 4. Визуальное скрытие итогов через Условное оформление

Иногда расчет цены в итогах ломать нельзя, так как ее значение может использоваться в формулах других вычисляемых ресурсов (например, для расчета плановой себестоимости или маржинальности на верхних уровнях). В таком случае нам нужно рассчитать цену везде, но скрыть ее отображение в финальной печатной форме для строк итогов.

Для этого применим механизм Условного оформления:

  1. Перейдем на вкладку Настройки в нижней части конструктора СКД.
  2. Выберем вкладку Условное оформление.
  3. Добавим новое правило оформления:
    • В поле Оформление установим флажок на свойство Текст и укажем в качестве значения один пробел " " (или оставим поле полностью пустым).
    • В поле Оформляемые поля выберем наше поле Цена.
    • В поле Условие добавим проверку системных полей СКД. Например, укажем условие: СистемныеПоля.УровеньВГруппировке Не равно 1 (или настроим проверку типа записи через системное поле СистемныеПоля.ТипЗаписи, установив его равным значению общего итога или группировки).

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

Метод 5. Вывод цены без добавления в ресурсы (только в детальных записях)

Если колонка Цена носит исключительно справочный характер и над ней не нужно проводить никаких математических операций (даже вычислять минимум или максимум на уровне строк), то самым простым решением будет вообще не объявлять ее ресурсом.

Проанализируем этот сценарий:

  1. Убедимся, что на вкладке Ресурсы поле Цена отсутствует. Если оно там есть — удалим его.
  2. Перейдем на вкладку Настройки и обратим внимание на структуру отчета.
  3. Если в структуре отчета у нас есть группировка Детальные записи (или конечная группировка по номенклатуре):
    • Выберем эту группировку в дереве структуры.
    • В нижней части настроек перейдем на вкладку Выбранные поля конкретно для этой группировки.
    • Снимем флаг Авто (чтобы настройки группировки не наследовались от отчета в целом) и вручную добавим поле Цена только в этот список.
  4. На уровне общих настроек отчета (в глобальных выбранных полях) поле Цена выводиться не должно.

В результате выполнения этих шагов колонка с ценой появится исключительно на самом нижнем уровне отчета — в детальных записях. На уровне группировок и в строке «Итого» данная колонка даже не будет создаваться, что полностью исключит вывод ненужных итоговых данных.

Метод 6. Использование фиксированных макетов оформления

В наиболее сложных отчетах со специфическим дизайном, где стандартные методы управления итогами не обеспечивают требуемого визуального отображения (например, при формировании сложных кросс-таблиц), можно прибегнуть к созданию индивидуального макета оформления для группировок или итогов.

Для этого на вкладке Макеты создается макет группировки или макет общего итога, из ячеек которого убирается параметр, связанный с полем Цена. Данный метод гарантирует 100% результат в любых нестандартных отчетах, однако требует больше времени на разработку и поддержку схемы компоновки при изменении ее структуры.

Мы рекомендуем начинать решение задачи с Метода 1 и Метода 3, так как они являются наиболее гибкими, легко поддерживаются и работают в рамках стандартного жизненного цикла компоновки данных 1С.

← На главную