Как ограничить доступ к спецификациям в интерфейсе, сохранив возможность их использования в отчетах

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При работе в конфигурации 1С:Управление производственным предприятием (УПП) 1.3 часто возникает задача: ограничить пользователю видимость справочника СпецификацииНоменклатуры, чтобы он не мог их просматривать в общем списке или редактировать, но при этом обеспечить корректную работу отчетов, которые используют данные этих спецификаций. Рассмотрим, почему стандартное добавление роли "Только чтение" не работает и как решить эту задачу правильно.

Проблема аддитивности прав доступа в 1С

Первым делом проанализируем ситуацию, с которой столкнулся автор темы. Пользователю добавили роль с правом Чтение, надеясь, что это позволит отчету видеть данные, а RLS (Record Level Security) по-прежнему будет ограничивать доступ. Однако результат оказался противоположным: пользователь получил полные права на справочник. Почему так происходит?

В системе 1С:Предприятие права доступа работают по принципу аддитивности (суммирования): разрешено все, что разрешено хотя бы одной ролью. Разберем механизм по шагам:

  1. У пользователя есть основная роль (например, "Менеджер"), где на справочник спецификаций установлены права на Изменение и Редактирование, но они ограничены шаблоном RLS. Этот RLS настроен так, что пользователь не видит ни одной записи (пустое условие).
  2. Вы создаете новую роль "Только чтение" и не прописываете в ней условия RLS.
  3. Система суммирует права: роль 1 дает "Изменение", а роль 2 дает "Чтение" без ограничений. Поскольку чтение теперь разрешено для всех записей без условий RLS, система "открывает" записи и для редактирования, так как право на изменение у пользователя уже было в первой роли, а барьер в виде RLS на чтение был снят новой ролью.

Важный вывод: Если вы используете RLS, любая новая роль на тот же объект должна содержать аналогичные или более строгие условия ограничения доступа, иначе вы рискуете полностью "обнулить" защиту.

Решение №1: Привилегированный режим — самый надежный способ

Для того чтобы отчет мог получать данные из спецификаций, к которым у пользователя нет прямого доступа, мы должны использовать привилегированный режим. Этот режим позволяет временно отключить проверку прав (включая RLS) на время выполнения программного кода на сервере.

Разберем, как это реализовать. Если ваш отчет написан на базе Системы компоновки данных (СКД), стандартный механизм формирования может не сработать, если выполнение происходит в контексте прав пользователя. Нам нужно вынести получение данных в отдельный серверный модуль.

Пример кода для программного формирования отчета в привилегированном режиме:


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

Этот метод гарантирует, что отчет соберет все данные, при этом в интерфейсе (в списках справочника или формах выбора) пользователь по-прежнему ничего не увидит.

Решение №2: Разделение прав "Чтение" и "Просмотр"

В платформе 1С существуют два фундаментально разных права, которые часто путают. Рассмотрим их подробнее:

Чтобы пользователь мог формировать отчеты, но не "лазил" в справочник, проанализируем настройки ролей. Вы можете создать роль, в которой для справочника СпецификацииНоменклатуры установлено право Чтение, но снята галочка Просмотр. В этом случае:

  1. Справочник исчезнет из интерфейса (его нельзя будет найти через меню "Все функции" или через разделы учета).
  2. Пользователь не сможет выбрать спецификацию в документах.
  3. Запрос в отчете успешно получит данные, так как право на программное чтение имеется.

Однако помните: если на объекте включен RLS, то право Чтение все равно будет фильтровать записи. Поэтому данный метод эффективен только тогда, когда вам нужно скрыть объект целиком из интерфейса, а не ограничивать конкретные строки данных.

Особенности настройки RLS в УПП 1.3

В конфигурации УПП 1.3 механизм RLS встроен в саму архитектуру на уровне типовых шаблонов. Если вы решите настраивать RLS вручную в Конфигураторе, проанализируйте существующие группы доступа пользователей. В УПП права часто зависят от настроек в регистре сведений НастройкаПравДоступаПользователей.

Если вы добавляете новую роль для чтения, обязательно используйте стандартные шаблоны RLS, которые уже есть в конфигурации (например, шаблон #ПоЗначениям). Это позволит новой роли "вписаться" в общую систему безопасности предприятия, управляемую из режима "Предприятие".

Резюме и рекомендации

Посмотрим на итоговый алгоритм действий для решения задачи:

  1. Не добавляйте новые роли без RLS, если на объекте уже настроены ограничения в других ролях — это приведет к открытию лишних прав на редактирование.
  2. Проверьте, достаточно ли просто разделить права Чтение и Просмотр. Если нужно скрыть справочник только из визуального интерфейса — это самый простой путь.
  3. Если RLS должен скрывать данные везде, кроме конкретного отчета, используйте привилегированный режим в коде формирования отчета.
  4. При использовании СКД для обхода RLS лучше всего выносить запрос в отдельную функцию серверного модуля с заголовком УстановитьПривилегированныйРежим(Истина), возвращая результат в виде таблицы значений.

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

← На главную