При разработке отчетов и обработок в управляемом приложении 1С 8.3 часто возникает задача ограничить список выбираемых элементов в реквизите типа СправочникСсылка.ЗначенияСвойствОбъектов или любом другом справочнике. По умолчанию при нажатии на кнопку выбора открывается весь справочник целиком. Рассмотрим, как правильно наложить отбор на список выбора при открытии формы, не изменяя при этом типовые объекты конфигурации.
Проанализируем типовую ситуацию: в форме отчета или обработки добавлено поле Источник со типом ссылки на справочник ЗначенияСвойствОбъектов. Данный справочник является подчиненным или имеет владельца (например, элемент плана видов характеристик ДополнительныеРеквизитыИСведения). Чтобы пользователь не выбирал лишние значения, при нажатии на кнопку выбора необходимо показать только те элементы, которые относятся к конкретному свойству (например, к характеристике «Источник (канал рекламного воздействия)»).
Разберем по шагам наиболее универсальный программный вариант, который работает в клиентском модуле формы без правки основной конфигурации. Нам потребуется перехватить событие НачалоВыбора для элемента формы, отменить стандартную обработку и открыть форму списка с нужными фиксированными настройками компоновки данных.
НачалоВыбора.СтандартнаяОбработка = Ложь, чтобы предотвратить стандартное открытие формы выбора.НастройкиКомпоновкиДанных и добавляем в него элемент отбора по нужному полю.ОткрытьФорму с установкой параметра РежимВыбора = Истина.Рассмотрим пример кода на клиенте:
&НаКлиенте
Процедура ИсточникХарактеристикиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Создаем настройки компоновки данных для отбора
Настройки = Новый НастройкиКомпоновкиДанных;
ОтборЭлемент = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемент.Использование = Истина;
ОтборЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец.Заголовок");
ОтборЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемент.ПравоеЗначение = "Источник (канал рекламного воздействия)";
ОтборЭлемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
// Передаем настройки и режим выбора в параметры открываемой формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
ПараметрыФормы.Вставить("РежимВыбора", Истина);
// Открываем форму списка с привязкой к элементу формы
ОткрытьФорму("Справочник.ЗначенияСвойствОбъектов.ФормаСписка", ПараметрыФормы, Элементы.ИсточникХарактеристики);
КонецПроцедуры
Важный момент: при вызове метода ОткрытьФорму для формы списка обязательно указывайте третий параметр (владелец формы, в данном случае Элементы.ИсточникХарактеристики) и передавайте параметр РежимВыбора = Истина. В противном случае двойной клик по строке в открывшемся окне откроет элемент на редактирование вместо подстановки значения в поле формы.
Выясним, какие еще способы фильтрации предоставляет платформа 1С:Предприятие 8.3:
НастройкиКомпоновкиДанных достаточно передать структуру Отбор:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", СсылкаНаВладельца));
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.ЗначенияСвойствОбъектов.ФормаВыбора", ПараметрыФормы, Элементы.Источник);
ПриСозданииНаСервере можно зафиксировать коллекцию ПараметрыВыбора. Преимущество этого метода в том, что отбор будет работать не только при открытии списка по кнопке выбора, но и при автоподборе (вводе текста по строке).Проанализируем возможные риски при использовании фильтров по строковым значениям:
В приведенном примере отбор выполняется по реквизиту Владелец.Заголовок со строковым значением. На практике рекомендуется устанавливать отбор непосредственно по ссылке на объект-владелец (например, по ссылке на элемент ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения). Это исключает ошибки при изменении наименования свойства и существенно ускоряет выполнение запросов к базе данных на стороне СУБД.