Как в СКД скрыть определенные строки, сохранив их суммы в общих итогах

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

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

В этой статье мы разберем несколько эффективных способов, как оставить данные в «памяти» отчета для корректного расчета итогов, но при этом убрать их из видимости в печатной форме.

Способ 1: Использование отбора на уровне группировки

Проанализируем самый правильный с точки зрения архитектуры СКД метод. В настройках компоновки данных существует иерархия отборов. Если мы устанавливаем отбор на самом верхнем уровне (вкладка Отбор основного варианта отчета), СКД фильтрует исходный набор записей. Но если мы применим отбор к конкретной группировке, результат будет иным.

Разберем по шагам, как это реализовать:

  1. Перейдем на закладку Настройки в схеме компоновки данных.
  2. В дереве настроек выберем ту группировку, которую нужно фильтровать (например, Детальные записи или группировку по Подразделению).
  3. В нижней части окна перейдем на вкладку Отбор (она относится именно к этой выбранной ветке).
  4. Установим условие, например: Подразделение Не равно "Секретный отдел".

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

Способ 2: Визуальное скрытие через условное оформление

Если по каким-то причинам первый способ не подходит (например, при сложной иерархии), мы можем воспользоваться механизмом условного оформления. Этот метод позволяет оставить строку в таблице, но сделать ее «невидимой» или максимально незаметной.

Рассмотрим алгоритм настройки:

  1. В настройках отчета перейдем на закладку Условное оформление.
  2. Добавим новый элемент оформления.
  3. В поле Оформление установим параметры:
    • Текст: установим пустую строку (пробел).
    • Максимальная высота: 0.1 или 1.
    • Цвет текста: выберем цвет, совпадающий с цветом фона (обычно белый).
  4. В поле Условие укажем наши критерии (например, Сотрудник В списке "СписокТехКогоНужноСкрыть").
  5. В поле Оформляемые поля выберем те колонки, данные в которых нужно спрятать (или все поля).

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

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

Этот способ требует более продвинутого владения языком выражений СКД. Если нам нужно вывести «честный» итог в отчете, на который наложены жесткие общие фильтры, мы можем переопределить расчет ресурса.

В окне редактирования ресурса (вкладка Ресурсы) для поля Зарплата в колонке Выражение мы можем написать следующую конструкцию:

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

Эта функция заставляет систему рассчитать сумму по всему набору данных, игнорируя текущие группировки и их фильтры. Таким образом, в строке итогов всегда будет полная сумма, даже если часть строк была отсечена общим отбором отчета.

Способ 4: Программная обработка в модуле отчета

Для максимально надежной защиты данных, когда важно, чтобы скрытая информация не попала в табличный документ даже в «невидимом» виде, используем программный метод. Мы перехватим процесс вывода отчета в процедуре ПриКомпоновкеРезультата.

Выясним причину выбора этого метода: он позволяет физически удалить строки из сформированного ТабличногоДокумента после того, как все итоги уже были рассчитаны и вписаны в ячейки.

Пример реализации в модуле отчета:


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

В данном примере мы используем свойство Видимость строк табличного документа. Суммы в итогах при этом остаются неизменными, так как они были сформированы ПроцессоромВывода ранее. При необходимости можно изучить примеры программного формирования отчетов и работы со сложными выражениями в СКД.

Резюме и рекомендации

Мы рассмотрели разные подходы к управлению видимостью данных в СКД. Подведем итоги:

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

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

← На главную