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