Каталог решений - Некоторые особенности работы с настройками прав доступа пользователей в типовых конфигурациях на управляемом приложении

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

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

В наличии

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

Категория:

Описание

Наверняка, уже все знают, что из себя представляет новая система, поэтому предистория вкрадце:

Как было раньше( в обычном приложении):

Есть документ. Есть Роли — ПолныеПрава, ДокументНетДоступа, ДокументТолькоЧтение, ДокументЧтениеИРедактирование. В конфигураторе(аналогичный механизм в реж предприятия) вы выставляете пользователям эти роли и у них появляются соответствующие права доступа на документ. Все просто и скучно и даже зевать хочется.

С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа. Теперь:
Вводная та же. Чтобы дать пользователю какие-то права на документ — сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект, который объединяет роли в группы ролей. Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N — количество ролей), но на практике количество профилей определяется количеством должностных обязанностей пользователей в организации и их гораздо меньше, чем ролей.
Создаем профили Бесправный(с ролью ДокументНетДоступа), Аудитор(с ролью ДокументТолькоЧтение), Бухгалтер(с ролью ДокументЧтениеИРедактирование).
Чтобы «привязать» эти профили к пользователям — нужно создать элементы справочника ГруппыДоступа. В типовых они создаются автоматически, когда вы отмечаете галочками профили для пользователя. Этот справочник соединяет профиль и пользователя(или нескольких пользователей).
При записи этого элемента справочника система автоматически добавляет роли (из профиля) в роли пользователя. Поэтому не стоит напрямую редактировать роли в конфигураторе, как раньше — при редактировании прав в Предприятии все роли в конфигураторе будут обновлены на роли из профилей пользователя. Кроме того, будет наблюдаться явное противоречение между набором профилей с ролями и ролями, установленными в конфигураторе.

Как хранятся роли в Профиле групп доступа, спросите вы. Ведь роли — это объекты МД, это не ссылочные типы. Отвечаю — для этого(и не только) разработчики создали служебный справочник ИдентификаторыОбъектовМетаданных, в котором хранится( в иерархии!) имена, синонимы, значения пустых ссылок всех объектов МД. Если вы хотите создать Профиль программно и добавить в него роль, то код примерно будет таким:

	РодительРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию("Роли");//ничего страшного искать по наименованию, 

	//справочник - служебный и непосредственного редактрования в нем нет

	ИдентификаторМоейРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту("Имя","МояРоль",РодительРоли);

	Если ЗначениеЗаполнено(ИдентификаторМоейРоли) Тогда

	НайденныйИдентификаторМоейРоли = МойПрофиль.Роли.Найти(ИдентификаторМоейРоли );

	Если НайденныйИдентификаторМоейРоли= неопределено тогда

	НовСтрока = МойПрофиль.Роли.Добавить();

	НовСтрока.Роль = ИдентификаторМоейРоли;

	КонецЕсли;

	КонецЕсли;

 Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(ИСТИНА,ЛОЖЬ,ЛОЖЬ);//ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка 

Процедуру следует запускать каждый раз, когда вы вносите изменения в метаданные, особенно когда изменяете роли, объекты, связанные с новыми ролями.

Отлично. Роль добавили, идентификаторы обновили.

Но обратная связь не работает — вы в режиме предприятия назначили пользователю профиль( с созданием группы доступа), а роль у пользователя в конфигураторе не добавилась! Что делать?
За синхронизацию ролей/профилей отвечает константа ПараметрыРаботыПользователей. Если роли не обновляются в конфигураторе, следует обновить её значение:

Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();

Хорошо, скажите вы. А как быть, если я хочу создать группы доступа программно? Да не вопрос. Единственное ограничение — не допускаются дубли связок Профиль-Пользоваль в группах доступа. Примерный код будет таким:

	//МойПрофиль - профиль, который мы хотим добавить пользователю МойПользователь

	Если МойПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда // если мы хотим пользователю дать роль Администратора, 

	//то нельзя создавать новую группу доступа, надо редактировать предопределенную Администраторы

	ГруппаДоступаАдм = Справочники.ГруппыДоступа.Администраторы;

	Если ГруппаДоступаАдм.Пользователи.Найти(МойПользователь) = неопределено Тогда

	ГруппаДоступаАдмОб= ГруппаДоступаАдм.ПолучитьОбъект();

	НовСтрока = ГруппаДоступаАдмОб.Пользователи.Добавить();

	НовСтрока.Пользователь = МойПользователь;

	ГруппаДоступаАдмОб.Записать();

	КонецЕсли;

	Иначе // все прочие профили, кроме Администратора

	Запрос = новый Запрос;

	Запрос.Текст = "ВЫБРАТЬ

	|ГруппыДоступа.Ссылка

	|ИЗ

	|Справочник.ГруппыДоступа КАК ГруппыДоступа

	|ГДЕ

	|ГруппыДоступа.Профиль = &Профиль

	|И (ГруппыДоступа.Пользователь = &Пользователь

	|ИЛИ ГруппыДоступа.Пользователи.Пользователь = &Пользователь)

	|И НЕ ГруппыДоступа.ПометкаУдаления ";

	Запрос.УстановитьПараметр("Профиль",МойПрофиль);   

	Запрос.УстановитьПараметр("Пользователь",МойПользователь);

	Выборка = Запрос.Выполнить().Выбрать();

	Если НЕ Выборка.Следующий() тогда //нет такого профиля, надо создать

	МояГруппаДоступаОб = справочники.ГруппыДоступа.СоздатьЭлемент();

	МояГруппаДоступаОб.Наименование = Строка(МойПрофиль);

	МояГруппаДоступаОб.Пользователь = мойПользователь;

	Нов = МояГруппаДоступаОб.Пользователи.Добавить();

	Нов.Пользователь = МойПользователь;

	МояГруппаДоступаОб.Профиль = МойПрофиль;

	МояГруппаДоступаОб.Записать();

	КонецЕсли; //Нет такого профиля

	КонецЕсли;//профиль Администратор

После выполнения этого кода, если все, что нужно обновлено — типовая конфигурация добавит пользователю роли.

Раз уж пошли по программному пути, вот код, который добавляет пользователя в справочник Пользователи и ПользователяИБ в ПользователиИнформационнойБазы:

	ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();

	ПользовательИБ.имя = "Иванов";

	ПользовательИБ.ПолноеИмя = "Иванов Иван Иванович";

	ПользовательИБ.АутентификацияСтандартная = ИСТИНА;

	ПользовательИБ.Пароль = "";

	ПользовательИБ.записать();

	Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",ПользовательИБ.УникальныйИдентификатор));

	если Пользователь.Наименование = "" Тогда

	//создаем пользователя 

	ПользовательОб = Справочники.Пользователи.СоздатьЭлемент();

	ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();

	ЗаполнитьЗначенияСвойств(ОписаниеПользователяИБ,ПользовательИБ);

	ОписаниеПользователяИБ.УникальныйИдентификатор =  ПользовательИБ.УникальныйИдентификатор;

	ПользовательОб.Наименование = ОписаниеПользователяИБ.ПолноеИмя; 

	ОписаниеПользователяИБ.Вставить("Действие","Записать");

	ПользовательОб.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ",ОписаниеПользователяИБ);

	ПользовательОб.записать();

	 КонецЕсли;

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

Пока вроде все. Если будет что-то еще, буду дополнять.

has been added to your cart:
Оформление заказа