Как программно ограничить список выбора параметра в отчете СКД без создания собственной формы

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

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

Анализ проблемы и выбор стратегии

Когда мы работаем в типовых конфигурациях (таких как УТ 11, ERP 2 или КА 2), отчеты обычно открываются в общей форме. Попытка просто установить значение параметра в компоновщике настроек внутри модуля отчета зачастую приводит к тому, что значение устанавливается, но при нажатии кнопки выбора пользователь все равно видит весь справочник целиком. Это происходит потому, что форма выбора справочника открывается стандартными средствами платформы, не зная о наших программных манипуляциях в модуле.

Проанализируем ситуацию: нам нужно «перехватить» момент формирования формы и передать ей инструкции по фильтрации. БСП предоставляет для этого специальные программные интерфейсы (хуки), которые позволяют внедрить логику в модуль объекта отчета, что часто требуется и при создании сводных отчетов для БСП 3.х. Разберем по шагам, как это реализовать.

Шаг 1. Регистрация обработчиков в модуле отчета

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


Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    // Указываем системе, что мы хотим обработать событие определения параметров выбора
    Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры

Здесь мы устанавливаем флаг ПриОпределенииПараметровВыбора в значение Истина. Это дает сигнал механизму БСП, что при попытке пользователя выбрать значение параметра нужно вызвать нашу специальную процедуру-обработчик.

Шаг 2. Реализация фильтрации через список значений

Теперь рассмотрим основной механизм ограничения. Нам понадобится процедура ПриОпределенииПараметровВыбора. Рассмотрим ситуацию, когда у нас есть готовый массив или список ссылок организаций, которые разрешены к выбору (похожий принцип применяется, когда требуется заполнение параметра отчета списком товаров из документа).


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

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

Шаг 3. Динамическая фильтрация формы выбора через запрос

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


Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
    
    ИмяПоля = Строка(СвойстваНастройки.ПолеКД);
    Если ИмяПоля = "ПараметрыДанных.Организации" Тогда
        
        // Определяем текст запроса для подбора
        ТекстЗапроса = 
        "ВЫБРАТЬ
        |    Организации.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Организации КАК Организации
        |ГДЕ
        |    НЕ Организации.ПометкаУдаления
        |    И НЕ Организации.Предопределенный"; // Условие для исключения технических элементов
        
        СвойстваНастройки.ЗапросЗначенийВыбора.Текст = ТекстЗапроса;
        
    КонецЕсли;
    
КонецПроцедуры

Этот метод хорош тем, что он сохраняет стандартный интерфейс выбора справочника, но «под капотом» ограничивает состав видимых данных. Через СвойстваНастройки.ЗапросЗначенийВыбора.Параметры вы также можете передавать любые параметры в этот запрос, расширяя стандартные возможности фильтрации, как это делают специализированные расширения для дополнительных отборов в БСП — для этого подойдёт расширение быстрых кнопок-фильтров для интерфейса 1С.

Дополнительные настройки для повышения надежности

Просто ограничить выбор в интерфейсе — это половина дела. Опытный пользователь или механизмы автоматического восстановления настроек могут подставить «запрещенное» значение. Разберем дополнительные меры предосторожности:

  1. Очистка истории выбора. Платформа 1С сохраняет последние выбранные элементы. Даже если вы ограничили список выбора, старые значения могут остаться в «быстром выборе». Чтобы этого избежать, в конфигураторе в свойствах поля или программно можно отключить историю выбора для данного параметра. Также для реализации сложных условий поиска можно использовать расширение «Подобно в списке» для отборов по шаблону — для этого подойдёт расширение интеллектуального поиска и подбора для 1С.
  2. Защита в ПриКомпоновкеРезультата. Это «последний рубеж». Даже если ограничение в форме было обойдено, мы можем принудительно отфильтровать данные перед самым формированием отчета. Проанализируем код в модуле отчета:

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

Нюанс с предопределенными параметрами СКД

Рассмотрим еще один важный момент, упомянутый в практике. Существует метод УстановитьДоступныеЗначения непосредственно в схеме компоновки. Его можно вызвать в процедуре ИнициализацияОтчета модуля объекта (если вы вызываете её сами) или прямо перед формированием.


ПараметрСхемы = СхемаКомпоновкиДанных.Parameters.Найти("Организация");
СписокОрганизаций = Новый СписокЗначений;
// Заполнение списка...
ПараметрСхемы.УстановитьДоступныеЗначения(СписокОрганизаций);

Этот метод воздействует непосредственно на метаданные схемы в памяти. Однако стоит помнить, что при использовании БСП и её механизмов кэширования форм, настройки, определенные через ОпределитьНастройкиФормы, являются более приоритетными и корректными с точки зрения архитектуры современных конфигураций.

Выводы и рекомендации

Мы проанализировали несколько способов ограничения списка выбора параметров в СКД. Подведем итоги нашей совместной работы:

  1. Если вы работаете в современной конфигурации, всегда используйте стандартные механизмы БСП (процедуры ОпределитьНастройкиФормы и ПриОпределенииПараметровВыбора). Это позволит вам не создавать лишних форм и сохранить типовой функционал.
  2. Для простых списков используйте РежимВыбораИзСписка. Это удобнее для пользователя, так как не открывает лишних окон.
  3. Для сложных условий фильтрации используйте подмену ЗапросаЗначенийВыбора.
  4. Всегда дублируйте проверку в процедуре ПриКомпоновкеРезультата, если отчет содержит конфиденциальные данные, к которым нельзя допускать пользователей даже случайно.

Используя эти методы, вы сделаете свои отчеты более профессиональными, защищенными и удобными для конечного пользователя.

← На главную