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

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

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

Мы подробно разберем, как решить эту задачу, используя штатные механизмы платформы и Библиотеки Стандартных Подсистем (БСП), а также рассмотрим методы программной диагностики.

Понимаем иерархию доступа в ERP-системах

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

  1. Пользователь включается в Группу доступа (или несколько групп).
  2. Каждой Группе доступа назначен определенный Профиль групп доступа.
  3. Профиль содержит набор Ролей (объектов метаданных конфигурации).
  4. Именно Роль дает право на чтение, просмотр или изменение конкретного документа.

Таким образом, наша задача по поиску «утечки» прав делится на три этапа: найти Роль → найти Профиль → найти Группу доступа пользователя — удобнее через инструмент настройки и аудита прав в 1С:ERP.

Способ 1: Использование стандартных отчетов (БСП)

Многие специалисты сразу идут в Конфигуратор или ищут внешние обработки для поиска ролей и объектов, забывая, что в подсистеме «Управление доступом» уже есть мощные инструменты анализа. Давайте рассмотрим, как ими пользоваться.

В разделе Администрирование — Настройки пользователей и прав (путь может отличаться в зависимости от релиза, часто находится в группе отчетов администратора) существуют два ключевых отчета:

1. Отчет «Права ролей»

Этот отчет позволяет идти «от объекта». Это самый быстрый способ понять, какие роли вообще теоретически могут видеть нужный нам документ.

Мы должны:

  1. Открыть отчет ПраваРолей.
  2. В настройках отбора указать интересующий нас объект метаданных (например, Документ «Расходный кассовый ордер»).
  3. Сформировать отчет.

Система выведет список всех ролей, у которых установлены флаги «Чтение» или «Просмотр» для этого документа. Это позволит нам сузить круг поиска с тысяч ролей до нескольких десятков.

2. Отчет «Анализ прав доступа» — есть универсальный отчет анализа прав доступа и ролей

Этот инструмент позволяет идти «от пользователя». Если мы знаем конкретного «Закупщика», который видит лишнее, мы можем проанализировать именно его.

Алгоритм действий:

  1. В отчете выбираем пользователя.
  2. Настраиваем отбор по объекту доступа (наш документ).
  3. Отчет покажет сводную таблицу: через какую Группу доступа и какой Профиль пользователю «прилетает» право.

Способ 2: Программный поиск (Консоль кода)

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

Разберем скрипт, который перебирает все роли конфигурации и проверяет их права на конкретный документ. Этот код можно выполнить в любой обработке, поддерживающей выполнение алгоритмов на встроенном языке.

Пример кода для поиска ролей, дающих право чтения документа:


// Укажем имя искомого документа, как оно задано в Конфигураторе
ИмяДокумента = "РасходныйКассовыйОрдер"; 
ОбъектМетаданных = Метаданные.Документы[ИмяДокумента];

Сообщить("Поиск ролей с правом ЧТЕНИЕ для документа: " + ИмяДокумента);

// Перебираем все роли в метаданных конфигурации
Для Каждого Роль Из Метаданные.Роли Цикл
    
    // Проверяем наличие права "Чтение" у данной роли для нашего документа
    // Важно: мы проверяем абстрактную роль, а не права текущего пользователя
    Если ПравоДоступа("Чтение", ОбъектМетаданных, Роль) Then
        Сообщить("Роль дает доступ: " + Роль.Имя + " (" + Роль.Синоним + ")");
    КонецЕсли;
    
КонецЦикла;

После выполнения этого кода мы получим список ролей. Далее нам останется выяснить, какая из этих ролей есть у нашего пользователя. Для этого можно доработать код, проверяя наличие роли у конкретного пользователя ИБ:


ИскомыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ИскомыйПользователь = Неопределено Тогда
    Возврат;
КонецЕсли;

// Получаем роли пользователя
РолиПользователя = ИскомыйПользователь.Роли;

Для Каждого Роль Из Метаданные.Роли Цикл
    // Если роль есть у пользователя И она дает право на документ
    Если РолиПользователя.Содержит(Роль) И ПравоДоступа("Чтение", Метаданные.Документы.РасходныйКассовыйОрдер, Роль) Тогда
        Сообщить("У пользователя есть роль: " + Роль.Имя);
    КонецЕсли;
КонецЦикла;

Способ 3: Анализ через Конфигуратор

Хотя этот метод был упомянут как трудоемкий, иногда он необходим для глубокого анализа, особенно если права выданы неявно.

В окне «Все роли» (All Roles) можно установить фильтр по объектам. Однако в конфигурациях уровня ERP это может работать медленно. Важный нюанс при работе с конфигуратором:

Учитывайте расширения конфигурации!

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

Особенности RLS (Ограничение на уровне записей)

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

Если пользователь видит документ, который видеть не должен, но сама роль ему необходима, проблему нужно решать через RLS (Record Level Security).

Давайте проверим следующие моменты:

  1. Не включен ли пользователь в предопределенную группу доступа (например, «Администраторы» или локальную группу с полными правами)? В ряде случаев такие группы игнорируют настройки RLS.
  2. Есть ли в системе «глобальные» роли, такие как ЧтениеДанныхБухгалтерии без ограничений? В ERP УХ часто существуют дублирующие роли: одна с RLS (например, ЧтениеЗаявокНаОплатуПоПодразделениям), а другая без (просто ЧтениеЗаявокНаОплату). Если пользователю выданы обе — сработает та, что дает больше прав (доступ по «ИЛИ»).

Использование внешних инструментов

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

Их использование оправдано, если:

Резюме по решению проблемы

Чтобы закрыть нежелательный доступ, выполним следующие шаги:

  1. С помощью отчета «Анализ прав доступа» или консоли кода выясняем, какая конкретно Роль дает право просмотра документа пользователю.
  2. В справочнике «Профили групп доступа» через поиск находим Профиль, в который включена эта роль.
  3. Проверяем, является ли эта роль лишней в данном профиле для всех пользователей, или только для конкретного сотрудника.
    • Если для всех: отключаем роль в Профиле.
    • Если только для одного: создаем новый Профиль (копированием), исключаем лишнюю роль и переводим пользователя в новую Группу доступа с новым Профилем.
← На главную