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