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