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

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Шаг 1. Локализация ошибки с помощью Журнала регистрации

Прежде чем приступать к написанию кода или изменению ролей пользователей, нам необходимо точно выяснить, на какой именно объект конфигурации у пользователя не хватает прав. В крупных базах ручной поиск по коду может затянуться, поэтому применим самый быстрый и надежный инструмент администратора — Журнал регистрации.

Для этого выполним следующие действия:

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

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

Шаг 2. Разбор проблемы: почему УстановитьПривилегированныйРежим(Истина) не работает на клиенте

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


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

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

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

Шаг 3. Влияние безопасного режима на внешние обработки

Вторая и самая важная причина неудачи заключается в безопасном режиме (Safe Mode) платформы 1С. Когда обычный пользователь без полных прав интерактивно открывает внешнюю обработку через стандартное меню Файл -> Открыть, система автоматически запускает её в безопасном режиме.

В безопасном режиме платформа накладывает жесткие ограничения на операции:

Развенчание мифа о свойстве ОбменДанными.Загрузка = Истина

Рассмотрим популярное заблуждение среди начинающих программистов 1С, связанное со строкой Движения.ОбменДанными.Загрузка = Истина;. Бытует мнение, что этот флаг позволяет обойти RLS и записать данные без проверки прав доступа.

Важно понимать: данное свойство предназначено исключительно для отключения прикладных проверок бизнес-логики, написанных разработчиками конфигурации (например, в обработчиках событий ПередЗаписью или ПриЗаписи в модулях наборов записей или документов). Оно не отменяет системные проверки ролей платформы и ограничения прав на уровне записей RLS. Если у пользователя в его ролях нет прав на изменение регистра, запись все равно будет заблокирована платформой.

Способы решения проблемы

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

Способ 1. Регистрация внешней обработки в справочнике БСП

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

Разберем алгоритм настройки по шагам:

  1. В модуле объекта нашей внешней обработки определим экспортную функцию СведенияОВнешнейОбработке().
  2. В параметрах регистрации укажем отключение безопасного режима, установив флаг БезопасныйРежим = Ложь. Посмотрим на пример кода:

Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
    ПараметрыРегистрации.Вставить("Наименование", "Корректировка проводок (привилегированная)");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); // Отключаем безопасный режим!
    
    // Добавление команд и прочих параметров БСП...
    Возврат ПараметрыРегистрации;
КонецФункции
  1. Администратор системы загружает обработку в базу через пользовательский интерфейс. Поскольку флаг безопасности установлен в Ложь, система потребует подтверждения доверия к этому файлу.
  2. Теперь, когда обработка запускается из справочника дополнительных обработок вне безопасного режима, её серверный код получает возможность использовать привилегированный режим. Вся логика по подготовке данных и записи проводок должна быть вынесена из модуля формы в модуль объекта обработки и запускаться на сервере.

Способ 2. Выполнение серверного кода через фоновое задание

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

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

  1. В модуле объекта внешней обработки пишем процедуру, которая выполняет запись движений в привилегированном режиме.
  2. На клиенте в форме обработки запускаем эту процедуру как фоновое задание с помощью метода ФоновыеЗадания.Выполнить().
  3. Фоновое задание отрабатывает на сервере с административными правами, успешно обходя RLS, и завершает запись движений.

Способ 3. Перенос логики в привилегированный общий модуль конфигурации

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

Выполним следующие действия:

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

Архитектурные рекомендации по работе с движениями регистра

В заключение проанализируем важный архитектурный аспект разработки в среде 1С. Прямая запись движений в регистры бухгалтерии или накопления в обход стандартного проведения документов-регистраторов считается крайне нежелательной практикой.

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

← На главную