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