Как включить привилегированный режим во внешней обработке 1С для обхода ограничений RLS

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда механизмы ограничения доступа на уровне записей (RLS) мешают выполнению специфических бизнес-задач. Типичный пример — необходимость пробития чека в рабочем месте кассира (РМК) по заказу другого подразделения, доступ к которому у текущего пользователя ограничен. Рассмотрим подробно, как правильно использовать привилегированный режим во внешних обработках, чтобы обойти эти ограничения, и почему стандартные методы могут не срабатывать.

Разбор проблемы: почему УстановитьПривилегированныйРежим не работает сразу

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

  1. Безопасный режим: По умолчанию внешние обработки, запускаемые через справочник "Дополнительные отчеты и обработки", работают в безопасном режиме. В этом режиме платформа блокирует любые попытки повышения привилегий.
  2. Клиентский контекст: Метод установки привилегированного режима работает исключительно на стороне сервера. Попытка вызвать его в процедуре с директивой &НаКлиенте не приведет к результату.
  3. Область действия: Привилегированный режим не включается для "пользователя вообще". Он действует только в рамках текущего стека вызовов конкретной серверной процедуры.

Шаг 1. Настройка запуска внешней обработки

Первым делом выясним, как запустить обработку так, чтобы она имела право запрашивать привилегии. Если мы используем типовую конфигурацию (например, УТ 11, ERP или КА), обработка подключается через механизм БСП. Чтобы отключить ограничения, выполним следующие действия:

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

Важно помнить: если вы просто открываете обработку через Файл -> Открыть под пользователем с ограниченными правами, платформа также может наложить ограничения безопасного режима в зависимости от настроек конфигурации.

Шаг 2. Правильная реализация кода на сервере

Рассмотрим пример кода, который должен быть размещен в модуле объекта внешней обработки или в серверном контексте её формы. Для того чтобы RLS перестал действовать на запрос, необходимо включить режим до выполнения самого запроса. Проанализируем следующий пример:


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

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

Шаг 3. Использование привилегированных общих модулей

Если задача масштабная (например, как в случае с доработкой РМК), прописывать установку режима в каждой процедуре неудобно. Рассмотрим более архитектурно правильный подход:

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

Особенности работы с RLS и производительностью

Выясним причину, почему использование привилегированного режима часто ускоряет работу системы. Когда RLS активен, платформа 1С при каждом запросе к базе данных SQL дописывает к вашему тексту "хвост" из условий. Это могут быть сложные подзапросы, проверяющие права пользователя на каждое подразделение, организацию или контрагента.

Установка режима УстановитьПривилегированныйРежим(Истина) заставляет платформу генерировать чистый SQL-запрос без этих надстроек. В высоконагруженных системах с большим количеством ограничений доступа это может ускорить выборку данных в 2–10 раз.

Критически важные нюансы

Проанализируем моменты, которые часто упускают из виду:

Резюме для реализации в РМК

Посмотрим на ситуацию автора вопроса: нужно пробивать чеки по чужим подразделениям. Оптимальный алгоритм действий будет выглядеть так:

  1. Зарегистрировать внешнюю обработку (или расширение) в системе с отключенным безопасным режимом.
  2. В модуле серверной части обработки создать процедуру, которая принимает ссылку на заказ.
  3. Внутри этой процедуры вызвать УстановитьПривилегированныйРежим(Истина).
  4. Выполнить все необходимые действия с объектом (создание чека, проведение, печать), используя объектную модель (ПолучитьОбъект()) или запросы.
  5. После завершения операций режим снимется автоматически, и пользователь снова окажется в рамках своих обычных прав RLS.

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

← На главную