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