Как использовать привилегированный режим в расширениях на платформе 1С:Предприятие 8.3?

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

Разработка расширений в системе «1С:Предприятие 8.3» — удобный механизм кастомизации конфигураций без изменения их типового кода. Однако при переносе логики в расширение разработчики часто сталкиваются с жесткими ограничениями безопасности платформы. Один из самых распространенных вопросов: как выполнить код без проверки прав доступа (в привилегированном режиме) внутри расширения?

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

Почему возникают сложности с привилегированным режимом в расширениях?

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

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

Выясним причину такого поведения и разберем по шагам, как решить эту проблему.

Решение 1. Отключение безопасного режима расширения

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

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

Шаг 1. Настройка в Конфигураторе

При разработке расширения в Конфигураторе откройте свойства вашего расширения (правой кнопкой мыши по корню конфигурации расширения — «Свойства»). Найдите свойство «Безопасный режим» (Safe mode) и снимите с него флажок. Также убедитесь, что снят флажок «Защита от опасных действий».

Шаг 2. Настройка в режиме «1С:Предприятие»

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

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

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


&НаСервере
Процедура ВыполнитьОперациюПодРасширеннымиПравами() Экспорт

    // Проверяем текущее состояние режима
    СтатусДоВызова = ПривилегированныйРежим();
    
    // Включаем привилегированный режим
    УстановитьПривилегированныйРежим(Истина);
    
    // Проверяем, удалось ли успешно перейти в привилегированный режим
    Если ПривилегированныйРежим() Тогда
        
        // Здесь пишем код, который должен выполниться без проверки прав доступа.
        // Например, запись в защищенный регистр сведений или чтение закрытых документов.
        ЗаписьРегистра = РегистрыСведений.ИсторияИзмененийДанных.СоздатьМенеджерЗаписи();
        ЗаписьРегистра.Период = ТекущаяДата();
        ЗаписьРегистра.Пользователь = ПараметрыСеанса.ТекущийПользователь;
        ЗаписьРегистра.Событие = "Изменение важного реквизита через расширение";
        ЗаписьРегистра.Записать();
        
    Иначе
        ВызватьИсключение "Не удалось установить привилегированный режим! Проверьте настройки безопасности расширения.";
    КонецЕсли;
    
    // Возвращаем исходное состояние режима безопасности
    УстановитьПривилегированныйРежим(СтатусДоВызова);

КонецПроцедуры

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

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

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

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

Решение 3. Вызов оригинальных методов основной конфигурации (Альтернативный путь)

Часто программисты пытаются полностью переписать или скопировать логику в расширение через директиву &Вместо, сталкиваясь с ограничениями прав. Но есть более элегантный архитектурный подход: вызывать оригинальные процедуры основной конфигурации.

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

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


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

Решение 4. Использование фоновых заданий

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

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

Разберем по шагам схему реализации через фоновые задания:

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

Рекомендации и лучшие практики безопасности

Использование привилегированного режима — это мощный инструмент, требующий высокой ответственности от разработчика. Нарушение правил его использования может привести к брешам в безопасности информационной системы. Рекомендуем соблюдать следующие правила:

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

← На главную