При разработке сложных управленческих отчетов, таких как «Доходы и расходы», стандартных итогов Системы компоновки данных (СКД) часто оказывается недостаточно. Возникают задачи, когда под основной строкой Итого необходимо вывести еще одну или несколько строк с дополнительными расчетами, например: «Итог без учета переоценки», «Чистая прибыль за вычетом налогов» или специфические коэффициенты рентабельности. Рассмотрим подробно несколько профессиональных способов реализации этой задачи, начиная от простых настроек макетов и заканчивая программным выводом.
Это наиболее распространенный и «чистый» способ с точки зрения архитектуры СКД. Он позволяет переопределить визуальное представление итоговой строки, не вмешиваясь в логику компоновки данных. Разберем этот процесс по шагам:
СуммаОборот.ДопИтог.Чтобы рассчитать значение для параметра ДопИтог, мы можем использовать выражения в настройках макета. Если формула сложная, рекомендуется заранее подготовить расчетное поле в наборе данных или использовать вычисляемое поле.
Если нам нужно добавить строку в самый низ всей таблицы, независимо от иерархии группировок, целесообразно использовать макет с типом Подвал таблицы. Проанализируем этот метод:
Макет подвала таблицы позволяет рисовать произвольную область, которая будет выведена один раз после завершения вывода всей основной части отчета. В отличие от макета группировки, подвал таблицы не привязан к конкретному уровню данных, что дает больше свободы в оформлении (объединение ячеек, использование специфических шрифтов и рамок).
Важно помнить: чтобы значения в таком подвале были актуальными, необходимо в параметрах макета прописать выражения, обращающиеся к общим итогам ресурсов. Например, если нам нужно вывести разницу между двумя ресурсами, в поле выражения макета можно написать СуммаДоходы - СуммаРасходы.
Рассмотрим «хитрый» прием, который позволяет избежать сложного рисования макетов, если требуется просто добавить еще одну строку с данными под итогами. Этот метод заключается в добавлении в структуру отчета фиктивной группировки.
Иногда задача заключается не просто в добавлении строки, а в сложном расчете, который зависит от итогов других уровней. В СКД для этих целей предусмотрена мощная функция ВычислитьВыражение(). Рассмотрим пример её использования в вычисляемых полях:
Допустим, нам нужно поле, которое выводит процент прибыли относительно выручки только в строке общего итога. Мы создаем вычисляемое поле ПроцентРентабельности и в выражении ресурса для этого поля пишем следующее:
ВычислитьВыражение("Сумма(Прибыль) / Сумма(Выручка) * 100", "", "ОбщийИтог")
Здесь третий параметр "ОбщийИтог" указывает системе, что расчет должен производиться в контексте всей таблицы. Сочетая такие поля с макетами, можно выводить любые производные данные в дополнительных строках.
Выясним, как поступить, если типовых настроек компоновки не хватает для реализации сложной логики. В этом случае мы прибегаем к перехвату события ПриКомпоновкеРезультата в модуле отчета. Проанализируем примерный алгоритм действий:
КомпоновщикМакетаКомпоновкиДанных и ПроцессорКомпоновкиДанных.ТабличныйДокумент с помощью ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений или напрямую в документ.Вывести() отработал, мы программно находим нужную область в полученном табличном документе (например, через поиск текста «Итого») и добавляем строку снизу.Пример программного кода для добавления строки в конец документа:
// Получаем область из макета (заранее созданного в объекте Отчет)
ОбластьДопИтог = ПолучитьМакет("МакетДопСтроки").ПолучитьОбласть("Строка");
// Заполняем параметры
ОбластьДопИтог.Параметры.Значение = МойРасчетныйКоэффициент;
// Присоединяем к результату
Результат.Вывести(ОбластьДопИтог);
Посмотрим на ситуацию со стороны данных. Мы можем подготовить «почву» для дополнительной строки еще на этапе выполнения запроса. Для этого используется конструкция ОБЪЕДИНИТЬ ВСЕ.
В первом запросе мы выбираем основные данные. Во втором запросе мы выбираем те же поля, но вместо детальных данных подставляем агрегаты или специфические расчеты, помечая эти записи специальным флагом (например, поле ТипСтроки = 2). В настройках СКД мы группируем данные так, чтобы записи с ТипСтроки = 2 выводились в самом конце. Далее, используя условное оформление по фильтру ТипСтроки = 2, мы красим эту строку в нужный цвет, имитируя итог.
Важный нюанс при работе с кросс-таблицами: Если ваш отчет является таблицей с группировкой по колонкам, использование фиксированных макетов может быть затруднено, так как количество колонок динамически меняется. В этом случае рекомендуется использовать макеты типа Заголовок группировки или Подвал группировки для горизонтальных группировок, чтобы дополнительные итоги корректно растягивались вместе с колонками.
Подводя итог, выбор метода зависит от сложности вашей формулы и требований к оформлению. Для простых случаев идеально подходит Макет группировки, а для сложных нестандартных расчетов лучше использовать Программный вывод или Вычисляемые поля с функциями агрегации по общему итогу.