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