Как исключить конкретного сотрудника или объект из отчета СКД без ручного вмешательства

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

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

Способ 1. Условие непосредственно в тексте запроса

Это самый быстрый и очевидный метод, к которому в итоге пришел автор темы. Если нам заранее известно наименование или код объекта, который нужно исключить, мы можем прописать это условие в секции ГДЕ нашего запроса в схеме компоновки данных.

Рассмотрим пример, где нам нужно исключить транспортное средство с определенным госномером:


ВЫБРАТЬ
    СправочникТранспортныеСредства.Ссылка КАК ТС,
    СправочникТранспортныеСредства.Наименование КАК Наименование
ИЗ
    Справочник.ТранспортныеСредства КАК СправочникТранспортныеСредства
ГДЕ
    СправочникТранспортныеСредства.Наименование <> "B 096 EE 777 Mercedes-Benz GL 350 CDI 4MATIC"

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

Способ 2. Использование выражений в параметрах СКД

Более грамотным подходом будет вынесение фильтра в параметры компоновки. Это позволит нам не "зашивать" строку в запрос, а оперировать ссылочными данными. На вкладке "Параметры" схемы СКД можно создать параметр (например, ИсключаемыйСотрудник) и в колонке "Выражение" прописать код для поиска ссылки.

Разберем, как это выглядит на практике:

  1. Создадим параметр НежелательныйСотрудник.
  2. В поле "Выражение" укажем: Справочники.Сотрудники.НайтиПоНаименованию("Иванов Иван Иванович").
  3. В тексте запроса добавим условие: ГДЕ Ссылка <> &НежелательныйСотрудник.

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

Способ 3. Программная установка отбора в событии ПриКомпоновкеРезультата

Если логика исключения данных сложнее или зависит от условий запуска отчета, мы можем прибегнуть к программному изменению настроек. Это делается в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Рассмотрим пример кода, который добавляет отбор, если его еще нет в настройках:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    // Находим ссылку на объект, который хотим исключить
    СсылкаИсключения = Справочники.ТранспортныеСредства.НайтиПоНаименованию("B 096 EE 777 Mercedes-Benz GL 350 CDI 4MATIC");
    
    Если ЗначениеЗаполнено(СсылкаИсключения) Тогда
        УстановитьОтборСКД("ТС", ВидСравненияКомпоновкиДанных.НеРавно, СсылкаИсключения);
    КонецЕсли;

КонецПроцедуры

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

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

Решение проблемы с расшифровкой

Часто программисты сталкиваются с тем, что программная установка отборов "затирает" расшифровку (drill-down). Выясним причину: когда пользователь нажимает на ячейку отчета для детализации, система заново вызывает процедуру ПриКомпоновкеРезультата, но уже с другими настройками. Если в коде безусловно менять КомпоновщикНастроек.Настройки, расшифровка может перестать работать корректно.

Чтобы избежать этой проблемы, рекомендуется использовать Фиксированные настройки. Фиксированные настройки — это отдельный слой настроек, который накладывается поверх пользовательских и не изменяется ими. Разберем, как применить этот подход:


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

Использование ЗагрузитьФиксированныеНастройки — это наиболее профессиональный способ программного управления отборами. Он не конфликтует с механизмом расшифровки и надежно скрывает данные от пользователя, не загромождая основной интерфейс настроек отчета.

Лучшие практики и рекомендации

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

Подводя итог, мы рассмотрели различные варианты: от самого простого (условие в запросе) до самого надежного (фиксированные настройки). Для разовых задач подойдет фильтр в запросе, а для серьезных корпоративных отчетов лучше использовать ФиксированныеНастройки или дополнительные реквизиты в метаданных.

← На главную