Нередко при эксплуатации типовых или доработанных конфигураций (например, «1С:Управление холдингом», «1С:ERP» или «1С:Комплексная автоматизация») разработчики и администраторы сталкиваются с неожиданной ситуацией: внешние отчеты и обработки, подключенные через справочник дополнительных отчетов и обработок БСП, внезапно перестают запускаться у пользователей и завершаются с ошибкой «Нарушение прав доступа!». При этом роли пользователей не менялись, релиз платформы оставался прежним, а на тестовой копии базы поведение может отличаться.
Разберем детально, почему возникает данное исключение, как на него влияет безопасный режим платформы и какие существуют способы решения этой проблемы.
Проанализируем типовую ситуацию, когда ошибка возникает в общем коде подсистем, например, при вызове процедур оценки производительности. В журнале регистрации фиксируется попытка запуска обработки в безопасном режиме:
Подключение, БезопасныйРежим = "Да", после чего мгновенно следует ошибка выполнения Нарушение прав доступа!.
При отладке выясняется, что исключение генерируется на строках кода, обращающихся к защищенным объектам метаданных или параметрам сеанса, например:
УстановитьПривилегированныйРежим(Истина);
ПараметрыКлиента.Вставить("ПрефиксЗамеров", СтрЗаменить(ПараметрыСеанса["КомментарийЗамераВремени"], ";", "; "));
Возникает закономерный вопрос: почему метод УстановитьПривилегированныйРежим(Истина) не решает проблему, если он явно прописан перед обращением к параметрам сеанса? Выясним причину такого поведения платформы 1С:Предприятие.
Безопасный режим предназначен для изолированного исполнения непроверенного стороннего кода. При установке признака безопасного режима действуют следующие жесткие правила платформы:
УстановитьПривилегированныйРежим(Истина) платформой просто игнорируется. Ошибка при этом не выбрасывается, но привилегированный контекст не устанавливается, и код продолжает исполняться в рамках текущих прав пользователя.ПараметрыСеанса["КомментарийЗамераВремени"] вызывает исключение «Нарушение прав доступа!».Почему же функционал работал раньше? Чаще всего это связано с изменением функциональных опций. Например, в системе была включена константа замера производительности (или автоматического экспорта метрик), которая активировала ветку кода с обращением к закрытым параметрам сеанса при каждом открытии отчетов.
Рассмотрим несколько практических вариантов исправления ситуации в зависимости от требований безопасности и архитектуры вашей базы.
Если внешняя обработка является доверенной и разработана внутренними специалистами компании, наиболее простым решением будет отключение безопасного режима при регистрации в БСП.
Посмотрим на пример регистрации команды в модуле объекта внешней обработки или отчета в экспортной функции СведенияОВнешнейОбработке():
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.ВстроитьКомандуВИнтерфейс();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Отключаем безопасный режим
ТаблицаКоманд = ПараметрыРегистрации.Команды;
СтрокаКоманды = ТаблицаКоманд.Добавить();
СтрокаКоманды.Идентификатор = "ОткрытьОтчет";
СтрокаКоманды.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
СтрокаКоманды.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Также безопасный режим можно отключить интерактивно в режиме «1С:Предприятие» в карточке справочника «Дополнительные отчеты и обработки», сняв соответствующий признак безопасности (для этого у пользователя должны быть полные административные права).
Если политикой безопасности компании строго запрещено отключать безопасный режим у внешних обработок, исправление выполняется на уровне конфигурации:
БазовыеПрава или специализированную роль подсистемы БСП).КомментарийЗамераВремени).После предоставления права на получение значения параметра сеанса код успешно отработает даже без взведения привилегированного режима.
В клиент-серверном варианте платформы 1С:Предприятие вместо абсолютного запрета или полного отключения контроля рекомендуется использовать механизм профилей безопасности кластера:
Если ошибка началась внезапно после включения настроек, проанализируем последние изменения констант. В частности, если оценка производительности и замеры времени не используются на постоянной основе, достаточно отключить константу оценки производительности в разделе администрирования. Это исключит выполнение проблемной ветки кода при открытии внешних отчетов.