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

Публикация № 932081

Администрирование - Защита, права, пароли

9
Столкнулся с небольшой проблемкой при создании "своих" ролей в конфигураторе и добавлении их пользователям. Пользователю не добавляются созданные в конфигураторе роли, 1С 8.3, Управляемые формы. Гуглил много, ответа толкового не нашёл, поэтому пришлось разбираться самому и как результат, решил поделиться опытом. Возможно, кому-то пригодится.

Добрый день!

Столкнулся с небольшой проблемкой при создании "своих" ролей в конфигураторе и добавлении их пользователям. Гуглил много, ответа толкового не нашёл, поэтому пришлось разбираться самому и как результат, решил поделиться опытом. Возможно кому-то пригодится.

Итак, проблема заключалась в следующем:

В какой-либо конфигурации на управляемых формах создаём свою роль (или несколько ролей, как в примере) (см. рис.1), обновляем конфигурацию. В режиме предприятия создаём профиль групп доступа с нашей новой ролью (см. рис.2), добавляем пользователю этот профиль (см. рис.3) и... ничего не происходит, как-будто у этого пользователя не добавлена наша роль. Заходим в конфигуратор, администрирование, пользователи, заходим в пользователя, смотрим "доступные роли" и видим, что у нашего пользователя не выбрана наша роль (см. рис.4).

Почему так происходит? Всё очень просто, разработчики сделали так, что если пользователь "администратор", то есть у него полные права, то собственно говоря, зачем же ему ещё какие-то роли? Ведь у него же и так полные права!

В целом вполне логично и кстати если пользователь не администратор, то всё работает корректно (см. рис.5 и рис.6). Сложности возникают только в том случае, если мы хотим добавить нашу роль/роли пользователю с полными правами. Можно конечно просто в конфигураторе выбрать у пользователя нашу роль/роли, но всё будет работать ровно до тех пор, пока кто-нибудь не решит перезаписать в режиме предприятия права доступа у этого пользователя, после этого "галочка" у добавленной роли "слетит".

Что же делать и где это происходит?

Идём в общие модули - "УправлениеДоступомСлужебный", находим процедуру "ОбновитьРолиПользователей". В ней есть следующий код:

Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
	ТекущиеНовыеРоли = НовыеРоли;
	НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
	Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;
	Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
		Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;	
КонецЕсли;

"НовыеРоли" это Таблица значений, в которой выбраны все роли пользователя, которые мы ему назначили в режиме предприятия (включая "наши" роли). Как видно далее по коду, эта таблица очищается, в неё добавляются "ОбязательныеРолиАдминистратора" (Администратор системы, Полные права) и если выбрано, "ДополнительныеРолиАдминистратора" (Интерактивное открытие внешних отчетов и обработок).

Как мне показалось, самый простой и очевидный вариант, это добавить "наши" роли в таблицу "НовыеРоли". Для этого нам надо как-то отделить эти роли от всех остальных, поэтому у всех добавленных нами в конфигураторе ролей, делаем префикс "Доп_". Те "наши" роли, которые мы выбрали для пользователя, собираем в массив "ВыбранныеДополнительныеРоли" и далее из этого массива добавляем роли в таблицу значений "НовыеРоли". Ниже представлен код:

Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
	ТекущиеНовыеРоли = НовыеРоли;
	НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
	Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;
	Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
		Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
	КонецЦикла;
	
	//Если для пользователя выбраны "наши" дополнительные роли, то добавляем их в таблицу "НовыеРоли"
	ВыбранныеДополнительныеРоли = Новый Массив;
	Для Каждого Стр Из ТекущиеНовыеРоли Цикл
		Если ВРег(Лев(Стр.Роль, 4)) = "ДОП_" Тогда
			ВыбранныеДополнительныеРоли.Добавить(Стр.Роль);
		КонецЕсли;
	КонецЦикла;
	Для Каждого Стр Из ВыбранныеДополнительныеРоли Цикл
		НовыеРоли.Добавить().Роль = Стр;
	КонецЦикла;
	
