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