Привилегированный модуль 1С и роль «Чтение»: почему ПравоДоступа не защищает
Администрирование - Роли и права
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Что может сделать пользователь с ролью «Чтение», если в конфигурации есть привилегированный модуль, и что может расширение: опыт на 1С 8.3.27 и «Нано-УТ», вывод платформы по каждому вызову и скрипт на Python, который ищет такие места в выгрузке конфигурации и расширения.
- Внутри привилегированного модуля ПравоДоступа на стенде вернула «Да» для читателя; роли проверяют через РольДоступна либо в обычном модуле до вызова.
- Привилегированный общий модуль в расширении платформа не загружает (код возврата 101).
- Привилегии расширения зависят от свойства «Безопасный режим»: при значении «Да» режим не включается, при «Нет» включается.
- Безопасный режим расширения не хранится в выгрузке в файлы: его читают из базы через РасширенияКонфигурации.Получить().
- Скрипт ищет флаги модулей, включение режима без проверки, Выполнить и склеенные запросы; решение остаётся за человеком.
Опасность привилегированного режима определяют роли, место проверки прав и свойство расширения «Безопасный режим»; проверять их нужно пользователем с урезанной ролью.
Для кого: администраторы и разработчики 1С, которые проверяют конфигурации и расширения на обход прав пользователей.
- Стенд
- Что может привилегированный модуль пользователю с ролью «Чтение»
- Проверка прав внутри привилегированного модуля
- Что ограничивает вызывающего
- Как безопасный режим расширения влияет на привилегии
- Привилегированный модуль в расширении
- Как найти такие места: скрипт
- Что скрипт нашёл на стенде
- Что не проверялось
- Итог
- Источники
- Файл к статье
Привилегированный режим отключает проверку прав для кода, который в нём выполняется. Я проверила опытом, что получит пользователь с ролью «Чтение», если в конфигурации есть привилегированный модуль, помогает ли проверка ПравоДоступа внутри такого модуля и что умеет расширение, которому платформа привилегированный модуль не разрешает. Опыты шли на «Нано-УТ 2.0», платформа 1С 8.3.27.2130, база файловая, пользователей два: admin с ролью «Администратор» и reader с ролью «Чтение».
Результат. Привилегированный модуль с флагом «Вызов сервера» позволил читателю переименовать контрагентов. Проверка ПравоДоступа внутри привилегированного модуля вернула «Да» и ничего не остановила; проверка РольДоступна и роль в обычном модуле остановили. Расширение с включённым безопасным режимом привилегий не получило ни прямым включением, ни вызовом привилегированного модуля основной конфигурации. С выключенным безопасным режимом то же расширение записало данные от имени читателя и выполнило переданный ему код. Чтобы находить такие места в выгрузке конфигурации и расширения, я написала скрипт на Python; в конце есть его результат на стенде.
Стенд
| Условие | Значение |
|---|---|
| Платформа | 1С:Предприятие 8.3.27.2130 (x86), файловая база, подключение через COM (внешнее соединение) |
| Конфигурация | «Нано-УТ 2.0» (наша учебная торговая конфигурация) плюс служебные общие модули стенда: четыре модуля, привилегированные и обычные (ПривСервис, ПривПроверкаПрав, ПривПроверкаРолей, ПривСтенд) |
| Расширение | АудитРасш: три общих модуля, создано из файла .cfe и загружено пакетным Конфигуратором |
| Пользователи | admin - роль «Администратор»; reader - роль «Чтение» (в роли справочники «Контрагенты» и «Склады» только для чтения, удаление запрещено) |
| Компьютер | Intel Core i5-2400 3,1 ГГц (4 ядра, 2011 год), 7,9 ГБ ОЗУ, SATA SSD, Windows 11 Pro. Компьютер рабочий: во время опытов были открыты браузер и приложение Claude |
Время работы здесь не замерялось: опыты отвечают на вопрос «пропустит или нет», скорость в них не участвует.

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

Платформа отказала: у роли «Чтение» нет права добавления. Теперь вызов метода общего модуля ПривСервис с флагами «Привилегированный» и «Вызов сервера». Метод переименовывает контрагента и никаких проверок не делает:

