Нередко при настройке ограниченного доступа пользователей (механизм RLS) в типовых или доработанных конфигурациях, таких как 1С:ERP Управление предприятием или Комплексная автоматизация, возникает ситуация: в журнале регистрации фиксируется событие «Отказ в доступе» с перечислением регистров, хотя базовые роли на чтение этих объектов метаданных пользователю назначены. Разберем по шагам, почему платформа выбрасывает исключение и как правильно локализовать и устранить данную проблему.
Рассмотрим природу возникновения ошибки. Наличие галочки «Чтение» у роли в дереве метаданных конфигуратора подтверждает только доступ к самой таблице в целом. Однако если в информационной базе включен режим RLS, платформа проверяет ограничения на уровне отдельных записей по заданным разрезам: организациям, подразделениям, складам, группам партнеров.
Классический сценарий сбоя выглядит следующим образом:
НастройкаНСИ или аналогичная), которая разрешает чтение справочника Организации без ограничений RLS.РАЗРЕШЕННЫЕ после конструкции ВЫБРАТЬ.Проанализируем шаги, которые необходимо предпринять для точного поиска источника проблемы:
ГДЕ.Если запрос предназначен только для выборки тех данных, которые действительно доступны текущему пользователю, в обязательном порядке добавляем ключевое слово РАЗРЕШЕННЫЕ:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Регистр.Организация КАК Организация,
| Регистр.Сумма КАК Сумма
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Регистр
|ГДЕ
| Регистр.Организация В(&СписокОрганизаций)";
Запрос.УстановитьПараметр("СписокОрганизаций", МассивОрганизаций);
Результат = Запрос.Выполнить();
Ключевое слово РАЗРЕШЕННЫЕ указывает платформе отфильтровать строки, к которым у пользователя нет доступа, вместо аварийного завершения работы с ошибкой.
Если в коде необходимо передать в параметры запроса только разрешенные пользователю ссылки, используем метод глобального контекста ЗначениеРазрешено. Посмотрим на пример фильтрации списка организаций:
РазрешенныеОрганизации = Новый Массив;
Для Каждого ОрганизацияСсылка Из ИсходныйСписокОрганизаций Цикл
Если ЗначениеРазрешено(ОрганизацияСсылка) Тогда
РазрешенныеОрганизации.Добавить(ОрганизацияСсылка);
КонецЕсли;
КонецЦикла;
Этот подход гарантирует, что в дальнейшие алгоритмы и выборки не попадут элементы, запрещенные текущим профилем пользователя.
При выполнении общих регламентных процедур (например, проведение документов, фоновое отражение в учете, расчет себестоимости), алгоритм нередко должен обрабатывать всю совокупность данных вне зависимости от персональных прав конкретного оператора. В таком случае выполнение фрагмента кода переносится в привилегированный контекст:
УстановитьПривилегированныйРежим(Истина);
Попытка
// Выполнение алгоритма расчета или чтения служебных данных
ВыполнитьСлужебныйАлгоритм();
Исключение
УстановитьПривилегированныйРежим(Ложь);
ВызватьИсключение;
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
Также системные операции можно выносить в процедуры общих модулей, у которых в свойствах установлен признак Привилегированный.
Следует учитывать системные ограничения платформы 1С:
РАЗРЕШЕННЫЕ применяется только для чтения данных: при записи наборов записей регистров или проведении документов ключевое слово не действует. Если хотя бы одна строка движений не проходит по условию RLS, транзакция записи прерывается с ошибкой прав доступа.РАЗРЕШЕННЫЕ не компенсирует полное отсутствие права «Чтение» на объект метаданных у роли. Если у пользователя нет доступа к самому регистру, запрос упадет с ошибкой независимо от конструкции текста.РАЗРЕШЕННЫЕ.