При работе в конфигурации 1С:Управление производственным предприятием (УПП) 1.3 часто возникает задача: ограничить пользователю видимость справочника СпецификацииНоменклатуры, чтобы он не мог их просматривать в общем списке или редактировать, но при этом обеспечить корректную работу отчетов, которые используют данные этих спецификаций. Рассмотрим, почему стандартное добавление роли "Только чтение" не работает и как решить эту задачу правильно.
Первым делом проанализируем ситуацию, с которой столкнулся автор темы. Пользователю добавили роль с правом Чтение, надеясь, что это позволит отчету видеть данные, а RLS (Record Level Security) по-прежнему будет ограничивать доступ. Однако результат оказался противоположным: пользователь получил полные права на справочник. Почему так происходит?
В системе 1С:Предприятие права доступа работают по принципу аддитивности (суммирования): разрешено все, что разрешено хотя бы одной ролью. Разберем механизм по шагам:
Изменение и Редактирование, но они ограничены шаблоном RLS. Этот RLS настроен так, что пользователь не видит ни одной записи (пустое условие).Важный вывод: Если вы используете RLS, любая новая роль на тот же объект должна содержать аналогичные или более строгие условия ограничения доступа, иначе вы рискуете полностью "обнулить" защиту.
Для того чтобы отчет мог получать данные из спецификаций, к которым у пользователя нет прямого доступа, мы должны использовать привилегированный режим. Этот режим позволяет временно отключить проверку прав (включая RLS) на время выполнения программного кода на сервере.
Разберем, как это реализовать. Если ваш отчет написан на базе Системы компоновки данных (СКД), стандартный механизм формирования может не сработать, если выполнение происходит в контексте прав пользователя. Нам нужно вынести получение данных в отдельный серверный модуль.
Пример кода для программного формирования отчета в привилегированном режиме:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Включаем привилегированный режим для получения данных из спецификаций
УстановитьПривилегированныйРежим(Истина);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Отключаем режим после завершения формирования
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Этот метод гарантирует, что отчет соберет все данные, при этом в интерфейсе (в списках справочника или формах выбора) пользователь по-прежнему ничего не увидит.
В платформе 1С существуют два фундаментально разных права, которые часто путают. Рассмотрим их подробнее:
Чтобы пользователь мог формировать отчеты, но не "лазил" в справочник, проанализируем настройки ролей. Вы можете создать роль, в которой для справочника СпецификацииНоменклатуры установлено право Чтение, но снята галочка Просмотр. В этом случае:
Однако помните: если на объекте включен RLS, то право Чтение все равно будет фильтровать записи. Поэтому данный метод эффективен только тогда, когда вам нужно скрыть объект целиком из интерфейса, а не ограничивать конкретные строки данных.
В конфигурации УПП 1.3 механизм RLS встроен в саму архитектуру на уровне типовых шаблонов. Если вы решите настраивать RLS вручную в Конфигураторе, проанализируйте существующие группы доступа пользователей. В УПП права часто зависят от настроек в регистре сведений НастройкаПравДоступаПользователей.
Если вы добавляете новую роль для чтения, обязательно используйте стандартные шаблоны RLS, которые уже есть в конфигурации (например, шаблон #ПоЗначениям). Это позволит новой роли "вписаться" в общую систему безопасности предприятия, управляемую из режима "Предприятие".
Посмотрим на итоговый алгоритм действий для решения задачи:
УстановитьПривилегированныйРежим(Истина), возвращая результат в виде таблицы значений.Таким образом, мы обеспечим баланс между безопасностью данных и функциональностью системы, не нарушая логику работы прав доступа 1С.