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