В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача ограничить пользователю возможность выбора определенных элементов в параметрах отчета. Например, в справочнике Организации могут существовать служебные или закрытые записи, которые не должны фигурировать в конкретном отчете. Если отчет имеет собственную форму, задача решается просто, но как быть, если используется стандартная форма из состава БСП (Библиотеки Стандартных Подсистем), а создавать свою форму нецелесообразно? Рассмотрим, как решить эту задачу изящно и профессионально.
Когда мы работаем в типовых конфигурациях (таких как УТ 11, ERP 2 или КА 2), отчеты обычно открываются в общей форме. Попытка просто установить значение параметра в компоновщике настроек внутри модуля отчета зачастую приводит к тому, что значение устанавливается, но при нажатии кнопки выбора пользователь все равно видит весь справочник целиком. Это происходит потому, что форма выбора справочника открывается стандартными средствами платформы, не зная о наших программных манипуляциях в модуле.
Проанализируем ситуацию: нам нужно «перехватить» момент формирования формы и передать ей инструкции по фильтрации. БСП предоставляет для этого специальные программные интерфейсы (хуки), которые позволяют внедрить логику в модуль объекта отчета, что часто требуется и при создании сводных отчетов для БСП 3.х. Разберем по шагам, как это реализовать.
Для начала нам нужно сообщить системе, что наш отчет хочет самостоятельно управлять параметрами выбора. Для этого в модуле объекта отчета необходимо создать экспортную процедуру ОпределитьНастройкиФормы. Эта процедура вызывается общей формой отчета при создании.
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
// Указываем системе, что мы хотим обработать событие определения параметров выбора
Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры
Здесь мы устанавливаем флаг ПриОпределенииПараметровВыбора в значение Истина. Это дает сигнал механизму БСП, что при попытке пользователя выбрать значение параметра нужно вызвать нашу специальную процедуру-обработчик.
Теперь рассмотрим основной механизм ограничения. Нам понадобится процедура ПриОпределенииПараметровВыбора. Рассмотрим ситуацию, когда у нас есть готовый массив или список ссылок организаций, которые разрешены к выбору (похожий принцип применяется, когда требуется заполнение параметра отчета списком товаров из документа).
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
// Проверяем, что обработка идет именно для нашего параметра "Организации"
ИмяПоля = Строка(СвойстваНастройки.ПолеКД);
Если ИмяПоля = "ПараметрыДанных.Организации" Тогда
// Формируем список только разрешенных организаций
СписокДоступных = Новый СписокЗначений;
// Здесь может быть ваш алгоритм получения ссылок
// СписокДоступных.Добавить(СсылкаНаНужнуюОрганизацию);
// Устанавливаем свойства настройки выбора
СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
СвойстваНастройки.ЗначенияДляВыбора = СписокДоступных;
КонецЕсли;
КонецПроцедуры
В этом примере мы используем свойство ОграничиватьВыборУказаннымиЗначениями. При такой настройке пользователь вместо полноценного окна справочника увидит компактный выпадающий список, содержащий только те элементы, которые мы добавили в СписокДоступных. Это максимально жесткое и надежное ограничение.
Иногда список разрешенных элементов слишком велик или должен определяться динамически сложным запросом. В таких случаях удобнее не передавать готовый список, а подменить текст запроса, который сама форма выбора использует для получения данных. Подобные манипуляции с объектами системы компоновки часто встречаются, когда реализуется динамическое добавление полей и ресурсов в отчет на СКД. Посмотрим, как применить этот метод:
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
ИмяПоля = Строка(СвойстваНастройки.ПолеКД);
Если ИмяПоля = "ПараметрыДанных.Организации" Тогда
// Определяем текст запроса для подбора
ТекстЗапроса =
"ВЫБРАТЬ
| Организации.Ссылка КАК Ссылка
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| НЕ Организации.ПометкаУдаления
| И НЕ Организации.Предопределенный"; // Условие для исключения технических элементов
СвойстваНастройки.ЗапросЗначенийВыбора.Текст = ТекстЗапроса;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он сохраняет стандартный интерфейс выбора справочника, но «под капотом» ограничивает состав видимых данных. Через СвойстваНастройки.ЗапросЗначенийВыбора.Параметры вы также можете передавать любые параметры в этот запрос, расширяя стандартные возможности фильтрации, как это делают специализированные расширения для дополнительных отборов в БСП — для этого подойдёт расширение быстрых кнопок-фильтров для интерфейса 1С.
Просто ограничить выбор в интерфейсе — это половина дела. Опытный пользователь или механизмы автоматического восстановления настроек могут подставить «запрещенное» значение. Разберем дополнительные меры предосторожности:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем текущее значение параметра из настроек компоновщика
ПараметрОрганизации = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Организации");
Если ПараметрОрганизации <> Неопределено И ПараметрОрганизации.Использование Тогда
// Проверяем выбранные значения на соответствие нашим правилам
// Если найдено запрещенное значение - выбрасываем исключение или очищаем его
КонецЕсли;
КонецПроцедуры
Рассмотрим еще один важный момент, упомянутый в практике. Существует метод УстановитьДоступныеЗначения непосредственно в схеме компоновки. Его можно вызвать в процедуре ИнициализацияОтчета модуля объекта (если вы вызываете её сами) или прямо перед формированием.
ПараметрСхемы = СхемаКомпоновкиДанных.Parameters.Найти("Организация");
СписокОрганизаций = Новый СписокЗначений;
// Заполнение списка...
ПараметрСхемы.УстановитьДоступныеЗначения(СписокОрганизаций);
Этот метод воздействует непосредственно на метаданные схемы в памяти. Однако стоит помнить, что при использовании БСП и её механизмов кэширования форм, настройки, определенные через ОпределитьНастройкиФормы, являются более приоритетными и корректными с точки зрения архитектуры современных конфигураций.
Мы проанализировали несколько способов ограничения списка выбора параметров в СКД. Подведем итоги нашей совместной работы:
ОпределитьНастройкиФормы и ПриОпределенииПараметровВыбора). Это позволит вам не создавать лишних форм и сохранить типовой функционал.РежимВыбораИзСписка. Это удобнее для пользователя, так как не открывает лишних окон.ЗапросаЗначенийВыбора.ПриКомпоновкеРезультата, если отчет содержит конфиденциальные данные, к которым нельзя допускать пользователей даже случайно.Используя эти методы, вы сделаете свои отчеты более профессиональными, защищенными и удобными для конечного пользователя.