Настройку доступа можно производить в нескольких местах программы, но рекомендуется выполнять её для профиля пользователя. Заходим в профиль администраторы и что мы видим?
Редактирование значений настроек запрещено. Это абсолютно нормально, не стоит пытаться установить их в другом месте. Просто система считает, если у пользователя одна из ролей - «Полные права», то ему разрешено все, не зависимо от настроек дополнительных прав. Поэтому, нет смысла их настраивать. Для других профилей дополнительные права замечательно устанавливаются.
Но настройки дополнительных прав можно выполнять не только для профиля, но и для группы и для конкретного пользователя.
Как же поведет себя система, если значения дополнительных прав у пользователя и его профиля не совпадают? Может сложиться впечатление, что система должна в этом случае использовать значение права, установленное пользователю, как более точное. Но это не так! Приоритет прав профиля выше, чем у группы пользователей и пользователя. Прочитав значение права у профиля, программа даже не будет смотреть, что там установлено для группы, поэтому и необходимо выполнять настройку в профиле.
Зачем же тогда сделана возможность заполнять права для группы и пользователя, если они все равно не используются? А использоваться они будут, если пользователю профиль не задан. Какое же из прав будет брать система в этом случае? Посмотрим в конфигураторе:
Функция ПрочитатьЗначениеПраваПользователя(Право, ЗначениеПоУмолчанию, Пользователь)
ВозвращаемыеЗначения = Новый Массив ;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь" , Пользователь);
Запрос.УстановитьПараметр("ПравоПользователя", Право);
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| РегистрЗначениеПрав.Значение
|ИЗ
| РегистрСведений.ЗначенияДополнительныхПравПользователя КАК РегистрЗначениеПрав
|ГДЕ
| РегистрЗначениеПрав.Право = &ПравоПользователя
| И РегистрЗначениеПрав.Пользователь В
| (ВЫБРАТЬ
| ПользователиГруппы.Ссылка КАК Ссылка
| ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ПользователиГруппы
| ГДЕ
| ПользователиГруппы.Пользователь = &Пользователь
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| &Пользователь)";
Выборка = Запрос.Выполнить().Выбрать();Если Выборка.Количество() = 0 Тогда
ВозвращаемыеЗначения.Добавить(ЗначениеПоУмолчанию);
Иначе
Пока Выборка.Следующий() Цикл
ВозвращаемыеЗначения.Добавить(Выборка.Значение);
КонецЦикла;
КонецЕсли;Возврат ВозвращаемыеЗначения;КонецФункции
Функция возвращает массив значений прав, заданных для пользователя, группы этого пользователя и группы "Все пользователи".
Дальше программа ищет значение «истина» в этом массиве.
Функция ПравоЕстьУПользователя(Право, ЗначениеПоУмолчанию)МассивЗначенийПрава = ПолучитьЗначениеПраваПользователя(Право, ЗначениеПоУмолчанию);
Возврат МассивЗначенийПрава.Найти(Истина) <> Неопределено;КонецФункции
О группе «Все пользователи» не стоит забывать. В нее входят все пользователи системы, но редко кто смотрит, какие права для неё заданы. Так же не верным решением будет устанавливать значение для этой группы, если мы хотим чтобы оно действовало для всех пользователей. Повторюсь, более приоритетным является профиль, именно в нем стоит редактировать дополнительные права.
Стоит так же добавить, что система не читает этот регистр каждый раз, а помещает данные в кэш после первого прочтения и в дальнейшем берет данные из него. Поэтому, значение установленное пользователю, вступит в силу только в следующем сеансе.
Итак, подведем итоги:
Если у пользователя есть роль «Полные права», то значения дополнительных прав ему задавать не нужно, ему и так все разрешено.Если пользователю задан профиль, то берется значение соответствующего профиля. Если профиль не задан, то система читает значения для группы, пользователя и группы «Все пользователи», и выбирает одно по принципу если разрешено в одном месте, то разрешено вообще.