Рассмотрим типичную ситуацию, с которой сталкиваются разработчики 1С: при попытке выполнить внешний отчет под пользователем с ограниченными правами система выдает ошибку «установлен безопасный режим, выполнение операции запрещено». При этом под пользователем с полными правами тот же отчет работает корректно. Часто ошибка указывает на конкретную строку кода, например, на вызов метода ПодключитьВнешнююКомпоненту. Попытки решить проблему «в лоб», установив привилегированный режим для модуля, не приносят результата.
Проанализируем, почему так происходит и какие существуют правильные способы решения этой задачи.
Для начала разберемся в ключевых понятиях: привилегированный режим и безопасный режим. Это два разных механизма защиты с разными целями.
УстановитьПривилегированныйРежим(Истина)) предназначен для временного отключения проверки прав доступа на уровне записей (RLS). Он позволяет коду, выполняемому на сервере, получить доступ к данным в базе, которые могут быть закрыты для текущего пользователя настройками прав.Важный момент: безопасный режим имеет более высокий приоритет. Если операция запрещена безопасным режимом, установка привилегированного режима никак на это не повлияет. Именно поэтому простое включение привилегированного режима для общего модуля не решает проблему с подключением внешней компоненты.
Наша задача — не отключить механизм защиты, а корректно предоставить необходимые разрешения для выполнения доверенного кода.
Если ваша конфигурация, даже самописная, использует Библиотеку стандартных подсистем (БСП), это наиболее предпочтительный и безопасный способ решения проблемы. БСП предоставляет программный интерфейс для управления разрешениями в безопасном режиме.
Рассмотрим по шагам, как это сделать.
Определяем необходимые разрешения
Перед тем как подключать внешнюю компоненту, нужно программно запросить разрешение на это действие. Для этого в БСП существует специальный общий модуль РаботаВБезопасномРежиме.
Получаем разрешение в коде
Для запроса разрешения на использование внешней компоненты используется функция РазрешениеНаИспользованиеВнешнейКомпоненты(). Вы должны передать в нее имя компоненты, которое используется в методе ПодключитьВнешнююКомпоненту.
Интегрируем запрос в дополнительный отчет
Внешние отчеты и обработки, подключаемые через подсистему БСП «Дополнительные отчеты и обработки», могут декларировать требуемые им разрешения. Для этого в модуле объекта отчета нужно реализовать экспортную функцию СведенияОВнешнейОбработке().
Посмотрим на пример. Допустим, ваш отчет использует компоненту для работы со штрихкодами, и вы подключаете ее так:
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
Чтобы это работало под пользователем с ограниченными правами, в модуле объекта вашего внешнего отчета необходимо добавить или модифицировать функцию СведенияОВнешнейОбработке():
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.3.51"); // Укажите свою версию БСП
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Наименование = "Отчет с использованием внешней компоненты";
ПараметрыРегистрации.БезопасныйРежим = Истина; // Явно указываем, что отчет может работать в безопасном режиме
// А вот и ключевая часть - запрашиваем разрешения
НовоеРазрешение = ПараметрыРегистрации.Разрешения.Добавить();
НовоеРазрешение.Имя = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты("ОбщийМакет.КомпонентаПечатиШтрихкодов");
НовоеРазрешение.Представление = "Использование компоненты для печати штрихкодов";
НовоеРазрешение.Использование = Истина;
// ... другие параметры регистрации
Возврат ПараметрыРегистрации;
КонецФункции
После того как вы сохраните отчет с таким кодом и зарегистрируете его в справочнике Дополнительные отчеты и обработки, администратор системы при просмотре карточки вашего отчета увидит запрошенные разрешения и сможет их одобрить. После этого отчет будет работать и у обычных пользователей, так как платформа будет знать, что использование этой компоненты в рамках данного отчета является доверенной операцией.
Если вы работаете в клиент-серверном варианте, существует более мощный, инфраструктурный способ управления безопасностью — профили безопасности. Этот механизм позволяет администратору сервера 1С детально настраивать, какие опасные действия разрешены, а какие нет.
Настройка выполняется в консоли администрирования кластера серверов 1С:Предприятия.
Этот способ подходит, когда нужно централизованно управлять разрешениями для всей информационной базы, а не для отдельных отчетов. Он требует доступа к администрированию сервера 1С.
Хотя в исходной проблеме это, скорее всего, не было основной причиной (раз у админа все работало), не стоит забывать о базовых вещах.
.dll или .ocx), ее необходимо зарегистрировать в операционной системе. Регистрация выполняется на том компьютере, где исполняется код.
ПодключитьВнешнююКомпоненту() вызывается на клиенте — компонента регистрируется на машине пользователя.Регистрация выполняется командой regsvr32.exe "путь_к_файлу_компоненты.dll", запущенной от имени администратора ОС.
Интерактивное открытие внешних отчетов и обработок. Иногда отсутствие неочевидных базовых прав может приводить к сбоям.
Ошибка «установлен безопасный режим, выполнение операции запрещено» — это не сбой, а штатная работа механизма защиты платформы. Правильное решение заключается не в его отключении, а в грамотном предоставлении разрешений.
СведенияОВнешнейОбработке(). Это самый гибкий и рекомендуемый способ.