Как исправить ошибку «Отказ в доступе» на чтение константы при открытии документа в 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При тонкой настройке прав пользователей в 1С:ERP Управление предприятием часто возникает ситуация, когда при создании профиля групп доступа «с нуля» пользователи не могут открыть типовые документы. В журнале регистрации фиксируется событие «Отказ в доступе» к объекту метаданных, например к константе ИспользоватьНачислениеЗарплаты или другим параметрам функциональных опций, с требованием права Чтение.

Разберем причины возникновения этой ошибки и детально рассмотрим несколько способов ее решения в типовой конфигурации без снятия с поддержки.

Причины блокировки доступа к константам

Проанализируем механику работы типовых конфигураций на базе БСП (Библиотеки Стандартных Подсистем). При открытии форм документов система проверяет значения множества функциональных опций и констант для корректной отрисовки интерфейса. Ошибка возникает по следующим причинам:

  1. Отсутствие базовых системных ролей в созданном профиле. Большинство общих констант и функциональных опций не выносятся в отдельные узкие роли, а входят в состав общих базовых ролей системы.
  2. Чтение параметров в не привилегированном контексте. При открытии формы код обращается к константе напрямую в контексте текущего сеанса пользователя без временного перехода в привилегированный режим.
  3. Рассинхронизация вспомогательных таблиц прав доступа. Служебные регистры подсистемы управления доступом могут содержать неактуальные данные до момента обновления информационной базы.

Способ 1. Поиск и назначение существующих ролей через регистр «ПраваРолей»

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

Выполним следующие действия:

  1. Перейдем в режим 1С:Предприятие под пользователем с полными административными правами.
  2. Откроем регистр сведений ПраваРолей (через Все функции / Функции для технического специалиста).
  3. Установим отбор по полю Объект метаданных, указав имя нужной константы (например, ИспользоватьНачислениеЗарплаты).
  4. Посмотрим список ролей, у которых установлено право Чтение.

В конфигурации 1С:ERP чтение подобных констант обычно включено в роли общего назначения:

  1. БазовыеПраваЗарплатаКадры;
  2. БазовыеПраваУТ;
  3. БазовыеПраваERP;
  4. БазовыеПраваБСП.

Проверим эти роли на предмет предоставления избыточных прав. Если роль содержит только базовый интерфейсный доступ и чтение общесистемных классификаторов, добавим ее в настраиваемый Профиль групп доступа пользователя.

Способ 2. Создание роли через расширение конфигурации

Если конфигурация находится на поддержке («на замке»), а типовые роли дают пользователю лишние права к закрытым разделам учета, создадим отдельную минимальную роль с помощью расширения.

Разберем процесс создания по шагам:

  1. Откроем Конфигуратор и перейдем в меню Конфигурация — Расширения конфигурации.
  2. Нажмем кнопку Добавить, укажем имя расширения и назначение (например, Адаптация). Убедимся, что режим совместимости расширения соответствует режиму совместимости основной конфигурации (для работы с ролями требуется версия платформы 8.3.9 и выше).
  3. В дереве метаданных основной конфигурации найдем нужную константу, вызовем контекстное меню и выберем пункт Добавить в расширение (без захвата константы назначить на нее права в расширении невозможно).
  4. В дереве метаданных расширения найдем ветку Роли, нажмем Добавить и зададим имя новой роли, например ЧтениеКонстантЗарплаты.
  5. В окне настройки прав созданной роли найдем заимствованную константу и установим флаг Чтение (а также Просмотр при необходимости).
  6. Сохраним расширение и обновим конфигурацию базы данных.

После применения расширения в пользовательском режиме БСП должна пересчитать права. Если роль не появилась в списке доступных ролей профилей, выполним запуск базы с параметром командной строки:

/C ЗапуститьОбновлениеИнформационнойБазы

Способ 3. Программный обход ошибки через привилегированный режим

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

Посмотрим на пример вызова в серверном модуле расширения с аннотацией &Вместо или &Перед:


&Вместо("ПроверитьИспользованиеНачисленияЗарплаты")
Функция Расш1_ПроверитьИспользованиеНачисленияЗарплаты()
    
    УстановитьПривилегированныйРежим(Истина);
    ЗначениеКонстанты = Константы.ИспользоватьНачислениеЗарплаты.Получить();
    УстановитьПривилегированныйРежим(Ложь);
    
    Возврат ЗначениеКонстанты;
    
КонецФункции

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

← На главную