Добрый день!
Столкнулся с небольшой проблемкой при создании "своих" ролей в конфигураторе и добавлении их пользователям. Гуглил много, ответа толкового не нашёл, поэтому пришлось разбираться самому и как результат, решил поделиться опытом. Возможно кому-то пригодится.
Итак, проблема заключалась в следующем:
В какой-либо конфигурации на управляемых формах создаём свою роль (или несколько ролей, как в примере) (см. рис.1), обновляем конфигурацию. В режиме предприятия создаём профиль групп доступа с нашей новой ролью (см. рис.2), добавляем пользователю этот профиль (см. рис.3) и... ничего не происходит, как-будто у этого пользователя не добавлена наша роль. Заходим в конфигуратор, администрирование, пользователи, заходим в пользователя, смотрим "доступные роли" и видим, что у нашего пользователя не выбрана наша роль (см. рис.4).
Почему так происходит? Всё очень просто, разработчики сделали так, что если пользователь "администратор", то есть у него полные права, то собственно говоря, зачем же ему ещё какие-то роли? Ведь у него же и так полные права!
В целом вполне логично и кстати если пользователь не администратор, то всё работает корректно (см. рис.5 и рис.6). Сложности возникают только в том случае, если мы хотим добавить нашу роль/роли пользователю с полными правами. Можно конечно просто в конфигураторе выбрать у пользователя нашу роль/роли, но всё будет работать ровно до тех пор, пока кто-нибудь не решит перезаписать в режиме предприятия права доступа у этого пользователя, после этого "галочка" у добавленной роли "слетит".
Что же делать и где это происходит?
Идём в общие модули - "УправлениеДоступомСлужебный", находим процедуру "ОбновитьРолиПользователей". В ней есть следующий код:
Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
ТекущиеНовыеРоли = НовыеРоли;
НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
Продолжить;
КонецЕсли;
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
КонецЕсли;
"НовыеРоли" это Таблица значений, в которой выбраны все роли пользователя, которые мы ему назначили в режиме предприятия (включая "наши" роли). Как видно далее по коду, эта таблица очищается, в неё добавляются "ОбязательныеРолиАдминистратора" (Администратор системы, Полные права) и если выбрано, "ДополнительныеРолиАдминистратора" (Интерактивное открытие внешних отчетов и обработок).
Как мне показалось, самый простой и очевидный вариант, это добавить "наши" роли в таблицу "НовыеРоли". Для этого нам надо как-то отделить эти роли от всех остальных, поэтому у всех добавленных нами в конфигураторе ролей, делаем префикс "Доп_". Те "наши" роли, которые мы выбрали для пользователя, собираем в массив "ВыбранныеДополнительныеРоли" и далее из этого массива добавляем роли в таблицу значений "НовыеРоли". Ниже представлен код:
Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
ТекущиеНовыеРоли = НовыеРоли;
НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
Продолжить;
КонецЕсли;
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
//Если для пользователя выбраны "наши" дополнительные роли, то добавляем их в таблицу "НовыеРоли"
ВыбранныеДополнительныеРоли = Новый Массив;
Для Каждого Стр Из ТекущиеНовыеРоли Цикл
Если ВРег(Лев(Стр.Роль, 4)) = "ДОП_" Тогда
ВыбранныеДополнительныеРоли.Добавить(Стр.Роль);
КонецЕсли;
КонецЦикла;
Для Каждого Стр Из ВыбранныеДополнительныеРоли Цикл
НовыеРоли.Добавить().Роль = Стр;
КонецЦикла;
КонецЕсли;
И всё работает!
В заключение добавлю, процедура "ОбновитьРолиПользователей" абсолютна одинакова у многих конфигураций (благодаря "унификации" 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение, которое по идее должно работать на многих конфигурациях на управляемых формах. Можете скачать и добавить его себе, но предварительно не забудьте, что все добавленные роли должны иметь префикс "Доп_". Расширение написано на версии платформы: 8.3.12.1685. В расширение добавлен один общий модуль "УправлениеДоступомСлужебный", в котором только одна процедура "ОбновитьРолиПользователей" (&Вместо) с добавленным, по описанию выше, кодом. При добавлении расширения, не забываем снять галочки "безопасный режим" и "защита от опасных действий".