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