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