Как использовать привилегированный режим в расширении 1С, запущенном в безопасном режиме?

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

Разработчики часто сталкиваются с ситуацией, когда расширение конфигурации, подключенное в безопасном режиме, должно выполнить операцию, требующую повышенных прав. Типичный пример — чтение учетных данных (паролей, токенов) из регистра сведений БезопасноеХранилищеДанных или выполнение запросов к внешним ресурсам. Попытка вызвать метод УстановитьПривилегированныйРежим(Истина) внутри модуля расширения в этом случае не выдает ошибку, но режим фактически не включается.

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

Выясняем причину: почему привилегированный режим игнорируется?

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

  1. Игнорирование повышения привилегий. Вызов метода УстановитьПривилегированныйРежим(Истина) полностью игнорируется платформой. Проверить это можно, вызвав метод ПривилегированныйРежим() сразу после попытки включения — он вернет значение Ложь.
  2. Запрет на отключение безопасного режима из расширений. Платформенный метод УстановитьОтключениеБезопасногоРежима(Истина), который позволяет временно приостановить действие ограничений безопасного режима, запрещено вызывать из кода расширений. Его вызов приведет к возникновению исключения.
  3. Специфика файлового режима работы. Запросы разрешений через БСП (например, метод РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима()) опираются на механизм профилей безопасности. Этот функционал поддерживается исключительно на уровне кластера серверов «1С:Предприятие». В файловой базе данных профили безопасности физически отсутствуют. Как следствие, любые запросы разрешений одобряются БСП на программном уровне, но платформа не может применить их, так как в файловом движке нет соответствующего системного механизма.
  4. Ограничения общих модулей расширений. Общие модули, созданные внутри самого расширения, не могут быть объявлены привилегированными. Даже если расширение заимствует привилегированный общий модуль основной конфигурации, любые расширяющие методы (аннотированные как &Перед, &После или &Вместо) будут выполняться в обычном, непривилегированном режиме, если безопасный режим для расширения активен.

Таким образом, архитектура платформы исключает возможность несанкционированного повышения привилегий безопасным кодом, особенно в условиях файловой информационной базы.

Сравниваем расширения и внешние обработки

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

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

Рассмотрим подробнее три основных способа решения этой проблемы в зависимости от возможности изменения основной конфигурации и варианта работы базы данных (файловый или клиент-серверный).

Решение 1. Снятие признака «Безопасный режим» для расширения (Универсальный способ для файловых баз)

Если ваша информационная база работает в файловом режиме, а основную конфигурацию менять категорически нельзя, то единственным рабочим решением является полное отключение безопасного режима для данного расширения.

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

  1. Откройте информационную базу в режиме «1С:Предприятие» под пользователем с административными правами.
  2. Перейдите в меню НСИ и администрирование — Печатные формы, отчеты и обработки — Расширения (интерфейс может незначительно отличаться в зависимости от конфигурации).
  3. Найдите в списке ваше расширение.
  4. Снимите флажок (галочку) в колонке Безопасный режим (или выберите соответствующую команду в свойствах расширения).
  5. Перезапустите сеанс работы с базой данных для применения изменений.

После отключения безопасного режима код внутри расширения сможет беспрепятственно использовать метод УстановитьПривилегированныйРежим(Истина) для выполнения любых необходимых операций, включая чтение из безопасного хранилища данных.

Решение 2. Использование "модуля-обертки" в основной конфигурации

Если вы имеете доступ к изменению основной конфигурации (сняты замки на редактирование или добавление новых объектов), наиболее безопасным и архитектурно правильным решением будет создание специального общего модуля в основной конфигурации.

Проанализируем этот подход подробнее:

  1. Создайте в основной конфигурации новый общий модуль. Назовите его, например, _окПривилегированныйВызов.
  2. В свойствах модуля установите флажки Сервер и Привилегированный. Флажок Безопасный режим должен быть снят.
  3. Создайте в этом модуле экспортную функцию для получения нужных данных.

Посмотрим на пример реализации кода в таком модуле:


// Общий модуль основной конфигурации: _окПривилегированныйВызов (Привилегированный = Истина)
Функция ПрочитатьПарольИзБезопасногоХранилища(КлючДанных) Экспорт
    
    // В привилегированном модуле метод УстановитьПривилегированныйРежим не требуется,
    // так как весь код модуля по умолчанию выполняется с правами администратора.
    Возврат ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(КлючДанных);
    
КонецФункции

Теперь из вашего расширения, даже если оно работает в безопасном режиме, вы можете напрямую вызвать этот метод основной конфигурации:


// Модуль расширения
&НаСервере
Процедура ОбновитьНастройкиСервер()
    
    КлючДанных = "ИмяНастройкиИнтеграции";
    // Вызываем метод-обертку из основной конфигурации
    Пароль = _окПривилегированныйВызов.ПрочитатьПарольИзБезопасногоХранилища(КлючДанных);
    
    // Дальнейшая обработка полученных данных
    НастройкиПодключения.Вставить("Пароль", Пароль);
    
КонецПроцедуры

Важный совет по именованию: обязательно используйте уникальные префиксы (например, _ок, сэ_) для создаваемых методов и модулей в основной конфигурации и расширениях. Это исключит конфликты имен при последующих обновлениях конфигурации поставщика.

Решение 3. Использование профилей безопасности (Для клиент-серверного варианта)

Если ваша база данных работает под управлением сервера «1С:Предприятие» (клиент-серверный вариант), вы можете использовать штатный механизм БСП по запросу разрешений. В этом случае безопасный режим расширения отключать не требуется, но ИТ-администратор должен будет подтвердить запрос разрешений.

Рассмотрим, как правильно составить запрос разрешения на использование привилегированного режима в коде вашего расширения:


// В модуле менеджера или общем модуле расширения
Функция ПолучитьЗапросНаПривилегированныйРежим() Экспорт

    МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
    
    ОписаниеРазрешения = НСтр("ru = 'Необходимо для чтения паролей из безопасного хранилища данных.'");
    Разрешения = Новый Массив;
    
    // Создаем разрешение на использование привилегированного режима
    Разрешение = МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима(ОписаниеРазрешения);
    Разрешения.Добавить(Разрешение);
    
    // В качестве владельца указываем объект метаданных расширения
    ВладелецРазрешения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.РегистрыСведений.сэ_НастройкиИнтеграции.ПолноеИмя);
    
    Возврат МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ВладелецРазрешения, Истина);

КонецФункции

При применении данного запроса через стандартную обработку БСП (РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов) платформа автоматически создаст профиль безопасности для этого расширения на сервере 1С. После одобрения запроса администратором, платформа разрешит включение привилегированного режима методом УстановитьПривилегированныйРежим(Истина) непосредственно внутри кода расширения.

← На главную