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