Нередко при настройке механизма ограничения прав на уровне записей (RLS) разработчики сталкиваются с ситуацией, когда при попытке провести документ платформа 1С аварийно прерывает операцию с системным сообщением: «У пользователя недостаточно прав для исполнения операции над базой данных». При этом точка останова в процедуре ОбработкаПроведения модуля документа даже не срабатывает, а стандартные подписки на событие перед записью отрабатывают без видимых исключений. Выясним причину такого поведения платформы и разберем по шагам, как локализовать и устранить эту проблему.
Транзакция проведения документа в платформе 1С включает в себя целый ряд неявных действий, выполняемых до непосредственного исполнения кода обработчика проведения:
Проведен, что инициирует проверку прав на изменение документа в соответствии с ограничениями RLS.ПередЗаписью и ПриЗаписи. Во многих конфигурациях (например, УТ 10.3, УПП 1.3, комплексных системах) к этим событиям привязаны служебные подсистемы регистрации прав и ключей доступа.Когда отладчик не останавливается на строке с ошибкой из-за скрытых исключений или неявных действий платформы, самым быстрым и надежным инструментом диагностики становится системный журнал. Разберем порядок действий:
Главное меню -> Все функции / Функции для технического специалиста -> Стандартные -> Журнал регистрации)._$Access$_.AccessDenied).В типовых решениях предыдущих поколений (таких как УТ 10.3) в тексте события чаще всего фигурирует служебный регистр: Регистр сведений. Объекты доступа документов со статусом транзакции Отменена.
Рассмотрим, почему подписки ПередЗаписьюДокументаРегистрацияОбъектовДоступа и ПриЗаписиДокументаРегистрацияОбъектовДоступа могут визуально выполняться без ошибок в отладчике, но приводить к отмене транзакции. Если внутри подписки запись служебного набора обернута в блок Попытка ... Исключение, ошибка прав перехватывается, однако статус текущей транзакции базы данных уже помечается как аварийный. При выходе из процедуры любая попытка платформы зафиксировать данные приводит к аварийному откату.
Для точной остановки в месте возникновения скрытого исключения настроим конфигуратор:
Отладка -> Остановка по ошибке.Теперь отладчик прервет выполнение ровно на той строке, где инициируется отказ в доступе к регистру сведений.
Разберем три основных способа исправления проблемы в зависимости от архитектуры вашей доработки.
Способ 1. Использование привилегированного режима
Служебные механизмы платформы не должны зависеть от персональных ограничений RLS конечного пользователя. Обработка регистрации объектов доступа должна производиться с полными правами. Проверим свойства общего модуля, в котором объявлены обработчики подписок:
УстановитьПривилегированныйРежим(Истина);
НаборЗаписей.Записать();
УстановитьПривилегированныйРежим(Ложь);
Способ 2. Корректировка роли пользователя
Если архитектура конфигурации предполагает работу подсистемы безопасности в пользовательском контексте, необходимо явно предоставить права роли на служебные объекты:
ОбъектыДоступаДокументов и установим для него права «Чтение» и «Изменение». При этом на данный регистр не должно быть наложено никаких ограничивающих условий в секции RLS.
##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
ГДЕ (ТекущаяТаблица.Ответственный = &ТекущийПользователь
ИЛИ ТекущаяТаблица.#Параметр(1) В
(ВЫБРАТЬ ПользователиПодразделенияПользователя.ПодразделениеПользователя
ИЗ Справочник.Пользователи.ПодразделенияПользователя КАК ПользователиПодразделенияПользователя
ГДЕ ПользователиПодразделенияПользователя.Ссылка = &ТекущийПользователь))
##КонецЕсли
Для корректного вычисления такого шаблона у пользователя обязательно должно присутствовать базовое право «Чтение» на справочник Пользователи и его табличную часть ПодразделенияПользователя. В противном случае обращение к подзапросу RLS будет заблокировано платформой.
Способ 3. Проверка регистров движений документа
Если регистр ОбъектыДоступаДокументов настроен верно, но ошибка сохраняется, проанализируем состав движений документа: