Права доступа в УПП. Дополнительные права

22 июля 2013

Предисловие

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

Режим 1С:Предприятие

Дополнительные права настраиваются отдельно для каждого элемента справочника "Пользователи", либо для профиля полномочий пользователя.

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

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

Режим конфигуратора

Как уже было сказано, дополнительные права создаются в виде элементов плана видов характеристик. Контроль же прав и все необходимые действия для проверки прав выполняются программным кодом. Настройки прав для каждого пользователя сохраняются в регистре сведений "ЗначенияДополнительныхПравПользователя", имеющего следующую структуру метаданных:

Измерение "Пользователь" хранит ссылку на элемент справочника "Пользователи", а измерение "Право" ссылку на элемент плана видов характеристик "ПраваПользователей". Тип значений ресурса "Значение" определяется доступным типом ПВХ и его элементом (в измерении "Право").

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

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

Функция выполняет запрос к регистру сведений "ЗначенияДополнительныхПравПользователя" и получает значения прав в виде массива. При повторном получении прав значение получается из кэша. Поэтому после изменения значения доп. права, чтобы новые настройки вступили в силу, необходимо перезапустить пользовательский сеанс.



comments powered by Disqus