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