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

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

В процессе разработки часто возникает задача: необходимо сделать поле с перечислением доступным для всех, но право устанавливать специфические статусы (например, «Согласовано» или «Не согласовано») ограничить только для пользователей с определенной ролью. Давайте разберем, как реализовать такую логику наиболее эффективно и грамотно.

Этап 1: Ограничение доступа на уровне интерфейса (Форма)

Первое, что видит пользователь — это форма документа. Чтобы предотвратить выбор «запрещенного» статуса еще до нажатия кнопки записи, необходимо поработать с событием ПриОткрытии формы или ПриИзменении поля статуса.

Мы будем использовать встроенный метод РольДоступна(). Этот метод позволяет проверить, назначена ли текущему пользователю определенная роль. Давайте рассмотрим, как это реализовать на практике:


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

Использование метода СписокВыбора позволяет динамически очищать или заполнять варианты в поле ввода в зависимости от прав текущего пользователя. Это создает удобный интерфейс: пользователь просто не увидит недоступные ему пункты.

Этап 2: Обеспечение безопасности на уровне данных

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

Рекомендуем использовать проверку в модуле объекта в событии ПередЗаписью:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если Статус = Перечисления.Статусы.Согласовано Тогда
        Если Не РольДоступна("МенеджерПоСогласованию") Тогда
            ВызватьИсключение "У вас недостаточно прав для установки статуса 'Согласовано'.";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Этот код гарантирует, что даже если пользователь попытается обойти интерфейсные ограничения, 1С заблокирует запись объекта, если у пользователя нет соответствующей роли.

Этап 3: Архитектурный подход и лучшие практики

При решении подобных задач мы рекомендуем придерживаться следующих принципов:

  1. Не создавайте лишние роли. Если у вас уже есть профили пользователей, используйте существующие роли. Если логика согласования требует выделения полномочий, создайте одну качественную роль, например, ОтветственныйЗаСогласование.
  2. Используйте функциональные опции. Для крупных систем лучше связать доступность статусов с ФункциональнымиОпциями. Это позволит включать или выключать возможность согласования через настройки системы без изменения кода.
  3. Разделяйте логику. Проверка РольДоступна() на форме нужна для удобства (UX), а проверка в модуле объекта — для безопасности (Data integrity). Используйте оба этих метода для достижения максимального результата.

Рассмотренный подход позволяет гибко управлять доступом к критически важным данным документа, не перегружая систему сложными настройками доступа на уровне записей (RLS), если в этом нет острой необходимости. Пробуйте, внедряйте и не забывайте тестировать систему под пользователями с разными наборами прав!

← На главную