При разработке конфигураций на базе Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с ситуацией, когда новая роль, созданная для пользователя, не позволяет даже запустить программу. Система выдает критическую ошибку «Нарушение прав доступа» еще на этапе инициализации параметров сеанса. Рассмотрим подробнее, почему это происходит, и разберем по шагам, как правильно настроить права доступа, чтобы избежать подобных сбоев.
Проанализируем ситуацию, исходя из сообщения об ошибке. Сбой происходит в процедуре ДобавитьПараметрыРаботыКлиентаПриЗапуске общего модуля СтандартныеПодсистемыСервер. Если мы посмотрим на стек вызовов, то увидим, что проблема возникает в момент обращения к методу МенеджерХранилища.Загрузить. Это сигнализирует о том, что системе не удается прочитать настройки пользователя или глобальные параметры из хранилища настроек.
Выясним причину: БСП при старте пытается определить параметры интерфейса, настройки завершения работы и доступность различных подсистем (например, «Оценка производительности»). Для этого ей требуется доступ к системным объектам метаданных, которые не всегда включены в «самописную» роль.
В БСП предусмотрены специальные роли, которые содержат минимально необходимый набор прав для запуска и работы в управляемом приложении. Прежде чем создавать свои уникальные права, убедимся, что у пользователя назначены следующие роли:
ХранилищеОбщихНастроек не позволит записывать и читать данные.Часто в конфигурациях, значительно переработанных на базе БСП, используется собственное (кастомное) хранилище настроек. Если в свойствах конфигурации в качестве основного хранилища выбрано ваше добавленное хранилище, прав «Сохранение данных пользователя» будет недостаточно. Разберем, что нужно сделать:
МоеХранилищеНастроек).Без этого метод МенеджерХранилища.Загрузить будет возвращать исключение «Нарушение прав доступа», так как объект-контейнер настроек недоступен для роли пользователя.
Посмотрим на пример кода, который вызывается при старте. БСП активно использует регистр сведений ПараметрыРаботыПрограммы. Если у пользователя нет прав на чтение (Read) и просмотр (View) этого регистра, инициализация параметров клиента прервется.
Также важно проверить права на следующие объекты:
СведенияООбновленииИБ, ДетализацияОбновленияИБ.ИдентификаторыОбъектовМетаданных.Если вы добавили новую роль или новый объект (хранилище), БСП должна «узнать» о них. Внутренние механизмы БСП хранят информацию об объектах в справочнике Идентификаторы объектов метаданных. Если справочник не актуален, механизмы управления доступом могут блокировать работу. Чтобы обновить данные, выполним следующие действия:
/C ЗапуститьОбновлениеИнформационнойБазы.Иногда возникают ситуации, когда прав действительно не хватает в глубоких системных механизмах, которые невозможно или нецелесообразно открывать рядовому пользователю. В этом случае допустимо временное переключение в привилегированный режим, но делать это нужно крайне осторожно. Рассмотрим пример изменения кода в общем модуле, где происходит загрузка настроек:
УстановитьПривилегированныйРежим(Истина);
Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек);
УстановитьПривилегированныйРежим(Ложь);
Важное предупреждение: Использование УстановитьПривилегированныйРежим(Истина) — это зачастую лишь борьба с симптомами. Это может создать брешь в безопасности. Правильнее всего будет найти конкретный объект, на который не хватает прав, через Журнал регистрации. В журнале обычно фиксируется событие «Отказ в доступе» с точным указанием имени объекта (например, константы или справочника).
Если вышеперечисленные шаги не помогли, рекомендуем выполнить следующие действия:
ОбщегоНазначения на строке, указанной в стеке ошибки (в вашем случае это вызов МенеджерХранилища.Загрузить).КлючОбъекта. Это поможет понять, какую именно настройку пытается прочитать система....ВызовСервера. Для новых ролей «с нуля» об этом часто забывают.Таким образом, системный подход к настройке прав в БСП требует не только назначения роли «Базовые права», но и внимательного анализа прав на конкретные хранилища настроек и системные регистры, используемые при инициализации сеанса.