При формировании аналитических отчетов в системе компоновки данных часто возникает задача: выделить одну конкретную строку справочника (например, определенную статью затрат) в отдельный итог, а все остальные строки свернуть во второй промежуточный итог, рассчитав при этом процентное соотношение долей. Ситуация усложняется, когда нужный элемент справочника не является предопределенным в конфигураторе, а выбирается пользователем непосредственно в режиме «1С:Предприятие».
Разберем по шагам наиболее эффективные подходы к решению этой задачи без жесткой привязки к внутренним идентификаторам (UID) и без изменения типовой конфигурации.
Проанализируем самый гибкий и универсальный способ. Он заключается в том, чтобы дать пользователю возможность выбрать интересующую позицию в настройках отчета, а затем динамически разбить данные на две категории с помощью вычисляемого поля.
ВыделеннаяСтатьяЗатрат. Зададим ему тип ссылки на соответствующий справочник (например, СправочникСсылка.СтатьиЗатрат). Снимем флаг Ограничение доступности, чтобы пользователь мог интерактивно выбирать значение в шапке или настройках отчета.КатегорияСтатьи. В выражении поля напишем условие:
ВЫБОР
КОГДА СтатьяЗатрат = &ВыделеннаяСтатьяЗатрат
ТОГДА "Выделенная позиция"
ИНАЧЕ "Прочие позиции"
КОНЕЦ
НоменклатурнаяГруппа) и детальными записями по полю СтатьяЗатрат вставим промежуточную группировку по нашему вычисляемому полю КатегорияСтатьи.В результате компоновщик данных автоматически разделит строки на две секции и посчитает стандартные итоги: отдельно по выбранной статье и отдельно по всем оставшимся позициям.
Рассмотрим вариант, когда аналитику требуется разделять статьи затрат не разово в параметрах одного отчета, а централизованно для всего предприятия. Для этого отлично подходит механизм дополнительных реквизитов и сведений (план видов характеристик).
ДополнительнаяГруппировка (тип: булево или строка).СтатьяЗатрат.ДополнительнаяГруппировка выше детальных записей.Такой подход удобен тем, что правила объединения настраиваются пользователями без вмешательства разработчика в схему компоновки.
Если структура колонок отчета требует вывода сумм в параллельные колонки без разбиения строк на промежуточные подгруппы, настроим условные ресурсы.
Перейдем на вкладку Ресурсы и вместо стандартного поля суммы создадим два отдельных ресурсных поля через вычисляемые поля или выражения ресурсов:
Сумма(ВЫБОР
КОГДА СтатьяЗатрат = &ВыделеннаяСтатьяЗатрат
ТОГДА Сумма
ИНАЧЕ 0
КОНЕЦ)
Сумма(ВЫБОР
КОГДА СтатьяЗатрат <> &ВыделеннаяСтатьяЗатрат
ТОГДА Сумма
ИНАЧЕ 0
КОНЕЦ)
В колонке Рассчитывать по... укажем вышестоящие группировки (например, НоменклатурнаяГруппа, Подразделение, ОбщийИтог), чтобы раздельные суммы рассчитывались на уровнях итогов.
Выясним, как рассчитать процентное соотношение долей, где сумма выделенной позиции и сумма прочих позиций в рамках номенклатурной группы в сумме дают 100%.
Для обращения к итогу вышестоящего уровня в СКД используется функция ВычислитьВыражение. Обязательно предусмотрим проверку деления на ноль, чтобы избежать ошибок при формировании отчета с нулевыми суммами.
На вкладке Ресурсы для поля ПроцентОтИтога укажем следующее выражение:
ВЫБОР
КОГДА ВычислитьВыражение("Сумма(Сумма)", "НоменклатурнаяГруппа") = 0
ТОГДА 0
ИНАЧЕ Сумма(Сумма) / ВычислитьВыражение("Сумма(Сумма)", "НоменклатурнаяГруппа") * 100
КОНЕЦ
Посмотрим на параметры функции: первым параметром передается агрегатная функция Сумма(Сумма), а вторым — точное имя группировки, данные которой выступают 100%-й базой для расчета.
Если требуется получить точные пользовательские подписи итогов вида «Подр1_Ит2» и «Подр1_Ит1,3,4...», стандартных заголовков группировок может быть недостаточно. В этом случае используем вкладку Макеты:
[Подразделение] + "_" + [КатегорияСтатьи].С помощью таких настроек отчет формирует четкую структуру с разделением итогов по заданным правилам без необходимости хардкодить внутренние идентификаторы объектов информационной базы.