Как в СКД вывести значение из вышестоящей группировки в нижестоящую

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

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

Использование функции ВычислитьВыражение

Основным инструментом для решения нашей задачи является встроенная функция СКД ВычислитьВыражение. Рассмотрим подробнее её синтаксис и параметры, которые позволяют «дотянуться» до данных вышестоящих уровней. Проанализируем стандартный вызов функции:

ВычислитьВыражение("Сумма(Количество)", "ИмяГруппировки", "Группировка")

Разберем, что означает каждый параметр в контексте нашей задачи:

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

Важный этап: Именование группировок

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

  1. Перейдем на вкладку «Настройки» в схеме компоновки данных.
  2. Выберем нужную группировку (например, «Номенклатура Иерархия»).
  3. В нижней части окна настроек найдем свойства этой группировки.
  4. В поле «Имя» введем уникальное название латиницей или кириллицей, например, ГруппаНоменклатуры.

Теперь мы можем использовать это имя в формуле ресурса. Посмотрим на пример кода:

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

Разделение расчетов ресурсов для разных уровней

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

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

  1. Добавим поле в ресурсы.
  2. В колонке «Рассчитывать по» снимем галочки со всех уровней, кроме того, где нам нужен вывод родительского значения (например, только для детальных записей или самой вложенной группы).
  3. В выражении пропишем формулу обращения к родителю.
  4. Добавим это же поле второй раз, но укажем «Рассчитывать по» для верхних уровней и оставим там стандартную сумму или 0.

Применение функции Уровень() для управления логикой

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


ВЫБОР 
    КОГДА Уровень() > 1 
    ТОГДА ВычислитьВыражение("Сумма(СуммаОборот)", "ИерархияНоменклатуры", "Группировка") 
    ИНАЧЕ 0 
КОНЕЦ

Такой подход защитит отчет от вывода некорректных данных на самом верхнем уровне, где «вышестоящей» группы просто не существует.

Нюансы работы с Общим Итогом

Если ваша задача — вывести значение самого верхнего уровня (корневого итога всего отчета) в каждую строку, нам не обязательно знать имя конкретной группировки. Разберем использование ключевого слова "ОбщийИтог".

В этом случае формула в ресурсе будет выглядеть так:

ВычислитьВыражение("Сумма(Количество)", "ОбщийИтог")

Это значение будет продублировано во всех строках отчета, что удобно для расчета доли текущей строки в общем объеме (например, Сумма(Продажи) / ВычислитьВыражение("Сумма(Продажи)", "ОбщийИтог") * 100).

Типичные ошибки: ВычислитьВыражениеСГруппировкойМассив

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

Для нашей же задачи — получения значения от родителя — она избыточна и сложна. Помните: если нужно значение «сверху вниз», используем обычное ВычислитьВыражение. Если «снизу вверх» со специфической логикой — тогда смотрим в сторону массивов.

Выводы

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

  1. Обязательно присвоить имя группировке в настройках компоновки.
  2. Правильно использовать функцию ВычислитьВыражение с указанием области "Группировка".
  3. Настраивать расчет ресурсов индивидуально для разных уровней отчета, чтобы избежать каши в данных.

Используя эти методы, вы сможете создавать профессиональные аналитические отчеты, которые наглядно показывают взаимосвязь между разными уровнями данных в вашей системе.

← На главную