КонецЕсли;

И всё работает!

В заключение добавлю, процедура "ОбновитьРолиПользователей" абсолютна одинакова у многих конфигураций (благодаря "унификации" 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение, которое по идее должно работать на многих конфигурациях на управляемых формах. Можете скачать и добавить его себе, но предварительно не забудьте, что все добавленные роли должны иметь префикс "Доп_". Расширение написано на версии платформы: 8.3.12.1685. В расширение добавлен один общий модуль "УправлениеДоступомСлужебный", в котором только одна процедура "ОбновитьРолиПользователей" (&Вместо) с добавленным, по описанию выше, кодом. При добавлении расширения, не забываем снять галочки "безопасный режим" и "защита от опасных действий".

9

Скачать файлы

Наименование Файл Версия Размер
Расширение1 - Роли
.cfe 6,70Kb
28.10.18
3
.cfe 6,70Kb 3 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. PerlAmutor 35 29.10.18 12:05 Сейчас в теме
(0)
В заключение добавлю, процедура "ОбновитьРолиПользователей" абсолютна одинакова у многих конфигураций (благодаря "унификации" 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение,


В ERP 2.1.3.93 нет такого участка кода. Тоже заметил, что функция РольДоступна() с новой ролью срабатывает не всегда. А вот Пользователи.РолиДоступны() работает как надо, поэтому использую теперь её вместо встроенной.
2. A_Max 16 29.10.18 18:18 Сейчас в теме
(0) Потому что нужно придерживаться гайдлайнов от 1С и НЕ ИСПОЛЬЗОВАТЬ роль "Полные права" у реальных пользователей. Для администраторов заводятся специальные профили с определнным перечнем прави и эти особенные профили (как правильно заметил PerlAmutor) проверяются в функции Пользователи.РолиДоступны().

Так что, плохое решение предложено вами.
3. PerlAmutor 35 30.10.18 06:51 Сейчас в теме
Для полноты картины думаю правильным будет привести ссылку на "гайдлайн" от 1С: https://its.1c.ru/db/v8std/content/2149184386/hdoc
4. kwazi 343 30.10.18 11:10 Сейчас в теме
есть еще вариант решения проблемы.
Добавить в расширение роль Полные права и в ней дать права на объекты созданные в расширении.
BARBAROSSA88; +1 Ответить
5. almas 200 02.11.18 10:10 Сейчас в теме
Добрый день. Только вчера с ролями мучился. Хотел уже писать отдельную статью.

Ситуация такова: 1с ужесточили порядок назначения ролей.
Если пользователя включили в несколько групп доступа, то:
если вы включаете пользователя в группу администраторов в конфигураторе исчезают(снимаются галки) с ролей входящих в другие группы. Как только пользователя убираем из группы администратор - все восстанавливается.

Выход: скопировать роль полные права.
Создать профиль в котором добавить эту роль и создать отдельную группу "полные права без полных прав" включив в нее ранее созданный профиль.
6. orion_king 08.04.19 09:57 Сейчас в теме
Не проще ли разрешить добавлять новые роли администратору закомментив 1 строку?
//НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); // у администратора все равно добавлять роли
7. d.saladin 24 08.04.19 10:26 Сейчас в теме
(6) В таком случае у администратора будут добавлены вообще все выбранные роли. А в предложенном мной варианте, будут только те, что должны быть (Администратор системы, Полные права) и добавленные в конфигурацию роли с префиксом "Доп_".
8. orion_king 15.04.19 11:17 Сейчас в теме
А потом добавлять все роли с префиксом, если нужно другой префикс то его либо добавлять после "Доп_" либо вставлять еще кусок кода? (на мой взгляд лишний геморрой)

Гораздо проще и нужнее, на мой взгляд, добавлять то что именно ты ему проставил.
Оставьте свое сообщение