Читатель записал элемент справочника, на который у его роли нет права записи. Флаг «Вызов сервера» делает метод доступным клиентскому коду, поэтому в рабочей конфигурации такой метод можно вызвать из клиентской формы; этот путь я не проверяла. В моих опытах вызов шёл через внешнее соединение, код модуля выполнялся на сервере.
Проверка прав внутри привилегированного модуля
Естественная защита: в начале метода спросить платформу, может ли пользователь изменять справочник.
Модуль привилегированный, и внутри него проверка ничего не ограничила:

ПравоДоступа ответила «Да» для пользователя, у которого права на изменение нет: внутри привилегированного модуля работает привилегированный режим, и ПривилегированныйРежим() возвращает «Да». Исключение не сработало: в коде проверка есть, а читателя она не остановила.
Что ограничивает вызывающего
На стенде читателя остановили такие варианты.
| Вариант | Читатель reader |
Администратор admin |
|---|---|---|
РольДоступна(Метаданные.Роли.Администратор) внутри привилегированного модуля |
отказ: исключение «нужна роль Администратор» | выполнено |
ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(...) внутри привилегированного модуля |
отказ | выполнено |
ПравоДоступа в обычном модуле до вызова привилегированного (на стенде модуль расширения РасшОбертка) |
отказ: «Недостаточно прав для изменения контрагентов» | не запускалось |
В обычном модуле проверка видит права пользователя:

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

Режим не включился, и даже привилегированный модуль основной конфигурации, вызванный из расширения, выполнил запись без привилегий. Через вызов расширения привилегии не передаются.
Безопасный режим выключен (администратор переключил свойство расширения средствами платформы):

Тот же код расширения без единой правки сделал всё: включил режим, записал контрагентов и по команде строки создал в справочнике «Склады» пустой элемент от имени читателя. В журнале основного прогона (evidence/experiments.txt, раздел 3) список складов до выполнения кода пуст (РЕЗУЛЬТАТ: 0:), после него - один элемент (РЕЗУЛЬТАТ: 1:). В основной конфигурации обычный модуль включает режим без ограничений: ПривСтенд.РежимПослеВключения() вернул «Да».
Для аудита расширений это значит, что код расширения ничего не говорит об опасности: её определяет свойство «Безопасный режим», а его в выгрузке расширения в файлы нет. Я выгрузила расширение командой DumpConfigToFiles -Extension и поискала в каталоге слова safe и «безопас»: совпадений не нашлось. Значение читают из базы: РасширенияКонфигурации.Получить(), свойство БезопасныйРежим.
Привилегированный модуль в расширении
Платформа не позволяет сделать привилегированным общий модуль расширения. Я собрала такой вариант расширения и загрузила его в Конфигуратор:

Код возврата 101, расширение не загрузилось. Собственного привилегированного модуля у расширения быть не может. Привилегии оно получает включением режима в своих обычных модулях или вызовом привилегированного модуля основной конфигурации, и оба пути закрывает безопасный режим.
Как найти такие места: скрипт
Скрипт priv_audit.py читает выгрузку конфигурации или расширения (XML и BSL), ничего не меняет и печатает замечания с уровнем:
| Код | Что ищет | Уровень |
|---|---|---|
| P1 | модуль с флагами «Привилегированный» и «Вызов сервера» | критический |
| P2 | экспортный метод привилегированного модуля без проверки прав | высокий |
| P8 | проверка ПравоДоступа внутри привилегированного модуля (на стенде вернула «Да») |
высокий |
| P3 | УстановитьПривилегированныйРежим(Истина) в экспортном методе без проверки прав раньше включения |
высокий |
| P4 | режим включён и не выключен в том же методе | средний |
| P5 | обработчик подписки на событие в привилегированном модуле | высокий |
| P6 | Выполнить, Вычислить, операции с файлами, запуск программ, COM и HTTP в привилегированном контексте |
высокий |
| P7 | текст запроса, склеенный со строкой, в привилегированном контексте | высокий |
| P0 | справка: каталог распознан как выгрузка расширения, безопасный режим проверять в базе | низкий |
Проверка РольДоступна и ролей пользователя информационной базы считается защитой, потому что на стенде она остановила читателя. Скрипт разбирает текст регулярными выражениями без синтаксического дерева. Он не идёт по цепочке вызовов, не видит метод, который вызывается через Выполнить, и может принять за защиту любую проверку, стоящую в начале метода.
Код возврата 0 означает, что замечаний выше порога нет, 1 - есть, 2 - ошибка запуска, поэтому скрипт можно поставить в проверку перед коммитом.
Что скрипт нашёл на стенде
«Нано-УТ 2.0» целиком (81 файл BSL, 212 XML) он разобрал без замечаний: в конфигурации нет привилегированных модулей и вызовов УстановитьПривилегированныйРежим. Выгрузка основной части стенда:

