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