Добрый день!
Столкнулся с небольшой проблемкой при создании "своих" ролей в конфигураторе и добавлении их пользователям. Гуглил много, ответа толкового не нашёл, поэтому пришлось разбираться самому и как результат, решил поделиться опытом. Возможно кому-то пригодится.
Итак, проблема заключалась в следующем:
В какой-либо конфигурации на управляемых формах создаём свою роль (или несколько ролей, как в примере) (см. рис.1), обновляем конфигурацию. В режиме предприятия создаём профиль групп доступа с нашей новой ролью (см. рис.2), добавляем пользователю этот профиль (см. рис.3) и… ничего не происходит, как-будто у этого пользователя не добавлена наша роль. Заходим в конфигуратор, администрирование, пользователи, заходим в пользователя, смотрим "доступные роли" и видим, что у нашего пользователя не выбрана наша роль (см. рис.4).
Почему так происходит? Всё очень просто, разработчики сделали так, что если пользователь "администратор", то есть у него полные права, то собственно говоря, зачем же ему ещё какие-то роли? Ведь у него же и так полные права!
В целом вполне логично и кстати если пользователь не администратор, то всё работает корректно (см. рис.5 и рис.6). Сложности возникают только в том случае, если мы хотим добавить нашу роль/роли пользователю с полными правами. Можно конечно просто в конфигураторе выбрать у пользователя нашу роль/роли, но всё будет работать ровно до тех пор, пока кто-нибудь не решит перезаписать в режиме предприятия права доступа у этого пользователя, после этого "галочка" у добавленной роли "слетит".
Что же делать и где это происходит?
Идём в общие модули — "УправлениеДоступомСлужебный", находим процедуру "ОбновитьРолиПользователей". В ней есть следующий код:
Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
ТекущиеНовыеРоли = НовыеРоли;
НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
Продолжить;
КонецЕсли;
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
КонецЕсли;
"НовыеРоли" это Таблица значений, в которой выбраны все роли пользователя, которые мы ему назначили в режиме предприятия (включая "наши" роли). Как видно далее по коду, эта таблица очищается, в неё добавляются "ОбязательныеРолиАдминистратора" (Администратор системы, Полные права) и если выбрано, "ДополнительныеРолиАдминистратора" (Интерактивное открытие внешних отчетов и обработок).
Как мне показалось, самый простой и очевидный вариант, это добавить "наши" роли в таблицу "НовыеРоли". Для этого нам надо как-то отделить эти роли от всех остальных, поэтому у всех добавленных нами в конфигураторе ролей, делаем префикс "Доп_". Те "наши" роли, которые мы выбрали для пользователя, собираем в массив "ВыбранныеДополнительныеРоли" и далее из этого массива добавляем роли в таблицу значений "НовыеРоли". Ниже представлен код:
Если Администраторы[ТекущийПользователь] <> Неопределено Тогда
ТекущиеНовыеРоли = НовыеРоли;
НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив);
Для Каждого КлючИЗначение Из ОбязательныеРолиАдминистратора Цикл
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
Для Каждого КлючИЗначение Из ДополнительныеРолиАдминистратора Цикл
Если ТекущиеНовыеРоли.Найти(КлючИЗначение.Ключ, "Роль") = Неопределено Тогда
Продолжить;
КонецЕсли;
НовыеРоли.Добавить().Роль = КлючИЗначение.Ключ;
КонецЦикла;
//Если для пользователя выбраны "наши" дополнительные роли, то добавляем их в таблицу "НовыеРоли"
ВыбранныеДополнительныеРоли = Новый Массив;
Для Каждого Стр Из ТекущиеНовыеРоли Цикл
Если ВРег(Лев(Стр.Роль, 4)) = "ДОП_" Тогда
ВыбранныеДополнительныеРоли.Добавить(Стр.Роль);
КонецЕсли;
КонецЦикла;
Для Каждого Стр Из ВыбранныеДополнительныеРоли Цикл
НовыеРоли.Добавить().Роль = Стр;
КонецЦикла;
КонецЕсли;
И всё работает!
В заключение добавлю, процедура "ОбновитьРолиПользователей" абсолютна одинакова у многих конфигураций (благодаря "унификации" 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение, которое по идее должно работать на многих конфигурациях на управляемых формах. Можете скачать и добавить его себе, но предварительно не забудьте, что все добавленные роли должны иметь префикс "Доп_". Расширение написано на версии платформы: 8.3.12.1685. В расширение добавлен один общий модуль "УправлениеДоступомСлужебный", в котором только одна процедура "ОбновитьРолиПользователей" (&Вместо) с добавленным, по описанию выше, кодом. При добавлении расширения, не забываем снять галочки "безопасный режим" и "защита от опасных действий".
(0)
В ERP 2.1.3.93 нет такого участка кода. Тоже заметил, что функция РольДоступна() с новой ролью срабатывает не всегда. А вот Пользователи.РолиДоступны() работает как надо, поэтому использую теперь её вместо встроенной.
(0) Потому что нужно придерживаться гайдлайнов от 1С и НЕ ИСПОЛЬЗОВАТЬ роль «Полные права» у реальных пользователей. Для администраторов заводятся специальные профили с определнным перечнем прави и эти особенные профили (как правильно заметил PerlAmutor) проверяются в функции Пользователи.РолиДоступны().
Так что, плохое решение предложено вами.
Для полноты картины думаю правильным будет привести ссылку на «гайдлайн» от 1С:https://its.1c.ru/db/v8std/content/2149184386/hdoc
есть еще вариант решения проблемы.
Добавить в расширение роль Полные права и в ней дать права на объекты созданные в расширении.
Добрый день. Только вчера с ролями мучился. Хотел уже писать отдельную статью.
Ситуация такова: 1с ужесточили порядок назначения ролей.
Если пользователя включили в несколько групп доступа, то:
если вы включаете пользователя в группу администраторов в конфигураторе исчезают(снимаются галки) с ролей входящих в другие группы. Как только пользователя убираем из группы администратор — все восстанавливается.
Выход: скопировать роль полные права.
Создать профиль в котором добавить эту роль и создать отдельную группу «полные права без полных прав» включив в нее ранее созданный профиль.
Не проще ли разрешить добавлять новые роли администратору закомментив 1 строку?
//НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); // у администратора все равно добавлять роли
(6) В таком случае у администратора будут добавлены вообще все выбранные роли. А в предложенном мной варианте, будут только те, что должны быть (Администратор системы, Полные права) и добавленные в конфигурацию роли с префиксом «Доп_».
А потом добавлять все роли с префиксом, если нужно другой префикс то его либо добавлять после «Доп_» либо вставлять еще кусок кода? (на мой взгляд лишний геморрой)
Гораздо проще и нужнее, на мой взгляд, добавлять то что именно ты ему проставил.
Cамый простой и очевидный вариант — просто закомментарить этот кусок.