Разработка внешних отчетов и обработок в среде 1С:Предприятие 8.3 часто сталкивается с ограничениями системы безопасности. Типичная ситуация: программисту необходимо выбрать данные из документов или регистров, к которым у текущего пользователя нет прав доступа (например, для построения сводного аналитического отчета). Стандартный метод УстановитьПривилегированныйРежим(Истина) в модуле объекта внешнего отчета часто просто не срабатывает. В этой статье мы подробно разберем, почему это происходит и как правильно настроить отчет для работы с полными правами.
Рассмотрим ситуацию, когда мы открываем внешний отчет стандартным способом через меню «Файл» — «Открыть». В этот момент платформа 1С автоматически запускает код внешнего объекта в так называемом безопасном режиме. Это защитный механизм, который предотвращает выполнение потенциально опасных операций (работа с файловой системой, запуск внешних приложений и, что самое важное, повышение привилегий).
Даже если в коде на стороне сервера мы пропишем УстановитьПривилегированныйРежим(Истина), платформа проигнорирует эту команду, если контекст исполнения помечен как безопасный. Это сделано для того, чтобы обычный пользователь не мог обойти права доступа, просто скачав из интернета или написав простую обработку. Таким образом, работа в привилегированном режиме «на лету» для файлов .erf или .epf невозможна без специальной регистрации в системе.
Проанализируем самый надежный и правильный способ решения проблемы. Чтобы привилегированный режим заработал, отчет должен перестать считаться «недоверенным». Для этого его необходимо добавить в справочник Дополнительные отчеты и обработки (входит в состав БСП — Библиотеки Стандартных Подсистем).
Разберем по шагам, что нужно сделать в модуле объекта отчета. Нам необходимо правильно описать функцию СведенияОВнешнейОбработке. Самый важный параметр здесь — БезопасныйРежим. Установив его в значение Ложь, мы сообщаем системе, что доверяем этому коду и разрешаем ему выходить за рамки ограничений пользователя.
Посмотрим на пример реализации этой функции:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Наименование = "Мой внешний отчет (привилегированный)";
ПараметрыРегистрации.Версия = "1.1";
// КРИТИЧЕСКИ ВАЖНЫЙ ПАРАМЕТР:
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Открыть отчет";
НоваяКоманда.Идентификатор = "ОткрытьОтчет";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
После того как вы сохраните отчет с таким кодом, его нужно загрузить в базу через пользовательский интерфейс (раздел Администрирование — Печатные формы, отчеты и обработки). При регистрации система может выдать предупреждение о безопасности — это нормально, так как мы отключаем безопасный режим. После регистрации отчет будет запускаться в контексте системы, и вызов УстановитьПривилегированныйРежим(Истина) внутри функций модуля объекта начнет работать корректно.
В современных конфигурациях механизм безопасности стал еще более детальным. Вместо полного отключения безопасного режима мы можем точечно запросить разрешение на использование привилегированного режима. Это более «красивый» и безопасный способ программирования.
Рассмотрим, как добавить такое разрешение в структуру ПараметрыРегистрации. Для этого используется специальный программный интерфейс БСП. Проанализируем пример кода:
// В функции СведенияОВнешнейОбработке добавим следующий блок:
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима();
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Этот подход позволяет оставить БезопасныйРежим = Истина, но при этом дать отчету право на одну конкретную операцию — повышение прав. При регистрации такого отчета администратор увидит конкретный список запрашиваемых разрешений, что повышает прозрачность системы.
Если по каким-то причинам вы не хотите регистрировать отчет в дополнительных обработках (например, в процессе отладки), можно использовать механизм расширений. Мы можем создать в расширении Общий модуль, установить у него свойства Сервер и Привилегированный.
Разберем алгоритм работы этого метода:
м_ПривилегированныйВызов.Важно помнить: код внутри привилегированного модуля исполняется с правами FullRights по умолчанию, и вызывать УстановитьПривилегированныйРежим там не требуется. Однако будьте осторожны: если внешний отчет запущен в строгом безопасном режиме, вызов функций общих модулей может быть заблокирован платформой. Поэтому комбинация с регистрацией в справочнике всё равно остается приоритетной.
Проанализируем ситуацию, когда данные выбираются не вручную через запрос в коде, а через Систему компоновки данных (СКД) — для отладки подобных отчетов пригодятся инструменты разработчика 1С с консолью СКД и анализом прав доступа. Если отчет формируется стандартно, то компоновщик инициализируется на сервере. При использовании механизма БСП отчеты часто выполняются в фоновых заданиях.
В этом случае необходимо убедиться, что установка привилегированного режима происходит именно в том контексте, где выполняется запрос. Если вы переопределяете процедуру ПриКомпоновкеРезультата в модуле объекта, не забудьте вызвать установку режима в самом начале:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
УстановитьПривилегированныйРежим(Истина);
// Теперь выполнение запроса в СКД пройдет под полными правами
КонецПроцедуры
Стоит отметить, что поведение может незначительно отличаться в зависимости от архитектуры базы:
Резюме для практики: Если вам нужно быстро заставить отчет работать с закрытыми данными — добавьте его в «Дополнительные отчеты и обработки» и убедитесь, что в коде СведенияОВнешнейОбработке указано БезопасныйРежим = Ложь. Это решит 99% проблем с доступом во внешних объектах.