Как ограничить список выбора для поля с типом "Список значений" в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки возникает задача ограничить пользователю выбор элементов в поле формы. Если мы имеем дело с обычным ссылочным полем, достаточно использовать режим выбора из списка и программно сформировать этот список. Однако, когда поле связано с реквизитом типа СписокЗначений, разработчики сталкиваются с тем, что стандартное свойство СписокВыбора просто не срабатывает. Разберем по шагам, почему возникает такое ограничение и как правильно решить данную задачу.

Выясним причину проблемы и ограничения платформы

Проанализируем ситуацию: сложность ограничения списка выбора для поля с типом СписокЗначений обусловлена тем, что данный реквизит является коллекцией, а не скалярным значением. Стандартные свойства элемента формы, такие как СписокВыбора и РежимВыбораИзСписка, изначально спроектированы платформой 1С для полей, хранящих одно конкретное значение (ссылку, строку или число).

Когда поле привязано к коллекции, платформа ожидает добавления новых элементов базового типа в эту коллекцию. Поэтому прямое назначение фиксированного списка выбора часто игнорируется механизмом формы. Кроме того, при превышении количества в 25 элементов стандартный выпадающий список (особенно если используются флажки множественного выбора) становится неэргономичным. Для корректной навигации и прокрутки большого массива данных платформа 1С подразумевает использование полноценных модальных или блокирующих окон — то есть отдельных форм выбора.

Решение 1: Настройка свойств элемента формы

Рассмотрим вариант, который позволяет настроить выбор прямо в выпадающем списке, не прибегая к открытию дополнительных окон. Этот метод отлично работает, если длина списка ограничена (до 25 элементов), тогда он полностью помещается на экран, и сохраняется привычное типовое поведение.

Для реализации необходимо программно включить расширенное редактирование и загрузить массив нужных значений непосредственно в СписокВыбора элемента формы. Посмотрим на пример кода:


Элементы.МенеджерыОтбор.РасширенноеРедактирование = Истина;
Элементы.МенеджерыОтбор.РасширенноеРедактированиеМножественныхЗначений = Истина;
Элементы.МенеджерыОтбор.СписокВыбора.ЗагрузитьЗначения(СтруктураОграничений.МассивПользователей);
Элементы.МенеджерыОтбор.РежимВыбораИзСписка = Истина;

В данном примере мы обращаемся к элементу формы МенеджерыОтбор, разрешаем ему расширенное редактирование множественных значений и загружаем заранее подготовленный массив (в нашем случае это МассивПользователей).

Альтернативные подходы и проверенные способы

Если элементов много или требуется более сложная бизнес-логика, проанализируем другие доступные варианты, которые позволяют решить задачу.

Настройка параметров выбора для ссылочных типов

Если внутри списка значений лежат элементы конкретного справочника или документа, правильнее ограничивать не выпадающий список самого поля, а накладывать отбор на базовый тип. Зайдем в палитру свойств элемента формы и настроим ПараметрыВыбора или СвязиПараметровВыбора. При попытке добавить значение в список, платформа автоматически применит заданные отборы к открывающемуся окну, и пользователь не сможет выбрать лишние данные.

Перехват события "НачалоВыбора"

Вместо настройки свойств формы перехватим интерактивные действия пользователя. В обработчике события НачалоВыбора необходимо установить параметр СтандартнаяОбработка = Ложь, чтобы отменить открытие типового окна. После этого вызовем метод ВыбратьИзСписка(), в который передадим нужный (ограниченный) список значений. Выбранное пользователем значение затем программно добавляется в реквизит-коллекцию.

Использование события "АвтоПодбор"

Разберем ситуацию, когда пользователь не нажимает кнопку выбора, а начинает вводить текст с клавиатуры прямо в поле. В этом случае событие начала выбора может не сработать. Для контроля выпадающих подсказок воспользуемся событием АвтоПодбор. В нем также установим СтандартнаяОбработка = Ложь, а в параметр ДанныеВыбора передадим заранее сформированный программно список значений или массив, соответствующий введенному тексту, но строго ограниченный нашей бизнес-логикой.

Глобальное ограничение через "ОбработкаПолученияДанныхВыбора"

Если ограничение нужно применять системно во всей конфигурации, задействуем модуль менеджера того объекта, элементы которого выбираются в список (например, конкретного справочника). В процедуре ОбработкаПолученияДанныхВыбора отключим стандартную обработку и поместим в ДанныеВыбора отфильтрованный список. Это гарантированно исключит попадание нежелательных элементов в любые списки и формы подбора.

Программное открытие формы с жестким отбором

Если доступных для выбора вариантов много, и они физически не помещаются в обычный выпадающий список (более 25 штук), в событии НачалоВыбора мы можем программно инициализировать форму выбора базового объекта. Используем для этого метод ПолучитьФорму(). До ее открытия на динамический список формы наложим программный отбор, а пользовательскую доступность изменения этого отбора отключим. После закрытия этой формы выбранные значения программно перенесем в наш список значений на основной форме. Существуют также готовые решения в БСП, например, общая форма ВводЗначенийСпискомСФлажками, которую можно использовать для множественного выбора с удобным интерфейсом.

← На главную