Как определить разницу в правах доступа между несколькими ролями и новой ролью в 1С:Предприятии?

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

При работе с системой 1С:Предприятие разработчики и администраторы часто сталкиваются с необходимостью тонкой настройки прав доступа. Одной из распространенных и нетривиальных задач является выявление влияния новой роли на уже существующий набор прав пользователя. Представим ситуацию: у пользователя есть N ролей, и какое-то действие ему запрещено. Если мы добавим пользователю еще одну роль, назовем ее ролью X, это действие становится доступным. Как быстро и эффективно понять, какие именно настройки в роли X влияют на доступность этого действия?

Сложность задачи усугубляется тем, что действие может быть связано не с одним объектом, а затрагивать множество элементов конфигурации, включая даже свойства конфигурации. Простой просмотр роли X в конфигураторе не дает полной картины, поскольку нам нужно сравнить права роли X не с пустым набором, а с объединенными правами всех N ролей, которые уже есть у пользователя.

Рассмотрим различные подходы и методы, которые могут помочь в решении этой проблемы, начиная от встроенных средств 1С до ручных решений и сторонних инструментов.

Метод 1: Ручной анализ с помощью "Все роли" и "Вывести список"

Начнем с анализа возможностей, которые предоставляет нам сам конфигуратор 1С:Предприятия.

1. Редактор "Все роли"

В платформе 1С:Предприятие существует удобный редактор, который позволяет одновременно просматривать и изменять состав прав для нескольких или всех ролей. Чтобы его открыть, нам следует перейти в ветку конфигурации "Роли", нажать правой кнопкой мыши (ПКМ) и выбрать пункт "Все роли".

  1. Откройте конфигуратор 1С.
  2. В дереве конфигурации найдите ветку "Роли".
  3. Нажмите ПКМ на ветке "Роли" и выберите "Все роли".

В открывшемся окне мы увидим список всех объектов метаданных и для каждого объекта — колонки с правами доступа по всем ролям. Этот редактор удобен для визуального сравнения и быстрого изменения прав. Мы можем выделить нужные N ролей и роль X и просмотреть их права бок о бок.

Однако, у этого метода есть существенные ограничения для нашей задачи:

2. Метод "Вывести список"

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

  1. Выбрать каждую из N ролей и роль X по отдельности.
  2. Для каждой выбранной роли вызвать контекстное меню (ПКМ) и выбрать пункт "Вывести список...".
  3. Сохранить полученный список прав (обычно в формате MXL или текстовый файл).
  4. Затем использовать внешний инструмент для сравнения файлов (например, WinMerge, Beyond Compare) для поиска различий между списками.

Этот способ хорошо работает, если нам нужно сравнить права всего двух ролей. Но в нашем случае, когда необходимо сравнить одну роль (X) с объединением из 12 (или более) других ролей, метод становится крайне трудоемким. Нам пришлось бы вручную сравнивать 12 списков с ролью X или пытаться каким-то образом консолидировать 12 списков в один, что не является тривиальной задачей.

3. Сравнение файлов конфигурации

Иногда предлагается использовать встроенную возможность конфигуратора "Файл - Сравнить файлы". Этот инструмент предназначен для сравнения различных версий конфигурации или разных конфигураций целиком. Хотя он может показать различия в определении ролей как объектов метаданных, он не позволяет детально анализировать права внутри ролей с точки зрения эффективного доступа пользователя и не решает проблему объединения прав из нескольких ролей в один сравниваемый набор.

Метод 2: Программный анализ с функцией ПравоДоступа()

Для более продвинутого анализа прав доступа мы можем обратиться к программным возможностям платформы 1С. Функция ПравоДоступа() позволяет программно проверять наличие определенных прав для текущего пользователя на конкретные объекты метаданных.

Синтаксис функции Пользователи.ПравоДоступа(МетаданныеОбъекта, ВидПрава) позволяет нам узнать, имеет ли текущий пользователь право, например, на чтение документа, изменение справочника и т.д. Если мы хотим выяснить, почему какое-либо действие становится доступным, мы могли бы перебрать все объекты, связанные с этим действием, и проверить права до и после добавления роли X.

Рассмотрим, как это можно использовать для проверки конкретного права на один объект:


// Пример использования ПравоДоступа для одного объекта
// Определим интересующий объект метаданных, например, документ "РеализацияТоваровУслуг"
МетаданныеОбъекта = Метаданные.Документы.РеализацияТоваровУслуг; 
// Или другой интересующий объект, например: Метаданные.Справочники.Номенклатура

// Определим вид права, который нас интересует, например, "Чтение", "Изменение", "Просмотр"
ВидПрава = "Чтение"; 

// Проверяем, имеет ли текущий пользователь право доступа
Если Пользователи.ПравоДоступа(МетаданныеОбъекта, ВидПрава) Тогда
    Сообщить("Текущий пользователь имеет право " + ВидПрава + " для объекта " + МетаданныеОбъекта.Имя);
Иначе
    Сообщить("Текущий пользователь НЕ имеет права " + ВидПрава + " для объекта " + МетадандесОбъекта.Имя);
КонецЕсли;

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

Ограничения программного метода:

Таким образом, хотя ПравоДоступа() является мощным инструментом для проверки прав, он не дает готового решения для нашей задачи сравнения *определений* ролей и выявления дельты при объединении.

Метод 3: Анализ с помощью специализированных внешних обработок и отчетов

Сообщество 1С активно разрабатывает различные инструменты, которые расширяют функциональность платформы. Для анализа прав доступа существует множество внешних обработок и отчетов, которые часто можно найти на таких ресурсах, как Инфостарт или GitHub. Эти инструменты могут значительно упростить нашу задачу.

Рассмотрим типы таких разработок, которые потенциально могут помочь:

  1. Обработки для сравнения прав пользователей: Существуют внешние обработки, которые позволяют сравнивать эффективные права доступа между разными пользователями. Мы можем создать двух тестовых пользователей: одному назначить N ролей, другому — N ролей + роль X. Затем с помощью такой обработки мы сможем сравнить их эффективные права и увидеть дельту. Это косвенный, но довольно эффективный метод.
  2. Анализаторы прав доступа по объектам и ролям: Это отчеты или обработки, которые предоставляют детализированный анализ прав доступа в разрезе объектов метаданных, ролей, пользователей и типов прав (чтение, изменение, просмотр). Некоторые из них могут показывать, какие роли дают доступ к определенному объекту, что крайне полезно для выявления влияния роли X. Поищите инструменты, которые позволяют выводить информацию о правах в табличной форме с возможностью группировки и фильтрации.
  3. Инструменты для анализа профилей групп доступа (для БСП): В конфигурациях, использующих Библиотеку стандартных подсистем (БСП), права часто объединяются в профили групп доступа. Некоторые решения предоставляют возможность сравнения таких профилей, выделяя совпадающие и уникальные роли. Это приближает нас к задаче сравнения набора ролей, если мы рассматриваем N ролей как один профиль и X как дополнение к нему.
  4. Обработки для объединения ролей: Существуют разработки, которые позволяют объединять права нескольких ролей в одну новую консолидированную роль, работая с XML-представлением прав. Хотя их основная цель — создание новой роли, механизм анализа и слияния прав, заложенный в них, может быть использован для программного получения объединенного набора прав из N ролей. Затем этот объединенный набор можно сравнить с ролью X.

Рекомендации по поиску:

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

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

Метод 4: Практическое решение с использованием Excel (предложено автором темы)

В отсутствие готовых или легкодоступных автоматизированных решений, автор темы предложил и успешно применил ручной метод с использованием Excel. Этот подход, хотя и требует некоторых ручных операций, является весьма эффективным для решения нашей конкретной задачи, особенно когда необходимо сравнить объединение множества ролей с одной дополнительной ролью. Давайте разберем этот метод по шагам.

Шаг 1: Подготовка данных в конфигураторе

  1. Откройте конфигуратор 1С:Предприятия.
  2. Перейдите в раздел "Роли" в дереве конфигурации.
  3. Вызовите контекстное меню (ПКМ) на ветке "Роли" и выберите пункт "Все роли". Откроется окно со списком всех объектов метаданных и правами по всем ролям.
  4. В этом окне выделите все N ролей, которые уже есть у пользователя, и дополнительную роль X. Удерживайте клавишу Ctrl для выделения нескольких ролей.
  5. Нажмите кнопку "Вывести список..." (обычно находится в командной панели окна или в контекстном меню после выделения ролей).
  6. В диалоговом окне "Вывод списка" выберите необходимые колонки для вывода. Обязательно включите следующие:
    • Имя объекта метаданных (например, "Документ.РеализацияТоваровУслуг", "Справочник.Номенклатура").
    • Колонки с видами прав для каждой из выбранных ролей (например, "Роль1.Чтение", "Роль1.Изменение", "РольX.Чтение", "РольX.Изменение" и так далее).
  7. Сохраните полученный список в формате, который легко импортировать в Excel. Наиболее удобными будут "Табличный документ (*.mxl)" с последующим копированием в Excel, или сразу "Текстовый документ (*.txt)" с разделителями (например, табуляция), который затем можно импортировать в Excel как CSV.

