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