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






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

Добрый день!

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

9 Comments

  1. PerlAmutor

    (0)

    В заключение добавлю, процедура «ОбновитьРолиПользователей» абсолютна одинакова у многих конфигураций (благодаря «унификации» 1С), смотрел в УНФ 1.6, Бухгалтерия предприятия 3.0, Управление торговлей 11.4 (все конфигурации в нескольких версиях), поэтому сделал расширение,

    В ERP 2.1.3.93 нет такого участка кода. Тоже заметил, что функция РольДоступна() с новой ролью срабатывает не всегда. А вот Пользователи.РолиДоступны() работает как надо, поэтому использую теперь её вместо встроенной.

    Reply
  2. A_Max

    (0) Потому что нужно придерживаться гайдлайнов от 1С и НЕ ИСПОЛЬЗОВАТЬ роль «Полные права» у реальных пользователей. Для администраторов заводятся специальные профили с определнным перечнем прави и эти особенные профили (как правильно заметил PerlAmutor) проверяются в функции Пользователи.РолиДоступны().

    Так что, плохое решение предложено вами.

    Reply
  3. PerlAmutor

    Для полноты картины думаю правильным будет привести ссылку на «гайдлайн» от 1С: https://its.1c.ru/db/v8std/content/2149184386/hdoc

    Reply
  4. kwazi

    есть еще вариант решения проблемы.

    Добавить в расширение роль Полные права и в ней дать права на объекты созданные в расширении.

    Reply
  5. almas

    Добрый день. Только вчера с ролями мучился. Хотел уже писать отдельную статью.

    Ситуация такова: 1с ужесточили порядок назначения ролей.

    Если пользователя включили в несколько групп доступа, то:

    если вы включаете пользователя в группу администраторов в конфигураторе исчезают(снимаются галки) с ролей входящих в другие группы. Как только пользователя убираем из группы администратор — все восстанавливается.

    Выход: скопировать роль полные права.

    Создать профиль в котором добавить эту роль и создать отдельную группу «полные права без полных прав» включив в нее ранее созданный профиль.

    Reply
  6. orion_king

    Не проще ли разрешить добавлять новые роли администратору закомментив 1 строку?

    //НовыеРоли = ТекущиеНовыеРоли.Скопировать(Новый Массив); // у администратора все равно добавлять роли

    Reply
  7. d.saladin

    (6) В таком случае у администратора будут добавлены вообще все выбранные роли. А в предложенном мной варианте, будут только те, что должны быть (Администратор системы, Полные права) и добавленные в конфигурацию роли с префиксом «Доп_».

    Reply
  8. orion_king

    А потом добавлять все роли с префиксом, если нужно другой префикс то его либо добавлять после «Доп_» либо вставлять еще кусок кода? (на мой взгляд лишний геморрой)

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

    Reply
  9. beerkeen

    Cамый простой и очевидный вариант — просто закомментарить этот кусок.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *