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