Привилегированный режим в 1С: где он включается и чем отличается от полных прав
Содержание
Привилегированный режим нельзя включить кнопкой в интерфейсе или галочкой у пользователя. Это механизм платформы, который включает программист в коде, и на время выполнения серверной процедуры 1С перестаёт проверять роли и ограничения доступа к данным. Если вам нужно «дать пользователю все права», вам нужна роль, а не привилегированный режим. Разница принципиальна, ниже разберём оба пути.
Ещё одно частое заблуждение: «привилегированный режим — это запуск 1С от администратора». Нет. Запуск от имени администратора Windows на права внутри базы не влияет. Права в 1С определяют роли пользователя, а привилегированный режим временно их обходит.
Что делает привилегированный режим и чем он отличается от роли
В обычном режиме каждое обращение к данным проходит проверку: есть ли у пользователя право на чтение, добавление, изменение, удаление. Плюс работают ограничения доступа к данным на уровне записей (RLS).
В привилегированном режиме на сервере:
- 🔓 проверка прав по ролям не выполняется;
- 🔓 ограничения доступа к данным (RLS) не применяются;
- 🔓 регистрация и запись данных идут так, как будто у пользователя полные права.
При этом сам пользователь по-прежнему остаётся собой: в журнале регистрации записи остаются под его именем, а ИмяПользователя() возвращает его логин.
| Что нужно | Что использовать | Кто настраивает |
|---|---|---|
| Пользователю нужен постоянный доступ к разделам | Роли в профиле группы доступов или в конфигураторе | Администратор |
| Код должен прочитать или записать то, к чему у пользователя нет прав | Привилегированный режим | Программист |
| Разово выполнить служебную операцию под полными правами | Отдельный администратор, а не привилегированный режим | Администратор |
| Разрешить сервису читать данные в обход ограничений | Привилегированный общий модуль | Программист |
Типовой пример. Рядовой менеджер оформляет реализацию, а программа должна обновить служебный регистр, к которому у менеджера доступа нет. Давать ему права на регистр нельзя, поэтому запись выполняется в привилегированном режиме.
Способ 1. Включение из кода: УстановитьПривилегированныйРежим
Самый распространённый вариант. Метод вызывается в серверной процедуре или функции:
Процедура ЗаписатьСлужебныеДанные()
УстановитьПривилегированныйРежим(Истина);
// Здесь права и RLS не проверяются
Набор = РегистрыСведений.СлужебныеНастройки.СоздатьНаборЗаписей();
Набор.Записать();
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Что важно знать:
- Режим действует только на сервере. В клиентском модуле метод установить его не позволит.
- Режим действует до конца процедуры или функции, в которой он включён. Выход из неё автоматически возвращает обычный режим.
- Явное выключение через
УстановитьПривилегированныйРежим(Ложь)стоит делать сразу после нужного блока: так в привилегированной части остаётся минимум кода. - Текущее состояние проверяет функция
ПривилегированныйРежим(). Она возвращаетИстина, если режим включён.
В типовых конфигурациях такой вызов обычно скрыт в служебных процедурах библиотеки стандартных подсистем, поэтому в проектах разработчики его вручную видят редко.
Включайте режим на самый короткий участок кода. Если в привилегированный блок попадёт запрос с параметром, который пришёл от пользователя, вы получите дыру в безопасности.
Способ 2. Привилегированный общий модуль
Второй вариант настраивается в конфигураторе. У общего модуля есть свойство «Привилегированный». Оно доступно для серверного модуля.
- Откройте конфигуратор и найдите общий модуль в дереве конфигурации.
- Откройте палитру свойств модуля.
- Включите флаг «Привилегированный».
- Убедитесь, что модуль вызывается на сервере (флаг «Сервер»).
Любая экспортная процедура этого модуля выполняется в привилегированном режиме от входа до выхода. Это удобно, когда нужен набор «служебных» функций без россыпи вызовов УстановитьПривилегированныйРежим.
Привилегированный модуль надо проектировать как закрытую границу. Не выносите в него функции вида «выполнить произвольный запрос» или «прочитать любой объект по ссылке». Любой вызов снаружи получит полный доступ.
Способ 3. Параметр командной строки запуска
В командной строке 1С (1cv8.exe ENTERPRISE, 1cv8c.exe) есть ключ /UsePrivilegedMode. Он нужен разработчикам и администраторам, чтобы разрешить сеансу работу с привилегированным режимом, например при отладке сценариев.
Пример строки запуска:
"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" ENTERPRISE /S"srv1c\buh" /N"Администратор" /UsePrivilegedMode
Замените 8.3.xx.xxxx на номер установленной платформы, а srv1c\buh на свой сервер и имя базы.
Как относиться к этому ключу:
- 🔧 это инструмент разработки, а не способ «выдать себе права»;
- 🔧 пользователю без нужной роли ключ интерфейсных возможностей не добавит;
- 🔧 точное поведение ключа в вашей версии платформы сверяйте со справкой по параметрам запуска.
Для пользователей ключ в ярлык не прописывайте. Обычному сотруднику он не нужен, а доступ к нему расширяет поверхность атаки.
Безопасность: чем рискуете и как ограничить
Привилегированный режим — это обход системы безопасности по задумке. Поэтому ошибки в нём стоят дороже обычных.
Типичные риски
- ⚠️ Утечка данных. Функция возвращает результат запроса, выполненного в привилегированном режиме, и вызывается из клиентского кода. Пользователь получает данные, которых видеть не должен.
- ⚠️ Подмена параметров. Условие в запросе берётся из формы без проверки.
- ⚠️ Затянутый блок. Режим включён на всю процедуру, а привилегированной нужна одна строка.
- ⚠️ Запись «от лица пользователя». Изменения проходят под логином рядового сотрудника, и разбираться в журнале регистрации потом сложно.
Как снизить риск
- Включайте режим только вокруг конкретного запроса или записи.
- Не отдавайте клиенту сырой результат привилегированного запроса: возвращайте только нужные поля.
- Проверяйте входные параметры до включения режима, а не после.
- Для опасных операций добавляйте запись в журнал регистрации с понятным текстом.
- Если требуется ограничить исполнение стороннего кода (внешние обработки, расширения из непроверенных источников), используйте безопасный режим платформы: он ограничивает действия кода независимо от ролей.
Перед правками кода в рабочей базе сделайте копию информационной базы и согласуйте изменения с регламентом компании. Привилегированный блок, добавленный второпях, может открыть данные всем пользователям.
Если режим «не работает»: типичные причины
Самая частая жалоба: вызвали УстановитьПривилегированныйРежим(Истина), а прав всё равно не хватает. Проверьте по списку.
Ещё две причины, о которых забывают:
- Включён безопасный режим. Он ограничивает действия кода и не отменяется привилегированным режимом.
- Нужна не работа с данными, а запуск действия, ограниченного самим интерфейсом: например, у команды есть собственное условие видимости.
Особенности и альтернативы для разных задач
Привилегированный режим не единственный способ расширить возможности пользователя. Чаще нужная задача решается проще.
Расширенные права через роли и группы доступа
В типовых конфигурациях с подсистемой «Управление доступом» права выдаются через профили и группы доступа. Откройте раздел Администрирование и найдите настройки пользователей и прав. Профиль объединяет роли, а пользователю достаточно назначить профиль.
Плюс подхода: вы видите, кто и что может, а изменения отражаются в журнале.
Полные права администратора
Для настройки программы и исправления данных используют отдельную учётную запись с ролью полных прав. Держите её для администраторов, ежедневную работу ведите под обычной учёткой.
Внешние обработки и расширения
Если вам советуют «поднять» права внешней обработке, остановитесь. Обработка с чужим кодом в привилегированном режиме может прочитать и изменить любые данные. Запускайте такие файлы в безопасном режиме и включайте только проверенные.
Что менять в разных конфигурациях
Механизм платформенный, поэтому в Бухгалтерии, ЗУП, УТ и ERP он одинаков. Различается только то, как в конкретной конфигурации устроены группы доступа и модули. Для типовых решений с подсистемами БСП вызывать УстановитьПривилегированныйРежим напрямую часто не нужно: в библиотеке есть служебные функции, которые сами управляют режимом.
Практический пример: безопасная серверная функция
Задача: менеджер открывает форму заказа, а программа должна показать ему общий остаток по складам, хотя права на регистр остатков у него ограничены. Правильная схема такая.
&НаСервереБезКонтекста
Функция ОбщийОстаток(Номенклатура)
Остаток = 0;
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Остатки.КоличествоОстаток), 0) КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК Остатки";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Остаток = Выборка.Количество;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Возврат Остаток;
КонецФункции
Что здесь сделано правильно:
- Наружу уходит одно число, а не таблица со всеми складами и ценами.
- Параметр запроса передаётся через
УстановитьПараметр, а не склеивается в текст. - Режим выключается сразу после запроса.
Имена регистра и поля в примере условные: подставьте свои. Если у пользователя нет права на сам справочник номенклатуры, проверьте, что ссылка пришла из формы, где он её уже видит.
Как проверить, что режим не открыл лишнего
После внедрения проверьте поведение под рядовой учётной записью, а не под администратором. Под администратором ошибки прав незаметны.
- Войдите пользователем с минимальным профилем, который реально работает с этой функцией.
- Выполните сценарий и убедитесь, что нужный результат появился.
- Попробуйте открыть связанные данные напрямую: список регистра, отчёт, карточку объекта. Доступ должен остаться закрытым.
- Просмотрите журнал регистрации за период теста и найдите свои сообщения о служебных операциях.
Если обход прав «протёк» в соседние формы, значит привилегированный блок слишком широкий или результат возвращается клиенту целиком.
Чек-лист перед использованием
Частые вопросы
Можно ли включить привилегированный режим обычному пользователю в настройках?
Привилегированный режим даёт доступ к конфигуратору?
Как понять, включён ли режим сейчас?
ПривилегированныйРежим() в серверном коде. Она вернёт Истина, если режим активен.