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