Почему внешние отчеты и обработки в 1С выдают «Нарушение прав доступа!» при работе в безопасном режиме?

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

Нередко при эксплуатации типовых или доработанных конфигураций (например, «1С:Управление холдингом», «1С:ERP» или «1С:Комплексная автоматизация») разработчики и администраторы сталкиваются с неожиданной ситуацией: внешние отчеты и обработки, подключенные через справочник дополнительных отчетов и обработок БСП, внезапно перестают запускаться у пользователей и завершаются с ошибкой «Нарушение прав доступа!». При этом роли пользователей не менялись, релиз платформы оставался прежним, а на тестовой копии базы поведение может отличаться.

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

Анализ механизма возникновения ошибки

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

Подключение, БезопасныйРежим = "Да", после чего мгновенно следует ошибка выполнения Нарушение прав доступа!.

При отладке выясняется, что исключение генерируется на строках кода, обращающихся к защищенным объектам метаданных или параметрам сеанса, например:


УстановитьПривилегированныйРежим(Истина);
ПараметрыКлиента.Вставить("ПрефиксЗамеров", СтрЗаменить(ПараметрыСеанса["КомментарийЗамераВремени"], ";", "; "));

Возникает закономерный вопрос: почему метод УстановитьПривилегированныйРежим(Истина) не решает проблему, если он явно прописан перед обращением к параметрам сеанса? Выясним причину такого поведения платформы 1С:Предприятие.

Особенности работы безопасного режима платформы

Безопасный режим предназначен для изолированного исполнения непроверенного стороннего кода. При установке признака безопасного режима действуют следующие жесткие правила платформы:

  1. Игнорирование привилегированного режима: если код выполняется в безопасном режиме, вызов метода УстановитьПривилегированныйРежим(Истина) платформой просто игнорируется. Ошибка при этом не выбрасывается, но привилегированный контекст не устанавливается, и код продолжает исполняться в рамках текущих прав пользователя.
  2. Каскадное подавление прав в общих модулях: даже если код внешнего отчета вызывает процедуру общего модуля, у которого в конфигураторе установлен флажок «Привилегированный», безопасный режим внешнего отчета распространяется на весь стек вызова. Привилегии модуля аннулируются, и все операции выполняются с правами текущего сеанса.
  3. Ограничение доступа к параметрам сеанса: многие подсистемы БСП (включая оценку производительности) хранят служебную информацию в параметрах сеанса, доступ к которым закрыт для обычных пользовательских ролей. Разработчики конфигурации рассчитывают, что чтение данных параметров всегда происходит в привилегированном режиме. Как только безопасный режим блокирует привилегии, обращение к ПараметрыСеанса["КомментарийЗамераВремени"] вызывает исключение «Нарушение прав доступа!».

Почему же функционал работал раньше? Чаще всего это связано с изменением функциональных опций. Например, в системе была включена константа замера производительности (или автоматического экспорта метрик), которая активировала ветку кода с обращением к закрытым параметрам сеанса при каждом открытии отчетов.

Способы решения проблемы

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

Вариант 1. Отключение безопасного режима для внешней обработки

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

Посмотрим на пример регистрации команды в модуле объекта внешней обработки или отчета в экспортной функции СведенияОВнешнейОбработке():


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.ВстроитьКомандуВИнтерфейс();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь; // Отключаем безопасный режим

    ТаблицаКоманд = ПараметрыРегистрации.Команды;
    
    СтрокаКоманды = ТаблицаКоманд.Добавить();
    СтрокаКоманды.Идентификатор = "ОткрытьОтчет";
    СтрокаКоманды.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    СтрокаКоманды.ПоказыватьОповещение = Ложь;

    Возврат ПараметрыРегистрации;

КонецФункции

Также безопасный режим можно отключить интерактивно в режиме «1С:Предприятие» в карточке справочника «Дополнительные отчеты и обработки», сняв соответствующий признак безопасности (для этого у пользователя должны быть полные административные права).

Вариант 2. Настройка прав доступа к параметрам сеанса

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

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

После предоставления права на получение значения параметра сеанса код успешно отработает даже без взведения привилегированного режима.

Вариант 3. Использование профилей безопасности кластера серверов

В клиент-серверном варианте платформы 1С:Предприятие вместо абсолютного запрета или полного отключения контроля рекомендуется использовать механизм профилей безопасности кластера:

  1. В консоли администрирования кластера серверов создается профиль безопасности для информационной базы.
  2. Через механизмы БСП для внешней обработки запрашиваются только те разрешения, которые ей действительно необходимы (например, доступ к внешним компонентам, определенным каталогам файловой системы или COM-объектам).
  3. При этом внешняя обработка подключается с безопасным режимом по профилю безопасности, что предотвращает несанкционированные действия, сохраняя работоспособность регламентированных типовых вызовов платформы.

Вариант 4. Отключение неиспользуемой функциональной опции

Если ошибка началась внезапно после включения настроек, проанализируем последние изменения констант. В частности, если оценка производительности и замеры времени не используются на постоянной основе, достаточно отключить константу оценки производительности в разделе администрирования. Это исключит выполнение проблемной ветки кода при открытии внешних отчетов.

← На главную