В журнале в архиве у каждого замечания есть вторая строка с пояснением, ключ --brief печатает только первую. Замечания P1 и P2 указывают на метод, которым читатель переименовал контрагентов, P8 на проверку ПравоДоступа, P6 на Выполнить. По расширению АудитРасш скрипт выдал три замечания P3 (включение режима без проверки раньше включения), три P4, замечание P6 на РасшВыполнение.ВыполнитьКод и справку P0. Включён ли безопасный режим, скрипт не знает и пишет об этом в справке P0.
Подписка на событие ПриЗаписи справочника «Контрагенты» с обработчиком в привилегированном модуле показана скриптом (P5) по XML-файлу подписки в примере. Платформа подписку в расширение не приняла и ответила «Имя события должно быть задано»; я предположила, что причина в отсутствии в расширении заимствованного справочника «Контрагенты», но проверить это не успела; журнал этой попытки в архив не вошёл. Поведение P5 на платформе я не проверяла.
Что не проверялось
- Тонкий клиент, веб-клиент, HTTP-сервисы и фоновые задания: вызовы шли из внешнего соединения.
- Расширения, в которых заимствован и изменён привилегированный модуль основной конфигурации (перехватчики «Перед», «После», «Вместо»). Попытка сделать так на стенде не сработала, причину я не разбирала, журнал попытки в архив не вошёл.
- Расширения ограниченного назначения (исправление, добавление) и поведение при безопасном режиме расширения на платформе ниже 8.3.27.
- Права на уровне записей (RLS), профили безопасности кластера и режим защиты от опасных действий.
- Подписки на события и регламентные задания с привилегированными обработчиками: подписку проверял только скрипт по XML.
- Большие конфигурации: скрипт запущен на «Нано-УТ» и на стенде, типовые УТ и ERP не разбирались.
Итог
Код привилегированного модуля выполняется без проверки прав для любого, кто может его вызвать, и проверка ПравоДоступа внутри такого модуля не помогает: на стенде она возвращала «Да» для читателя. Защитой оказались РольДоступна, роли пользователя информационной базы и проверка в обычном модуле до вызова. У расширения безопасный режим закрывает и прямое включение привилегированного режима, и вызов привилегированного модуля основной конфигурации; выключенный безопасный режим возвращает расширению все права, и в файлах выгрузки этого свойства нет. Скрипт в архиве находит подозрительные места, но решает человек, и перед выводами нужно проверять конфигурацию так же, как здесь: пользователем с урезанной ролью.
Источники
- ИТС, стандарт «Использование привилегированного режима»
- ИТС, БСП 3.2.1, «Разрешение на использование привилегированного режима» (раздел документации)
- Infostart, «Как ограничить "кривые руки" с полными правами или нужны ли в 1С супер-права?» (проверки ПравоДоступа и РольДоступна в связке)
- Infostart, форум, обсуждение безопасного режима и расширения для выгрузки данных
Файл к статье
Архив privileged-audit-companion.zip (стенд от 22.10.2026):
priv_audit.py: скрипт, только стандартная библиотека Python 3.9+;test_priv_audit.py: 15 тестов логики;verify.py: проверка без платформы;examples: выгрузки модулей стенда и расширения, на которых скрипт даёт замечания;stand: сборка конфигурации и расширения, пользователи, файлАудитРасш.cfe, скриптrun_experiments.py, который повторяет все опыты из статьи (нужны платформа 8.3.27 x86 и «Нано-УТ 2.0»);evidence: журнал опытов и результаты скрипта.
Архив проверен из чистой распаковки: python verify.py проходит без платформы, run_experiments.py повторил журнал опытов на новой базе. README.md описывает порядок работы.
Вступайте в нашу телеграмм-группу Инфостарт