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

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

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

Способ 1. Использование режима выбора из списка и программное заполнение

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

Разберем последовательность действий:

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

Рассмотрим пример кода, в котором проверяется роль пользователя и формируется ограниченный список элементов перечисления:


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

КонецПроцедуры

Для предотвращения попытки пользователя ввести произвольное значение с клавиатуры рекомендуется также установить свойство ЗапретВводаНесвободногоТекста = Истина у элемента формы.

Способ 2. Централизованное ограничение через модуль менеджера перечисления

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

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


// Модуль менеджера перечисления ВариантыSMTPАутентификации
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Отключаем стандартную обработку
    СтандартнаяОбработка = Ложь;
    
    СписокРазрешенных = Новый СписокЗначений;
    
    Если ПравоДоступа("Администрирование", Метаданные) Тогда
        СписокРазрешенных.Добавить(Перечисления.ВариантыSMTPАутентификации.БезАутентификации);
        СписокРазрешенных.Добавить(Перечисления.ВариантыSMTPАутентификации.АналогичноPOP3);
    Иначе
        СписокРазрешенных.Добавить(Перечисления.ВариантыSMTPАутентификации.АналогичноPOP3);
    КонецЕсли;
    
    ДанныеВыбора = СписокРазрешенных;

КонецПроцедуры

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

Посмотрим на ещё один вариант динамической подмены значений — перехват события НачалоВыбора поля ввода. Он пригодится, если логика формирования списка зависит от других реквизитов формы, заполненных на клиенте.


&НаКлиенте
Процедура ВариантАутентификацииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    СписокВариантов = Новый СписокЗначений;
    СписокВариантов.Добавить(ПредопределенноеЗначение("Перечисление.ВариантыSMTPАутентификации.АналогичноPOP3"));
    
    // Вызываем асинхронный диалог выбора из списка
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект);
    ПоказатьВыборИзСписка(Оповещение, СписокВариантов, Элемент);

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) ВызовСервера
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Объект.ВариантАутентификации = ВыбранныйЭлемент.Значение;
    КонецЕсли;
КонецПроцедуры

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

При реализации ограничения выбора перечислений в 1С необходимо учитывать важные особенности платформы:

← На главную