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