Почему не работает привилегированный режим во внешнем отчете и как это исправить

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

В практике разработчика 1С часто встречается ситуация: стандартный отчет (например, «Карточка Т-2» в ЗУП 3.1) успешно выводит данные, на которые у пользователя нет прямых прав, а внешний отчет, созданный на его основе, выдает ошибку «Нарушение прав доступа». При этом попытки использовать УстановитьПривилегированныйРежим(Истина) внутри внешнего отчета не приносят результата. В этой статье мы подробно разберем, почему так происходит, и рассмотрим проверенные способы решения этой задачи.

Выясняем причину: механизм безопасного режима

Главная причина, по которой УстановитьПривилегированныйРежим «не видит» ваш код во внешнем отчете, заключается в безопасном режиме. Платформа «1С:Предприятие 8.3» по умолчанию запускает все внешние обработки и отчеты в защищенном контексте. Это сделано для того, чтобы скачанный из интернета отчет не мог нанести вред системе или несанкционированно прочитать конфиденциальные данные.

Когда объект запущен в безопасном режиме:

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

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

Способ 1. Перенос кода в расширение конфигурации

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

Разберем по шагам, как это реализовать:

  1. Создадим новое расширение (или используем существующее).
  2. Добавим в расширение новый общий модуль или заимствуем процедуру из модуля менеджера отчета.
  3. В модуле расширения пропишем код с установкой режима:

&НаСервере
Процедура ВыполнитьЗапросСПовышеннымиПравами()
    УстановитьПривилегированныйРежим(Истина);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СторнированиеНачислений.Ссылка КАК Ссылка
        |ИЗ
        |   Документ.СторнированиеНачислений КАК СторнированиеНачислений";
    
    Результат = Запрос.Выполнить();
    // Дальнейшая обработка данных
    
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Важный нюанс: убедитесь, что в свойствах расширения в конфигураторе снята галочка «Безопасный режим». Только в этом случае вызов УстановитьПривилегированныйРежим внутри расширения будет иметь силу.

Способ 2. Регистрация внешнего отчета с отключением безопасного режима

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

Для этого в модуле объекта внешнего отчета в функции СведенияОВнешнейОбработке необходимо правильно заполнить параметры:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет();
    ПараметрыРегистрации.Наименование = "Карточка Т-2 (внешняя)";
    ПараметрыРегистрации.БезопасныйРежим = Ложь; // КРИТИЧНО: Отключаем безопасный режим
    
    // Остальные параметры регистрации...
    
    Возврат ПараметрыРегистрации;
КонецФункции

После этого при загрузке файла .erf в базу данных программа спросит подтверждение у администратора. Если отчет зарегистрирован с БезопасныйРежим = Ложь, метод УстановитьПривилегированныйРежим(Истина) внутри модуля этого отчета начнет работать корректно.

Способ 3. Использование ключевого слова РАЗРЕШЕННЫЕ

Иногда полные права не требуются, а нужно лишь избежать фатальной ошибки «Нет прав». В этом случае проанализируем текст запроса. Если добавить в него ключевое слово РАЗРЕШЕННЫЕ, система просто скроет те записи, к которым у пользователя нет доступа, вместо того чтобы прерывать выполнение программы.


Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   Т.Ссылка
    |ИЗ
    |   Документ.СторнированиеНачислений КАК Т";

Внимание: этот способ не подходит, если логика отчета требует обязательного наличия данных по документу СторнированиеНачислений для корректного расчета (например, для Т-2). Если прав нет, выборка будет пустой, и отчет может сформироваться некорректно.

Способ 4. Вызов функций из привилегированных общих модулей конфигурации

Если вы разрабатываете отчет для типовой конфигурации (например, ЗУП, ERP или БП), посмотрите, нет ли в составе конфигурации общих модулей, у которых установлена галочка Привилегированный.

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

Резюме и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от ваших возможностей по изменению ИТ-ландшафта предприятия:

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

← На главную