Как правильно установить программный отбор по контрагенту в форме выбора справочника в обычных формах 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке и доработке конфигураций 1С на обычных формах (например, в «1С:Бухгалтерии предприятия 2.0») часто возникает задача открыть форму выбора подчиненного или связанного справочника с предварительно установленным фильтром. Типичный пример — выбор контактного лица только для конкретного контрагента, когда реквизит ОбъектВладелец имеет составной тип данных (например, СправочникСсылка.Контрагенты и СправочникСсылка.Пользователи).

Рассмотрим частые ошибки, возникающие при установке отбора, проанализируем причины некорректной работы кода и разберем правильные способы реализации фильтрации.

Анализ типичных ошибок при настройке отбора

Разберем основные ошибки, с которыми сталкиваются разработчики при программной передаче значений в объект Отбор формы выбора:

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

Способ 1. Явная настройка свойств элемента отбора через ПолучитьФорму

Рассмотрим классический способ настройки фильтра через получение объекта формы и обращение к элементам коллекции Отбор. В этом случае мы поэтапно настраиваем вид сравнения, значение и активность фильтра.

Посмотрим на пример реализации:


СтандартнаяОбработка = Ложь;

ФормаКЛ = Справочники.КонтактныеЛица.ПолучитьФорму("ФормаВыбора", ЭтаФорма);
ОтборКЛ = ФормаКЛ.Отбор;

ОтборКЛ.ОбъектВладелец.ВидСравнения = ВидСравнения.Равно;
ОтборКЛ.ОбъектВладелец.Значение = Контрагент;
ОтборКЛ.ОбъектВладелец.Использование = Истина;

ФормаКЛ.РежимВыбора = Истина;
РезультатВыбора = ФормаКЛ.ОткрытьМодально();

Разберем важные детали этого кода:

  1. Параметр Контрагент должен содержать ссылку типа СправочникСсылка.Контрагенты.
  2. Свойство Использование = Истина активирует применение отбора в динамическом списке справочника.
  3. Значение передается строго через свойство Значение соответствующего элемента отбора.

Способ 2. Использование универсального метода Установить()

Вместо последовательного заполнения свойств ВидСравнения, Значение и Использование безопаснее и компактнее использовать встроенный метод Установить(), доступный у объекта ЭлементОтбора.

Посмотрим на пример:


СтандартнаяОбработка = Ложь;

ФормаКЛ = Справочники.КонтактныеЛица.ПолучитьФорму("ФормаВыбора", ЭтаФорма);
ФормаКЛ.Отбор.ОбъектВладелец.Установить(Контрагент);

ФормаКЛ.РежимВыбора = Истина;
ФормаКЛ.Открыть();

Метод Установить(Значение, Использование) автоматически назначает вид сравнения ВидСравнения.Равно, присваивает переданное значение и выставляет признак Использование = Истина.

Способ 3. Открытие формы с передачей структуры отбора (без модальности)

Рассмотрим более лаконичный и современный подход, исключающий ручное получение формы и блокирующие модальные окна. Платформа 1С позволяет передать структуру отбора непосредственно в метод ОткрытьФорму.

Разберем по шагам:


СтандартнаяОбработка = Ложь;

СтруктураОтбора = Новый Структура("ОбъектВладелец", Контрагент);
ОткрытьФорму("Справочник.КонтактныеЛица.ФормаВыбора", СтруктураОтбора, Элемент);

При таком подходе платформа выполняет следующие действия:

  1. Автоматически накладывает отбор на реквизит ОбъектВладелец по переданному значению ссылки.
  2. Назначает переданный элемент управления (Элемент) владельцем формы выбора, благодаря чему выбранное значение автоматически возвращается в поле ввода без необходимости ручной обработки результата.

Дополнительные рекомендации по настройке отборов

Выясним важные нюансы, которые влияют на надежность и быстродействие системы:

  1. Запрет снятия отбора пользователем: Если требуется зафиксировать фильтр, чтобы пользователь не мог сбросить его через панель настройки списка, отключим доступность элемента отбора: ФормаКЛ.Отбор.ОбъектВладелец.Доступность = Ложь;
  2. Производительность составных типов: Поскольку реквизит ОбъектВладелец имеет составной тип данных, при большом объеме записей в базе данных скорость выборки может снижаться. Для ускорения поиска убедимся, что для данного реквизита в метаданных установлено свойство «Индексировать» (или «Индексировать с дополнительным упорядочиванием»).
  3. Обработка выбора: Если после интерактивного выбора требуется выполнить дополнительные вычисления в коде, укажем в качестве владельца саму форму (ЭтаФорма) и перехватим результат в стандартной процедуре-обработчике ОбработкаВыбора(ЗначениеВыбора, Источник).
← На главную