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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок в управляемом приложении 1С 8.3 часто возникает задача ограничить список выбираемых элементов в реквизите типа СправочникСсылка.ЗначенияСвойствОбъектов или любом другом справочнике. По умолчанию при нажатии на кнопку выбора открывается весь справочник целиком. Рассмотрим, как правильно наложить отбор на список выбора при открытии формы, не изменяя при этом типовые объекты конфигурации.

Причина возникновения задачи

Проанализируем типовую ситуацию: в форме отчета или обработки добавлено поле Источник со типом ссылки на справочник ЗначенияСвойствОбъектов. Данный справочник является подчиненным или имеет владельца (например, элемент плана видов характеристик ДополнительныеРеквизитыИСведения). Чтобы пользователь не выбирал лишние значения, при нажатии на кнопку выбора необходимо показать только те элементы, которые относятся к конкретному свойству (например, к характеристике «Источник (канал рекламного воздействия)»).

Решение с помощью обработки события НачалоВыбора и ОткрытьФорму

Разберем по шагам наиболее универсальный программный вариант, который работает в клиентском модуле формы без правки основной конфигурации. Нам потребуется перехватить событие НачалоВыбора для элемента формы, отменить стандартную обработку и открыть форму списка с нужными фиксированными настройками компоновки данных.

  1. Переходим в свойства элемента формы и создаем событие НачалоВыбора.
  2. В обработчике события устанавливаем свойство СтандартнаяОбработка = Ложь, чтобы предотвратить стандартное открытие формы выбора.
  3. Формируем объект НастройкиКомпоновкиДанных и добавляем в него элемент отбора по нужному полю.
  4. Передаем сформированные настройки в параметры открытия формы и вызываем метод ОткрытьФорму с установкой параметра РежимВыбора = Истина.

Рассмотрим пример кода на клиенте:


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

Важный момент: при вызове метода ОткрытьФорму для формы списка обязательно указывайте третий параметр (владелец формы, в данном случае Элементы.ИсточникХарактеристики) и передавайте параметр РежимВыбора = Истина. В противном случае двойной клик по строке в открывшемся окне откроет элемент на редактирование вместо подстановки значения в поле формы.

Альтернативные способы установки отбора в 1С

Выясним, какие еще способы фильтрации предоставляет платформа 1С:Предприятие 8.3:

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

Рекомендации по повышению производительности и надежности

Проанализируем возможные риски при использовании фильтров по строковым значениям:

В приведенном примере отбор выполняется по реквизиту Владелец.Заголовок со строковым значением. На практике рекомендуется устанавливать отбор непосредственно по ссылке на объект-владелец (например, по ссылке на элемент ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения). Это исключает ошибки при изменении наименования свойства и существенно ускоряет выполнение запросов к базе данных на стороне СУБД.

← На главную