При разработке в системе 1С:Предприятие 8 часто возникает ситуация, когда рядовому пользователю с ограниченными правами необходимо предоставить возможность выполнять специфические действия (например, создавать документы перемещения или изменять защищенные реквизиты), которые запрещены его основной ролью. Прямое включение привилегированного режима внутри внешней обработки зачастую не дает результата. В этой статье мы подробно разберем, почему это происходит и какими способами можно решить данную задачу, соблюдая стандарты разработки и требования безопасности.
Прежде всего, проанализируем поведение платформы. Когда мы запускаем внешнюю обработку через меню «Файл — Открыть», система по умолчанию включает так называемый безопасный режим. В этом режиме выполнение метода УстановитьПривилегированныйРежим(Истина) полностью игнорируется платформой. Это сделано для того, чтобы вредоносный код из непроверенного внешнего файла не мог получить полный доступ к данным информационной базы.
Рассмотрим ситуацию глубже: даже если обработка добавлена в справочник «Дополнительные отчеты и обработки», она все равно может запускаться в безопасном режиме, если при ее регистрации не были указаны соответствующие разрешения. Выясним, как обойти эти ограничения правильно.
Если ваша конфигурация использует Библиотеку стандартных подсистем (БСП), это наиболее корректный путь, для которого можно использовать готовый шаблон дополнительной обработки. В модуле объекта внешней обработки должна присутствовать экспортная функция СведенияОВнешнейОбработке(). Чтобы обработка получила право на использование привилегированного режима, мы должны явно запросить это разрешение у системы.
Разберем по шагам, как подготовить функцию регистрации, которую содержит стандартный шаблон дополнительной обработки с сохранением параметров:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// Определяем основные параметры обработки
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Создание документов (привилегированная)";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Важно! Указываем Ложь для возможности запроса разрешений
// Добавляем команду
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить создание документов";
НоваяКоманда.Идентификатор = "ВыполнитьДействие";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
// Запрашиваем разрешение на привилегированный режим
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима();
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Возврат ПараметрыРегистрации;
КонецФункции
Проанализируем этот код. Ключевым моментом здесь является добавление объекта РазрешениеНаИспользованиеПривилегированногоРежима в массив Разрешения. При загрузке такой обработки в базу администратор увидит запрос на предоставление разрешений. После подтверждения код внутри обработки сможет использовать УстановитьПривилегированныйРежим(Истина) на сервере.
Это самый «чистый» и современный способ с точки зрения архитектуры. Если внешняя обработка — это лишь интерфейс, то саму «опасную» логику (создание документов, удаление записей) лучше разместить в расширении конфигурации.
Посмотрим, как это реализовать:
// В общем модуле расширения (имя модуля: Расш_ПривилегированныеДействия)
Процедура СоздатьДокументПеремещения(ПараметрыДанных) Экспорт
// Здесь проверка прав проводиться не будет, так как модуль привилегированный
НовыйДок = Документы.ПеремещениеТоваров.СоздатьДокумент();
// Заполнение реквизитов из ПараметрыДанных...
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Теперь из модуля внешней обработки мы просто вызываем эту процедуру:
// Код во внешней обработке
Расш_ПривилегированныеДействия.СоздатьДокументПеремещения(СтруктураДанных);
Этот метод хорош тем, что он не требует отключать безопасный режим у всей внешней обработки. Вы делегируете выполнение только конкретной задачи доверенному коду расширения.
Иногда проблему можно решить стандартными средствами прав доступа, не прибегая к привилегированному режиму, предварительно проведя анализ прав и ролей пользователя. Рассмотрим ситуацию: пользователю запрещено «Интерактивное добавление» документа, но разрешено «Добавление» и «Изменение».
В 1С права разделяются на программные и интерактивные. Проанализируем настройки роли в конфигураторе:
СоздатьДокумент()).Если мы снимем флаги у всех «Интерактивных» действий, но оставим обычные «Добавление» и «Изменение», пользователь не сможет создать документ вручную через интерфейс, но ваша внешняя обработка сможет успешно выполнить код по созданию и записи этого документа под правами этого пользователя.
Если вам нужно запустить обработку из своего кода (не через БСП и не через диалог открытия файла), вы можете управлять безопасным режимом при создании объекта обработки. Выясним, как это сделать программно.
Для этого используется метод МенеджерВнешнихОбработок.Создать. Обратите внимание на второй параметр:
// На сервере
ПутьКФайлу = "C:\ExternalProcessors\MyProcessor.epf";
ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь); // Ложь отключает безопасный режим
Важное ограничение: для выполнения этого кода у пользователя должна быть роль «Интерактивное открытие внешних обработок». Однако, если этот код выполняется на сервере в привилегированном модуле или под полными правами, вы сможете создать объект обработки без ограничений безопасного режима, и внутри нее УстановитьПривилегированныйРежим будет работать корректно.
Рассмотрим еще один интересный архитектурный прием. Фоновые задания в 1С по умолчанию могут выполняться в привилегированном режиме, если они инициированы серверным кодом без явного указания пользователя.
Вы можете передать данные из внешней обработки в фоновое задание. Процедура фонового задания, находясь в общем модуле конфигурации или расширения, выполнит создание документов с полными правами, а внешняя обработка будет лишь ожидать завершения задания и выводить результат пользователю. Это позволяет избежать прямого предоставления прав пользователю в интерфейсе.
Мы проанализировали различные подходы к обходу ограничений прав во внешних обработках. Подведем итоги:
СведенияОВнешнейОбработке. Это самый безопасный и регламентированный способ.Выбор конкретного метода зависит от вашей архитектурной задачи и того, насколько жестко настроена политика безопасности в вашей информационной базе.