Как записать элемент справочника программно, если у пользователя нет прав доступа?

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

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

Использование привилегированного режима

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

Важно помнить, что привилегированный режим работает только на сервере. Для корректной работы необходимо выполнить следующие условия:

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

Разберем пример реализации:


Процедура ЗаписатьСправочникПривилегированно(СсылкаНаОбъект, НовыеДанные) Экспорт
    УстановитьПривилегированныйРежим(Истина);
    
    Объект = СсылкаНаОбъект.ПолучитьОбъект();
    Объект.Реквизит = НовыеДанные;
    Объект.Записать();
    
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

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

Применение режима обмена данными

Если привилегированный режим не дает желаемого эффекта или вы хотите пропустить проверки, которые срабатывают в модуле объекта при записи (например, проверки заполнения реквизитов или подписки на события), можно воспользоваться свойством ОбменДанными.Загрузка.

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

Пример использования:


Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Объект.Реквизит = Значение;
Объект.Записать();

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

Архитектурный подход к решению проблемы

Часто задача возникает из-за того, что бизнес-процесс требует записи в справочник, хотя пользователь не должен иметь к нему прямого доступа. Вместо обхода прав доступа через программные «заплатки», рассмотрите альтернативные архитектурные решения:

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

← На главную