Шаг 2: Обработка данных в Excel

После того как данные выгружены и импортированы в Excel, мы приступаем к анализу:

  1. Откройте импортированный файл в Excel. У вас будут столбцы для каждого объекта метаданных и для каждого вида права по каждой из выбранных ролей. Например:
    
    | Объект           | Роль1.Чтение | Роль1.Изменение | Роль2.Чтение | ... | РольN.Чтение | РольN.Изменение | РольX.Чтение | РольX.Изменение |
    |------------------|--------------|-----------------|--------------|-----|--------------|-----------------|--------------|-----------------|
    | Док.Реализация   | Да           | Нет             | Нет          | ... | Да           | Нет             | Да           | Да              |
    | Спр.Номенклатура | Да           | Да              | Нет          | ... | Нет          | Да              | Да           | Нет             |
    
  2. Создайте новую колонку в Excel для каждого типа права, которую назовем, например, "Объединенные_Права_N_Ролей.Чтение". Эта колонка будет хранить логическое "ИЛИ" всех прав "Чтение" для ролей N.
  3. Для каждого объекта метаданных и каждого типа права примените формулу логического "ИЛИ" ко всем N ролям. Например, если колонки B, C, D, ... до M содержат права "Чтение" для N ролей, то формула для объединенного права "Чтение" будет выглядеть так: =ИЛИ(B2="Да"; C2="Да"; D2="Да"; ...; M2="Да")

    Если хоть одна из N ролей предоставляет право (значение "Да"), то объединенное право считается "Да" (Истина). Протяните эту формулу на все строки.

  4. Повторите шаг 3 для всех интересующих видов прав (Изменение, Просмотр, Добавление и т.д.).
  5. Теперь у нас есть консолидированные права, которые пользователь получает от своих N ролей. Создайте еще одну колонку, например, "Дельта.Чтение", чтобы сравнить объединенные права N ролей с правами роли X.
  6. В этой колонке "Дельта.Чтение" используйте формулу для выявления различий. Например, чтобы найти случаи, когда объединенные N ролей НЕ давали право, а роль X его ПРЕДОСТАВЛЯЕТ: =И(Объединенные_Права_N_Ролей.Чтение="НЕТ"; РольX.Чтение="ДА")

    Или просто сравните, чтобы увидеть, где есть расхождения:

    
    =ЕСЛИ(Объединенные_Права_N_Ролей.Чтение=РольX.Чтение; "Нет отличий"; "Есть отличия")
    

    Или более точно, чтобы выделить именно добавленные права:

    
    =ЕСЛИ(И(Объединенные_Права_N_Ролей.Чтение="НЕТ"; РольX.Чтение="ДА"); "Добавлено ролью Х"; "Без изменений или удалено")
    
  7. Отфильтруйте строки, в которых колонка "Дельта" показывает "Есть отличия" или "Добавлено ролью Х". Эти строки укажут на те объекты и права, которые роль X привносит в набор прав пользователя.

Этот метод, хотя и ручной, позволяет нам эффективно проанализировать дельту прав и точно понять, какие настройки роли X влияют на доступность действия. Он является "победой Excel над недосистемами" в случаях, когда встроенные средства 1С не предоставляют прямой возможности для такой сложной аналитики.

Важность атомарных ролей и RLS

В процессе работы с правами доступа всегда полезно придерживаться принципа атомарных ролей. Это означает, что каждая роль должна предоставлять права на доступ к минимально возможному набору функций или объектов программы. Из таких "кирпичиков" затем формируются более крупные профили пользователей. Такой подход значительно упрощает управление правами, их анализ и минимизирует конфликты. Если роли слишком крупные и предоставляют много разнородных прав, выявлять дельту становится крайне сложно.

Также важно помнить, что на окончательные права пользователя влияет не только состав ролей и их определение в конфигурации, но и механизм ограничения доступа на уровне записей (RLS). Если роль X изменяет или добавляет RLS-ограничения, это также может кардинально изменить доступность действия. Анализ дельты прав должен также учитывать изменения в RLS, если роль X их содержит. Однако, анализ RLS является гораздо более сложной задачей и часто требует отдельных специализированных инструментов или глубокого программного анализа текста шаблонов RLS.

В заключение, задача выявления дельты между объединенными N ролями и новой ролью X в 1С:Предприятии является сложной из-за отсутствия типового инструмента для прямого "слияния" и сравнения прав ролей. Мы рассмотрели несколько подходов, включая встроенные средства, программный анализ и внешние обработки. Наиболее практичным и достижимым решением, предложенным сообществом, является ручной метод с использованием Excel, который позволяет добиться нужного результата, несмотря на его трудоемкость.

← На главную