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

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

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

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

Способ 1. Использование метода УстановитьПривилегированныйРежим()

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

Рассмотрим ключевые особенности работы данного метода:

  1. Контекст выполнения: Метод может вызываться только на стороне сервера, во внешнем соединении или в модуле внешнего соединения. Вызов на тонком или веб-клиенте вызовет синтаксическую ошибку или исключение времени выполнения.
  2. Стековая природа: Вызовы метода накапливаются. Если мы включили привилегированный режим вызовом УстановитьПривилегированныйРежим(Истина), режим будет действовать до тех пор, пока не будет вызван парный метод УстановитьПривилегированныйРежим(Ложь) либо пока не завершится текущая серверная процедура/функция.
  3. Безопасность при ошибках: Чтобы гарантировать корректное отключение режима даже при возникновении непредвиденных исключений, код создания объекта рекомендуется помещать в конструкцию Попытка ... Исключение.

Посмотрим на пример правильной программной реализации на сервере:


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

Способ 2. Вынос логики в привилегированный общий модуль (Стандарт 1С)

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

Разберем по шагам, как это реализовать:

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

Посмотрим на пример кода внутри привилегированного общего модуля:


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

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


&НаСервере
Процедура ВыполнитьСоздание()
    Параметры = Новый Структура("Организация, СуммаДокумента", ВыбОрганизация, ИтоговаяСумма);
    СсылкаНаДокумент = ДокументыСлужебныеПривилегированный.СоздатьДокументБезПроверкиПрав(Параметры);
КонецПроцедуры

Способ 3. Разделение интерактивных и программных прав в ролях

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

Рассмотрим, как настроить права в конфигураторе:

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

Важное ограничение: данный способ подходит только в том случае, если пользователю не запрещено читать эти данные программно. Если же накладывается жесткое ограничение RLS или полное отсутствие права Чтение, потребуется использовать Способ 1 или Способ 2.

Нюансы работы во внешних обработках и расширениях

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

В безопасном режиме действуют строгие системные ограничения:

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

Для создания документов без прав из внешней обработки необходимо:

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

Итоги и рекомендации

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

← На главную