новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Права доступа в УПП. Роли

  • Добавить свою публикацию
  • для этого требуется регистрация

Предисловие

Конфигурация "Управление производственным предприятием" имеет широкие возможности для настройки прав доступа пользователей в программе. Это и роли, и профили доступа, и дополнительные права и т.д.

Изображение

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

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

Для разграничения прав доступа самым простым инструментом в руках разработчика является объект "Роль", позволяющий определить доступ к объектам конфигуарции на некторые действия. Роли также могут использоваться для сложных условий проверки прав доступа с помощью такого метода как "РольДоступна("ИмяРоли"). Подробнее о ролях Вы можете прочитать здесь, сегодня же рассмотрим вопрос работы с ролями в пользовательском режиме, а также некоторые моменты в реализации управления доступом с помощью ролей на уровне конфигуратора. 

Изображение

Откроем любой элемент справочника "Пользователи". Справа мы увидим список ролей, которые присвоены данному пользователю.

Изображение

Нажав на кнопку "Изменить" мы можем изменить состав присвоенных ролей.

Изображение

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

Изображение

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

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

Функционал управления пользователями в УПП частично взят из конфигурации "Библиотека стандартных подсистем". Рассмотрим как реализовано подбор ролей для пользователя, их разделение по подсистемам (см. первый скриншот к статье), а также считывание и запись ролей для отдельного пользователя. Начнем с подбора. 

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

На первом скриншоте к статье мы видим группировку для двух подсистем: "Производство" и "Торговля и склад". Есть и другие подсистемы. Если мы обратимся к общему макету "ОписаниеРолейКонфигурации", то увидим следующее:

Изображение

В верхней части макета, в области "ГруппыРолей" перечисляются список групп, на которые группируются роли конфигурации. В нижней части, в области "ОписаниеРолей" для каждой роли конфигурации устанавливается группа роли. Именно на основе макета осуществляется заполнения списка ролей и их групп в подборе.

Получение списка ролей пользователя осуществляется из данных пользователя информационной базы, привязанного к элементу справочника "Пользователи" по GUID'у. GUID пользователя инф. базы содержится в реквизита справочника "ИдентификаторПользователяИБ".

Изображение

Считать список доступных ролей пользователя информационной базы можно получить пользователя:

Функция ПолучитьПользователяИБ(ЗначениеКопирования = Неопределено)
	
	Если ЗначениеЗаполнено(ЗначениеКопирования) Тогда
		ПользовательИБ = ПользователиИнформационнойБазы.
                      НайтиПоУникальномуИдентификатору(ЗначениеКопирования.ИдентификаторПользователяИБ);
	Иначе
		Если РассогласованиеДанных = 3 Тогда
			ПользовательИБ = ПользователиИнформационнойБазы.
                     НайтиПоУникальномуИдентификатору(Объект.ИдентификаторПользователяИБ);
		Иначе
			ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(Объект.Код));
		КонецЕсли;
	КонецЕсли;	
	Возврат ПользовательИБ;	
КонецФункции  

 

 После получения пользователя инф. базы по сохраненному GUIDу мы можем обойти роли пользователя:

 

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

 

 Именно эта функция заполняет списко ролей доступных для пользователя. Записать же состав ролей пользователя можно следующим образом:

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

 Более подробно работу с пользователями Вы можете посмотреть в конфигурации "Библиотека стандартных подсистем" или найти в синтаксис-помощнике информацию по работе с пользователями информационной базы.

 
0
Читайте также
1C программист
Статья для тех кто в поиске 1С программиста или сам имеет отношение к 1С настройке
Права доступа на реквизиты
"Особенности использования механизма настройки прав доступа для реквизитов"
Разработки
Пользователи, права и интерфейсы
Обработка помогает в определении какие права и нтерфейсы дать пользователям
Парсер Яндекс маркета и Торг.Мейл.ру
Загрузка данных по товарам с помощью сервисов Яндекс маркета и Торг.Мейл.ру
Автоматическое прекращение доступа в базу уволенных сотрудников
Формирование списка уволенных сторудников и закрытие доступа в базу
Еще от автора
≡ к списку статей