Программная работа с Ролями в 1С
Роль — это объект метаданных, предназначенный для описания набора разрешенных действий (прав). Каждому пользователю прикладного решения может быть назначена одна или несколько ролей. Пользователь будет иметь право на объект, если хотя бы одна из назначенных ему ролей предоставляет право на этот объект. При попытке получить доступ к объекту, на который у пользователя нет прав, выдается ошибка:
В ролях можно управлять доступом не только на уровне объектов метаданных, но и на уровне объектов базы данных. Например, можно указать, что пользователю с определенной ролью разрешено изменять справочник Номенклатура, но только те его элементы, которые не помечены на удаление. Этот механизм называется RLS — Row Level Security (ограничение доступа на уровне записей).
Привилегированный режим работы
В системе есть возможность временно отключить проверку прав доступа. Такой режим называется привилегированным. В привилегированном режиме разрешены любые операции с базой и не производится контроль RLS.
Включение привилегированного режима осуществляется методом
Если вызвать метод УстановитьПривилегированныйРежим (Ложь) большее количество раз, чем УстановитьПривилегированныйРежим (Истина) , то будет вызвано исключение.
Получить текущее значение привилегированного режима можно функцией
которая возвращает значение типа Булево.
Безопасный режим работы
Иногда требуется наложить дополнительные ограничения при выполнении «ненадежного» кода, например, при вызове метода Выполнить () . В этом случае можно переключиться в безопасный режим работы.
В безопасном режиме:
- привилегированный режим отменяется, а попытка перехода в привилегированный режим игнорируется;
- запрещено использование внешних средств по отношению к 1С (доступ к файловой системе, доступ к интернету, загрузка внешних компонент, механизмы COM).
Включение безопасного режима осуществляется методом
Если вызвать метод УстановитьБезопасныйРежим (Ложь) большее количество раз, чем УстановитьБезопасныйРежим (Истина) , то будет вызвано исключение.
Получить текущее значение безопасного режима можно функцией
которая возвращает значение типа Булево.
Программная работа с Ролями
Для проверки доступности Роли текущему пользователю:
РольДоступна (< НаименованиеРоли >)
// Пример использования:
ЭтоАдминистратор = РольДоступна ( Метаданные . Роли . АдминистраторСистемы );
//Тот же самый результат можно получить так:
ЭтоАдминистратор = РольДоступна ( «АдминистраторСистемы» );
Для определения права доступа (чтение, изменение и т.д.) к объекту метаданных:
ПравоДоступа (< Право >, < ОбъектМетаданных >, < Пользователь/Роль >, < СтандартныйРеквизитСтандартнаяТабличнаяЧасть >)
// Пример использования: проверка у текущего пользователя права на изменение справочника ФизическиеЛица
МожноРедактироватьФизЛиц = ПравоДоступа ( «Изменение» , Метаданные . Справочники . ФизическиеЛица );
Для проверки прав доступа текущего пользователя на объект метаданных:
ВыполнитьПроверкуПравДоступа (< Право >, < ОбъектМетаданных >, < СтандартныйРеквизитСтандартнаяТабличнаяЧасть >)
//Примеры использования:
ВыполнитьПроверкуПравДоступа ( «ИнтерактивноеОткрытиеВнешнихОбработок» , Метаданные );
ВыполнитьПроверкуПравДоступа ( «ИнтерактивнаяПометкаУдаления» , Метаданные . Справочники . ФизическиеЛица );
Процедура ВыполнитьПроверкуПравДоступа () отличается от функции ПравоДоступа () тем, что доступна только для текущего пользователя. При отсутствии права вызывается исключение, а в журнал регистрации пишется событие ОтказВДоступе.
Для получение информации о праве доступа на определенный объект метаданных для пользователя или роли с учетом указанных полей:
ПараметрыДоступа (< НаименованиеПрава >, < ОбъектМетаданных >, < СписокПолей >, < Пользователь/Роль >)
//Пример использования:
ПараметрыДоступа = ПараметрыДоступа ( «Чтение» , Метаданные . РегистрыСведений . ТекущиеКадровыеДанныеСотрудников , «ТекущаяОрганизация,ФизическоеЛицо» );
ЕстьДоступ = ПараметрыДоступа . Доступность ;
ОграничениеRLS = ПараметрыДоступа . ОграничениеУсловием ;
Для получения представления права по имени:
ПредставлениеПрава (< ИмяПрава >)
//Пример использования:
Представление = ПредставлениеПрава ( «ИнтерактивноеОткрытиеВнешнихОбработок» );
// Переменная Представление будет содержать строку «Интерактивное открытие внешних обработок»
Программная работа с Ролями в БСП
В типовых конфигурациях, построенных на Библиотеке стандартных подсистем, в общих модулях есть методы для работы с ролями. Вот некоторые из них:
Пользователи . РолиДоступны ( ИменаРолей , Пользователь = Неопределено, УчитыватьПривилегированныйРежим = Истина)
Пользователи . ЭтоПолноправныйПользователь ( Пользователь = Неопределено, ПроверятьПраваАдминистрированияСистемы = Ложь, УчитыватьПривилегированныйРежим = Истина)
УправлениеДоступом . ЕстьРоль (Знач Роль , Знач СсылкаНаОбъект = Неопределено, Знач Пользователь = Неопределено)
УправлениеДоступом . ЕстьПраво ( Право , СсылкаНаОбъект , Пользователь = Неопределено)
УправлениеДоступом . ЧтениеРазрешено ( ОписаниеДанных )
УправлениеДоступом . ИзменениеРазрешено ( ОписаниеДанных )
УправлениеДоступом . ОграничиватьДоступНаУровнеЗаписей ()
УправлениеДоступом . ПраваПоИдентификаторам ( Идентификаторы = Неопределено)
В общих модулях у каждого метода есть подробное описание. Там можно посмотреть описание самого метода, входных параметров и возвращаемого значения.
Программно проверить наличие роли у пользователя 1С
Если вам в программном коде 1С 8 необходимо проверить установлена ли какая либо роль у текущего пользователя, то воспользуйтесь функцией глобального контекста РольДоступна(<Роль>) , которая возвращает значение Истина, если указанная в скобках роль доступна и Ложь, если не доступна. Наименование проверяемой роли следует писать в кавычках.
Пример: При проведении некоторого документа вам нужно проверять установлена ли у пользователя проводящего его роль ПолныеПрава, если доступна то выполнять процедуру проведения, если нет, то выдавать сообщение: “Для проведения данного документа необходима роль Полные права”.
Решение: В начале процедуры ОбработкаПроведения напишите следующий код:
Проверка наличия роли у пользователя
Проверка с помощью функции глобального контекста РольДоступна()
Если в программном коде необходимо проверить установлена ли какая-либо роль у текущего пользователя, то можно воспользоваться функцией глобального контекста РольДоступна(<Роль>), которая возвращает значение Истина, если указанная в скобках роль доступна и Ложь, если не доступна.
Однако, в конфигурациях на основе БСП при включении пользователя в предопределенную группу доступа Администраторы, пользователю назначаются только две роли: Полные права и Администрирование (в этом можно убедиться с помощью Конфигуратора: Администрирование — Пользователи — Пользователь — Прочие). Все остальные роли отключаются вне зависимости от того, включен ли пользователь в какие-либо еще группы доступа. Система считает, что другие роли этому пользователю не нужны. Поэтому функция РольДоступна() возвращает в этом случае Ложь, что не подходит для решения нашей задачи.
Проверка с помощью функций БСП
Проверить наличие роли можно также с помощью функций БСП: Пользователи.РолиДоступны() и УправлениеДоступом.ЕстьРоль(). Но данные функции для полноправного пользователя (с ролями Полные права или Администратор системы) вернут всегда Истину независимо от того, назначена ли данная роль пользователю или нет:
Можно было пойти по легкому пути, скопировать данные функции и убрать в них проверку на полноправного пользователя, но мы не ищем легких путей это бы нам не помогло, так как функция Пользователи.РолиДоступны() все равно используют функцию глобального контекста РольДоступна(), а функция УправлениеДоступом.ЕстьРоль() слишком громоздка (текст функции около 300 строк при этом текст основного запроса около 200 строк).
Таким образом, все перечисленные известные функции не подходят для решения нашей задачи.
Решение
Для решения этой задачи в любой конфигурации на базе БСП я использую свою функцию:
Буду признателен, если Вы будите делиться своим опытом решения данной задачи.
Проверка наличия роли у пользователя
Проверка наличия роли у пользователя с помощью функции глобального контекста РольДоступна () , не всегда вернёт верное значение.
Дело в том, что в конфигурациях на основе БСП, при включении пользователя в предопределенную группу доступа Администраторы, пользователю назначаются только две роли: Полн. и Адм. Все остальные роли откл. вне зависимости, включен ли пользователь в какие-либо еще группы доступа. Система считает, что другие роли этому пользователю не нужны. Поэтому функция РольДоступна () = Ложь в нашем случае.
Чтобы проверка роли вернула в нашем случае правильное значение делайте:
НО. В таком случае роль будет Доступна. Если у пользователя полные права.
Если хотите проверить на доступность роли ВНЕ ЗАВИСИМОСТИ от прав пользователя, тогда вытаскивайте/переносите из общего