Отличить наличие роли от права чтения пользователя

Учебные задачи

ПолныеПрава существует в метаданных. Это не означает, что роль назначена текущему пользователю; обе проверки выполняются отдельно.

Где и как запускать

Полный серверный модуль изолированной учебной копии КА2 Progress 2.5.20.75; только чтение.

Подготовка

  1. Отдельная учебная копия КА2 Progress 2.5.20.75 из C:\claude\KA2\Progress\XML_CF_KA2_PROGRESS, платформа 8.5.1.1343. Создайте серверный общий модуль УчебныеКонтрактыОбработчиков.

  2. Вставьте полный модуль одного урока и вызовите УчебныеКонтрактыОбработчиков.ВыполнитьПример() из своей учебной серверной команды.

  3. Источники: Roles\ПолныеПрава.xml; EventSubscriptions\АктуализироватьСтруктуруПредприятия.xml; ScheduledJobs\АнализДанныхДляОповещенийКлиентам.xml и соответствующие CommonModules.

  4. Код только читает метаданные и признаки прав. Он не назначает роли, не меняет параметры сеанса, не записывает организацию и не вызывает обработчик подписки или задания.

  5. Учебная копия должна быть изолирована от рабочих фоновых заданий и внешних обменов её обычными средствами администрирования. Этот пример не выключает и не включает задания за пользователя.

  6. Диагностика расширений и доступных прав зависит от активной базы и пользователя. Не подгоняйте права рабочей базы под ожидаемые булевы результаты.

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

КонецПроцедуры

Разбор по шагам

  1. Найти реальную роль ПолныеПрава и метаданные Номенклатура.

  2. Прочитать Роль.Права: по контракту это всегда Неопределено, не таблица доступов и не неисправность роли.

  3. Через РольДоступна проверить активность этой роли у текущего пользователя. Через ПравоДоступа отдельно получить признак чтения справочника.

  4. Вывести паспорт роли и происхождение расширений. Никаких пользователей, профилей или ролей не менять.

Как проверить результат

  1. Пять фиксированных проверок дают Истина; РольАктивна и ЕстьЧтение выводятся как диагностика и могут быть Ложь.

  2. У пользователя без ПолныеПрава роль всё равно найдётся в метаданных. Это наглядно разделяет описание и фактический доступ.

Ожидаемый результат

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

На что обратить внимание

  1. ПравоДоступа не доказывает доступ к конкретной записи с ограничениями RLS.

  2. Не включайте привилегированный режим ради положительного результата: это изменит смысл проверки.

  3. Синоним Полные права — не имя роли. Для поиска используется ПолныеПрава.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.