Как программно создать документ в 1С без прав доступа и обойти ошибку «Нарушение прав доступа!»?

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

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

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

Проанализируем архитектурные особенности платформы 1С:Предприятие. Главная причина, по которой программное повышение прав не срабатывает, кроется в контексте выполнения кода. Если ваша база работает в клиент-серверном варианте (а именно так работает подавляющее большинство современных систем), вызов метода УстановитьПривилегированныйРежим на стороне клиента полностью игнорируется платформой.

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

Правильный паттерн программного создания объектов

Выясним причину ошибки: когда у пользователя нет прав на добавление документа, вызов Документы.ПоступлениеТоваровУслуг.СоздатьДокумент() на клиенте мгновенно спровоцирует исключение. Чтобы обойти это ограничение, перенесем всю логику инициализации, заполнения и записи документа в серверную процедуру.

Согласно стандартам разработки (ИТС), включать привилегированный режим следует точечно, чтобы остальной код не терял возможности проверки прав. Посмотрим на пример корректного использования:


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

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

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

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

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

Любой код, выполняемый внутри такого модуля, автоматически игнорирует проверку прав доступа, включая ограничения на уровне записей (RLS). Это избавляет от риска забыть отключить привилегированный режим или оставить уязвимость при возникновении ошибки в процессе выполнения блока кода.

Ограничения Безопасного режима

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

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

Интерактивные права против программных

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

Если вы успешно создали и записали документ программно (через серверный вызов без проверки прав), но после этого попытаетесь открыть его форму пользователю, у которого нет права «Просмотр» на этот вид документа, платформа выдаст ту же самую ошибку «Нарушение прав доступа!» уже на этапе отрисовки пользовательского интерфейса. Поэтому заранее продумывайте логику: если пользователь не должен видеть этот документ, не пытайтесь открывать его форму после создания.

← На главную