В практике разработчика 1С часто встречается ситуация: стандартный отчет (например, «Карточка Т-2» в ЗУП 3.1) успешно выводит данные, на которые у пользователя нет прямых прав, а внешний отчет, созданный на его основе, выдает ошибку «Нарушение прав доступа». При этом попытки использовать УстановитьПривилегированныйРежим(Истина) внутри внешнего отчета не приносят результата. В этой статье мы подробно разберем, почему так происходит, и рассмотрим проверенные способы решения этой задачи.
Главная причина, по которой УстановитьПривилегированныйРежим «не видит» ваш код во внешнем отчете, заключается в безопасном режиме. Платформа «1С:Предприятие 8.3» по умолчанию запускает все внешние обработки и отчеты в защищенном контексте. Это сделано для того, чтобы скачанный из интернета отчет не мог нанести вред системе или несанкционированно прочитать конфиденциальные данные.
Когда объект запущен в безопасном режиме:
УстановитьПривилегированныйРежим(Истина) игнорируется платформой. Код продолжает выполняться, но права пользователя не расширяются до полных (административных).Проанализируем ситуацию: стандартный отчет вшит в конфигурацию и является «доверенным» объектом. Он часто обращается к общим модулям с установленным свойством Привилегированный. Внешний же отчет считается сторонним кодом, и платформа применяет к нему политику «нулевого доверия».
Рассмотрим наиболее современный и эффективный способ, который помог автору вопроса. Если перенести процедуру формирования запроса в расширение, проблема решается. Это происходит потому, что код в расширении (если у самого расширения в свойствах отключен «Безопасный режим») считается частью основной конфигурации.
Разберем по шагам, как это реализовать:
&НаСервере
Процедура ВыполнитьЗапросСПовышеннымиПравами()
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СторнированиеНачислений.Ссылка КАК Ссылка
|ИЗ
| Документ.СторнированиеНачислений КАК СторнированиеНачислений";
Результат = Запрос.Выполнить();
// Дальнейшая обработка данных
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Важный нюанс: убедитесь, что в свойствах расширения в конфигураторе снята галочка «Безопасный режим». Только в этом случае вызов УстановитьПривилегированныйРежим внутри расширения будет иметь силу.
Если вы не хотите менять конфигурацию или создавать расширения, можно воспользоваться механизмом подсистемы «Дополнительные отчеты и обработки» (БСП). При добавлении отчета в справочник администратор может явно указать, что отчет должен работать без ограничений.
Для этого в модуле объекта внешнего отчета в функции СведенияОВнешнейОбработке необходимо правильно заполнить параметры:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет();
ПараметрыРегистрации.Наименование = "Карточка Т-2 (внешняя)";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // КРИТИЧНО: Отключаем безопасный режим
// Остальные параметры регистрации...
Возврат ПараметрыРегистрации;
КонецФункции
После этого при загрузке файла .erf в базу данных программа спросит подтверждение у администратора. Если отчет зарегистрирован с БезопасныйРежим = Ложь, метод УстановитьПривилегированныйРежим(Истина) внутри модуля этого отчета начнет работать корректно.
Иногда полные права не требуются, а нужно лишь избежать фатальной ошибки «Нет прав». В этом случае проанализируем текст запроса. Если добавить в него ключевое слово РАЗРЕШЕННЫЕ, система просто скроет те записи, к которым у пользователя нет доступа, вместо того чтобы прерывать выполнение программы.
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Т.Ссылка
|ИЗ
| Документ.СторнированиеНачислений КАК Т";
Внимание: этот способ не подходит, если логика отчета требует обязательного наличия данных по документу СторнированиеНачислений для корректного расчета (например, для Т-2). Если прав нет, выборка будет пустой, и отчет может сформироваться некорректно.
Если вы разрабатываете отчет для типовой конфигурации (например, ЗУП, ERP или БП), посмотрите, нет ли в составе конфигурации общих модулей, у которых установлена галочка Привилегированный.
Если вызвать функцию такого модуля из внешнего отчета, весь код внутри этой функции будет выполнен с полными правами базы данных. Платформа 1С позволяет переходить из «небезопасного» контекста внешнего отчета в «безопасный и доверенный» контекст общего модуля конфигурации. Это «канонический» путь решения подобных задач в рамках экосистемы 1С.
Подведем итог нашему анализу. Выбор метода зависит от ваших возможностей по изменению ИТ-ландшафта предприятия:
СторнированиеНачислений, возможно, стоит обсудить изменение прав (ролей) пользователя, а не искать программные обходы.Помните, что использование привилегированного режима — это большая ответственность. Всегда проверяйте входящие параметры запроса, чтобы не допустить утечки данных, к которым у пользователя не должно быть доступа по закону или внутренним регламентам организации.