В предыдущей статье "Права доступа в УПП. Роли" мы рассмотрели механизм изменения прав доступа пользователей с помощью ролей, общие моменты его реализации в конфигураторе. Сегодня мы коснемся механизма профилей полномочий пользователей, который позволяет изменять права пользователей группами по несколько пользователей в конфигурации "Управление производственным предприятием".
В форме элемента справочника "Пользователи" мы можем видеть реквизит "Профиль". При указании профиля доступа полномочия пользователя становятся такими же, как и настройки прав в самом профиле.
Профили хранятся в справочнике "Профили полномочий пользователей". Заполнив реквизит "Профиль" права доступа пользователя заполняются значениями из профиля. Подбор ролей, настройка дополнительных прав и т.д. становятся недоступными. Изменение прав доступа становится возможным только с помощью профиля доступа.
В профиле можно установить основной интерфейс, состав ролей и настроить дополнительные права.
Рассмотрим структуру метаданных справочника "Профили полномочий пользователей".
В реквизите "ОсновнойИнтерфейс" хранится имя интерфейса, открываемого по умолчанию при запуске программы для пользователя. Имя хранится в виде строки. В таблице "СостаРолей" хранится список ролей доступа, которые включаются для пользователей с данным профилем. В таблице два реквизта строкового типа. В реквизите "ИмяРоли" сохраняется имя роли в дереве метаданных, а представление - синоним роли.
Как уже говорили выше, после выбора профиля, изменять настройки прав доступа для отдельного пользователя становится невозможным. При записи элемента справочника "Пользователи" настройки прав доступа для связанного пользователя информационной базы берутся по профилю доступа.
Рассматривать принцип действия дополнительных прав мы будем в следующих статьях. Сейчас посмотрим как записываются настройки доступа пользователя ИБ в соответствии с настройкой профиля.
В обработчике "ПередЗаписьюНаСервере" выполняется запись пользователя инф. базы. Во так выглядит процедура записи:
Процедура ЗаписатьПользователяИБ(Отказ, ТекущийОбъект) Перем СообщениеОбОшибке; Если ПравоАдминистрирования Тогда СообщениеОбОшибке = ""; Отказ = Ложь; ДанныеПользователяИБ = ПодготовитьДанныеПользователяИБДляЗаписи(); СписокРолей = Новый ТаблицаЗначений; СписокРолей.Колонки.Добавить("ИмяРоли"); СписокРолей.Колонки.Добавить("Пометка"); Если Объект.ПрофильПолномочийПользователя.Пустая() Тогда Для Каждого ЭлементКоллекции Из РолиПользователя Цикл НоваяСтрока = СписокРолей.Добавить(); НоваяСтрока.ИмяРоли = ЭлементКоллекции.ИмяРоли; НоваяСтрока.Пометка = Истина; КонецЦикла; Иначе // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Если профиль заполнен - заполняем список ролей из профиля КоллекцияРолей = ПолучитьСписокРолейПрофиля(Объект.ПрофильПолномочийПользователя); Для Каждого ЭлементКоллекции Из КоллекцияРолей Цикл НоваяСтрока = СписокРолей.Добавить(); НоваяСтрока.ИмяРоли = ЭлементКоллекции.Имя; НоваяСтрока.Пометка = Истина; КонецЦикла; КонецЕсли; // Роль "Пользователь" добавляем автоматически Если СписокРолей.Найти("Пользователь", "ИмяРоли") = Неопределено Тогда НоваяСтрока = СписокРолей.Добавить(); НоваяСтрока.ИмяРоли = "Пользователь"; НоваяСтрока.Пометка = Истина; КонецЕсли; Если Не Отказ Тогда // Идентификатор не валидный, пытаемся идентифицироваться по имени Если РассогласованиеДанных = 1 ИЛИ РассогласованиеДанных = 2 Тогда Идентификатор = УправлениеПользователямиСервер.ЗаписатьПользователяИБ( СокрЛП(ТекущийОбъект.Ссылка.ПолучитьОбъект().Код), ДанныеПользователяИБ, СообщениеОбОшибке, СписокРолей); Иначе Идентификатор = УправлениеПользователямиСервер.ЗаписатьПользователяИБ( ТекущийОбъект.ИдентификаторПользователяИБ, ДанныеПользователяИБ, СообщениеОбОшибке, СписокРолей); КонецЕсли; Если Идентификатор = Неопределено Тогда Отказ = Истина; Иначе ТекущийОбъект.ИдентификаторПользователяИБ = Идентификатор; КонецЕсли; КонецЕсли; Если Отказ Тогда Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка записи пользователя ИБ: %1'"), СообщениеОбОшибке ); ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке); Иначе ОбщегоНазначенияКлиентСервер. СообщитьПользователю(НСтр("ru = 'Пользователь информационной базы не был записан'")); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры
Список ролей профиля соответственно получается из таб. части "СоставРолей", о которой мы говорили выше. Стоит отметить, что если роль была переименована в конфигураторе, то нужно откорректировать данные в таб. части "СоставРолей" в реквизите "ИмяРоли". Иначе будут появляться ошибки при записи профиля.
Функция получения списка ролей из профиля следующая:
Функция ПолучитьСписокРолейПрофиля(Профиль) Если Профиль.Пустая() Тогда Возврат Неопределено; КонецЕсли; Запрос = Новый Запрос; ТекстЗапроса = "ВЫБРАТЬ | ПрофилиПолномочийПользователейСоставРолей.ИмяРоли КАК Имя, | ПрофилиПолномочийПользователейСоставРолей.ПредставлениеРоли КАК Синоним |ИЗ | Справочник.ПрофилиПолномочийПользователей.СоставРолей КАК ПрофилиПолномочийПользователейСоставРолей |ГДЕ | ПрофилиПолномочийПользователейСоставРолей.Ссылка = &Ссылка"; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Ссылка", Профиль); КоллекцияРолей = Запрос.Выполнить().Выгрузить(); Возврат КоллекцияРолей; КонецФункции //
В следующей статье рассмотрим механизм дополнительных прав, принцип его работы как с точки зрения пользователя, так и разработчика.