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

Разработчики в управляемых приложениях применили новый механизм настройки прав доступа, о которых и пойдет речь.
Будут перечислены все те грабли, которые собрал автор, чтобы вы о них знали.
Наверняка, уже все знают, что из себя представляет новая система, поэтому предистория вкрадце:

Как было раньше( в обычном приложении):

Есть документ. Есть Роли — ПолныеПрава, ДокументНетДоступа, ДокументТолькоЧтение, ДокументЧтениеИРедактирование. В конфигураторе(аналогичный механизм в реж предприятия) вы выставляете пользователям эти роли и у них появляются соответствующие права доступа на документ. Все просто и скучно и даже зевать хочется.

С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа. Теперь:
Вводная та же. Чтобы дать пользователю какие-то права на документ — сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект, который объединяет роли в группы ролей. Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N — количество ролей), но на практике количество профилей определяется количеством должностных обязанностей пользователей в организации и их гораздо меньше, чем ролей.
Создаем профили Бесправный(с ролью ДокументНетДоступа), Аудитор(с ролью ДокументТолькоЧтение), Бухгалтер(с ролью ДокументЧтениеИРедактирование).
Чтобы «привязать» эти профили к пользователям — нужно создать элементы справочника ГруппыДоступа. В типовых они создаются автоматически, когда вы отмечаете галочками профили для пользователя. Этот справочник соединяет профиль и пользователя(или нескольких пользователей).
При записи этого элемента справочника система автоматически добавляет роли (из профиля) в роли пользователя. Поэтому не стоит напрямую редактировать роли в конфигураторе, как раньше — при редактировании прав в Предприятии все роли в конфигураторе будут обновлены на роли из профилей пользователя. Кроме того, будет наблюдаться явное противоречение между набором профилей с ролями и ролями, установленными в конфигураторе.

Как хранятся роли в Профиле групп доступа, спросите вы. Ведь роли — это объекты МД, это не ссылочные типы. Отвечаю — для этого(и не только) разработчики создали служебный справочник ИдентификаторыОбъектовМетаданных, в котором хранится( в иерархии!) имена, синонимы, значения пустых ссылок всех объектов МД. Если вы хотите создать Профиль программно и добавить в него роль, то код примерно будет таким:

РодительРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию("Роли");//ничего страшного искать по наименованию, 

//справочник - служебный и непосредственного редактрования в нем нет

ИдентификаторМоейРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту("Имя","МояРоль",РодительРоли);

Если ЗначениеЗаполнено(ИдентификаторМоейРоли) Тогда

НайденныйИдентификаторМоейРоли = МойПрофиль.Роли.Найти(ИдентификаторМоейРоли );

Если НайденныйИдентификаторМоейРоли= неопределено тогда

НовСтрока = МойПрофиль.Роли.Добавить();

НовСтрока.Роль = ИдентификаторМоейРоли;

КонецЕсли;

КонецЕсли;


 Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(ИСТИНА,ЛОЖЬ,ЛОЖЬ);//ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка 

Процедуру следует запускать каждый раз, когда вы вносите изменения в метаданные, особенно когда изменяете роли, объекты, связанные с новыми ролями.

Отлично. Роль добавили, идентификаторы обновили.

Но обратная связь не работает — вы в режиме предприятия назначили пользователю профиль( с созданием группы доступа), а роль у пользователя в конфигураторе не добавилась! Что делать?
За синхронизацию ролей/профилей отвечает константа ПараметрыРаботыПользователей. Если роли не обновляются в конфигураторе, следует обновить её значение:

Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();

Хорошо, скажите вы. А как быть, если я хочу создать группы доступа программно? Да не вопрос. Единственное ограничение — не допускаются дубли связок Профиль-Пользоваль в группах доступа. Примерный код будет таким:


//МойПрофиль - профиль, который мы хотим добавить пользователю МойПользователь

Если МойПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда // если мы хотим пользователю дать роль Администратора, 

//то нельзя создавать новую группу доступа, надо редактировать предопределенную Администраторы

ГруппаДоступаАдм = Справочники.ГруппыДоступа.Администраторы;

Если ГруппаДоступаАдм.Пользователи.Найти(МойПользователь) = неопределено Тогда

ГруппаДоступаАдмОб= ГруппаДоступаАдм.ПолучитьОбъект();

НовСтрока = ГруппаДоступаАдмОб.Пользователи.Добавить();

НовСтрока.Пользователь = МойПользователь;

ГруппаДоступаАдмОб.Записать();

КонецЕсли;

Иначе // все прочие профили, кроме Администратора

Запрос = новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

|ГруппыДоступа.Ссылка

|ИЗ

|Справочник.ГруппыДоступа КАК ГруппыДоступа

|ГДЕ

|ГруппыДоступа.Профиль = &Профиль

|И (ГруппыДоступа.Пользователь = &Пользователь

|ИЛИ ГруппыДоступа.Пользователи.Пользователь = &Пользователь)

|И НЕ ГруппыДоступа.ПометкаУдаления ";

Запрос.УстановитьПараметр("Профиль",МойПрофиль);   

Запрос.УстановитьПараметр("Пользователь",МойПользователь);

Выборка = Запрос.Выполнить().Выбрать();

Если НЕ Выборка.Следующий() тогда //нет такого профиля, надо создать

МояГруппаДоступаОб = справочники.ГруппыДоступа.СоздатьЭлемент();

МояГруппаДоступаОб.Наименование = Строка(МойПрофиль);

МояГруппаДоступаОб.Пользователь = мойПользователь;

Нов = МояГруппаДоступаОб.Пользователи.Добавить();

Нов.Пользователь = МойПользователь;

МояГруппаДоступаОб.Профиль = МойПрофиль;

МояГруппаДоступаОб.Записать();

КонецЕсли; //Нет такого профиля

КонецЕсли;//профиль Администратор



После выполнения этого кода, если все, что нужно обновлено — типовая конфигурация добавит пользователю роли.

Раз уж пошли по программному пути, вот код, который добавляет пользователя в справочник Пользователи и ПользователяИБ в ПользователиИнформационнойБазы:

ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();

ПользовательИБ.имя = "Иванов";

ПользовательИБ.ПолноеИмя = "Иванов Иван Иванович";

ПользовательИБ.АутентификацияСтандартная = ИСТИНА;

ПользовательИБ.Пароль = "";

ПользовательИБ.записать();

Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",ПользовательИБ.УникальныйИдентификатор));

если Пользователь.Наименование = "" Тогда

//создаем пользователя 

ПользовательОб = Справочники.Пользователи.СоздатьЭлемент();

ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();

ЗаполнитьЗначенияСвойств(ОписаниеПользователяИБ,ПользовательИБ);

ОписаниеПользователяИБ.УникальныйИдентификатор =  ПользовательИБ.УникальныйИдентификатор;

ПользовательОб.Наименование = ОписаниеПользователяИБ.ПолноеИмя; 

ОписаниеПользователяИБ.Вставить("Действие","Записать");

ПользовательОб.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ",ОписаниеПользователяИБ);

ПользовательОб.записать();

 КонецЕсли;

Если вы добавляете не программно, то добавлять нужно из режима Предприятия — тогда пользовательИБ у вас сам создатся. 
И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе — и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит — система не даст зайти под пользователемИБ, которого нет в справочнике Пользователи.

Пока вроде все. Если будет что-то еще, буду дополнять.

33 Comments

  1. TMV

    (0) Оформление бы поправили, а так любопытно.

    Reply
  2. gull22

    Спасибо за информацию. Плюс

    Reply
  3. alyaev.a.v

    Инфа полезная, но оформить бы.

    Reply
  4. Yimaida

    Несмотря на небольшой объем, статья достаточно содержательная. Картинки добавили бы жизни к оформлению, так же как и раскраска кода. А оформление примера кода в обработку принесло бы автору sm.

    В любом случае +.

    Reply
  5. Stim213

    (5) Yurcha62, Обработка, безусловно, полезная, и ею стоит пользоваться, как многими другими, но только после того, когда знаешь, что она делает и зачем. В данной небольшой статье я и постарался принести это знание.

    Reply
  6. meganibler

    Спасибо за статью.

    Недавно потратил полдня, чтобы выяснить ровно то, что здесь описано.

    Теперь, при добавлении новых объектов план действий такой:

    1) Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

    2) Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры(ЕстьИзменения, ТолькоПроверка);

    в УТ11 можно и так:

    ПользователиСлужебный.ОбновитьПараметрыРаботыПользователей(ЕстьТекущиеИзменения, ТолькоПроверка);

    3) Редактировать профили групп пользователей

    Reply
  7. monkbest

    Отличная статья. Жаль что в 3.0ных решениях есть еще грабли. Недавно на них наступил на примере ЗУП 3.0.

    Коротко следующее:

    Я хотел дать пользователю права на один отчет. Все оказалось не так просто.

    1. При запуске программа охренеть сколько всего читает и проверяет. В роль пришлось включить много служебных справочников, несколько общих форм и регистров сведений.

    2. отчет на компановке требует не «чтение», а «просмотр». А значит пользователь через расшифровки может залезть внутрь и увидеть лишнее

    3. При правах на просомотр, если справочник был в интерфейсе, то он в нем и останется, а задача стоялала в интерфейсе оставить только отчет. Пришлось править командный интерфейс.

    Еще добавлю по другой задаче, там надо было дать доступ к документу «кадровый перевод».

    Проблем в том, что многие роли используются еще и как флажки. Т.е. они не содержат в себе прав совсем. Просто при открытии документа анализируется кодом наличие этой роли у пользователя и в зависимости от этого рисуются или НЕ рисуются элементы управления.

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

    И вообще в ЗУП 3.0 более 140 ролей типовых — они в 1С совсем охренели.

    Reply
  8. Lapitskiy

    Вот здесь я подробно с картинаками описывал: статья про УТ 11

    Reply
  9. Поручик

    (7) А ещё связки этих процедур срабатывают при изменении версии конфигурации.

    Reply
  10. AlexandrIII
    (7) А ещё связки этих процедур срабатывают при изменении версии конфигурации.

    На ИТС об этом пишут в доках по внедрению/разработке БСП:

    — для обновления разделенных вспомогательных данных (разных для каждой области данных) вызывается процедура ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации, которая по составу зарегистрированных изменений неразделенных вспомогательных, обновляет таблицы групп доступа, вспомогательную часть прав по значениям доступа, поставляемые профили групп доступа, помечает на удаление группы доступа, у которых предопределенные профили были удалены и помечены на удаление при обновлении конфигурации базы данных.

    Соответственно в процессе разработки необходимо учитывать, что для «вступиления в силу» перечисленных изменений необходим запуск обработчиков (перед проверкой текущей разработки).

    Обычно, для этого требуется изменить версию конфигурации на следующую. Для повторных запусков обработчиков следует изменять версию в регистре сведений ВерсииПодсистем на предыдующую.

    Reply
  11. trumanl

    (8) monkbest, в ЗУП 3.0 если быть точным, 243 роли !!!! это кошмар какой-то.

    на каждый «пшик» — роль.

    Reply
  12. monkbest

    (12) trumanl, видимо, от релиза к релизу их число растет:)

    Reply
  13. ZhokhovM

    Минус за плохое оформление.

    Reply
  14. stas1kbob

    статья хорошая! будет ли обновление? 1сники что- то заново нагородили в ролях

    Reply
  15. Spacer

    (7) meganibler, что-то мне это не помогает.:(

    Добавил свою роль, обновил справочник «ИдентификаторыОбъектовМетаданных»,

    обновил константу «ПараметрыРаботыПользователей», отредактировал профили групп доступа,

    а роль у пользователя так и не появилась.

    Reply
  16. chmv

    и мне не помогает

    Reply
  17. Strange Device

    При работе с правами, похоже, есть еще одна хитрость, если у пользователя установлены Полные права, а Вы хотите добавить права, которые будут работать отдельно, скажем, на новые реквизиты конфигурации хотелось бы задавать права полностью отдельно, то бишь независимо от наличия или отсутствия полных прав у пользователя, то оказывается, что установка галки в базе данных не изменяет доступность данной дополнительной роли в конфигураторе 🙁 , то бишь приходится либо самому устанавливать эту галку в конфигураторе, либо отказываться от таких «дополнительных» прав. При этом, если полных прав у пользователя нет, то все работает нормально. Данное замечание актуально не только для дополнительных прав, но и для типовых… Идея, конечно понятна, зачем нужна куча галок, если достаточно одной «ПолныеПрава», но честно сказать такой вариант несколько затрудняет администрирование дополнительных объектов…

    Reply
  18. nadegda-tere

    Обновление константы:

    Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();

    Отрабатывает только при установке монопольного режима. Поэтому чтобы собственные роли отработали (встали галочки у ролей в конфигураторе) при создании пользователя потребуется зайти в монопольном режиме.

    Как этого можно избежать?

    Reply
  19. Gureev

    (16) Spacer,

    Добавил свою роль, обновил справочник «ИдентификаторыОбъектовМетаданных»,

    обновил константу «ПараметрыРаботыПользователей», отредактировал профили групп доступа,

    а роль у пользователя так и не появилась.

    надо пометить группу доступа на удаление, и снять пометку.

    Так бывает когда группы созданы до того, как выполнены эти действия.

    Reply
  20. solary

    (18)

    установлены Полные права, а Вы хотите добавить права, которые будут работать отдельно, скажем, на новые реквизиты конфигурации хотелось бы задавать права полностью отдельно, то бишь независимо от наличия или отсутствия полных прав у пользователя, то оказывается, что установка галки в базе данных не изменяет доступность данной дополнительной роли в конфигураторе 🙁 , то бишь приходится либо самому устанавливать эту галку в конфигураторе, либо отказываться от таких «дополнительных» прав. При этом, если полных прав у пользователя нет, то все работает нормально. Данное замечание актуально не только для дополнительных прав, но и для типовых… Идея, конечно понятна, зачем нужна куча галок, если достаточно одной «ПолныеПрава», но честно сказать такой вариант несколько затрудняет админист

    Спасибо! А я всю голову сломал, что не так.

    Reply
  21. ya.Avoronov

    Очень полезная статья, спасибо!

    Reply
  22. fokin

    просто мрак

    из простого и доступного метода сделать дикие грабли

    а за статью спасибо, помогло

    Reply
  23. uno-c
    Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N — количество ролей)

    Теоретически количество профилей с различным набором ролей =2#k8SjZc9DxkN, в т.ч. однин пустой профиль (без ролей)

    Reply
  24. psy_sln

    Спасибо за статью, роль добавил, взлетело. Но есть такой вопрос: моя новая роль должна открывать доступ к одному справочнику с использованием RLS, т.е. хотелось бы заполнять вкладку «Ограничения доступа» для моего справочника, но не понятно как будут передаваться значения от туда в шаблоны RLS… Буду рад любой информации по данной теме 🙂

    Reply
  25. servisbox

    Отлично, благодарю. Инфа то, что нужно, второй день ковырял сам, пока не наткнулся на Вас.

    Reply
  26. Sergoninfostarru

    Хорошая статья. А как поступать с разными доступами до ролей для пользователя, созданного в Конфигураторе и пользователя, созданного в Предприятии? На примере УТ : в Конфигураторе — до 40 доступных ролей (Администратор системы, …, Чтение электронных документов) можно выбрать для пользователя, созданного в Конфигураторе, а для Предприятия — можно выбрать только группу доступа — Администраторы, остальные группы нужно создавать самостоятельно.

    Так получается, что сначала необходимо создать пользователя в Предприятии, а потом зайти в Конфигуратор и настроить доступные роли пользователя? Но тогда возникает большая проблема : если в Предприятии пользователя редактировали (например, изменили имя), то все настроенные доступные роли в Конфигураторе слетают и остается только «Администратор системы».

    Reply
  27. Stim213

    (27)

    Лучший Отдать $m + – Ответить

    27. Сергей (Sergoninfostarru) 2 07.04.18 01:09

    Хорошая статья. А как поступать с разными доступами до ролей для пользователя, созданного в Конфигураторе и пользователя, созданного в Предприятии? На примере УТ : в Конфигураторе — до 40 доступных ролей (Администратор системы, …, Чтение электронных документов) можно выбрать для пользователя, созданного в Конфигураторе, а для Предприятия — можно выбрать только группу доступа — Администраторы, остальные группы нужно создавать самостоятельно.

    Так получается, что сначала необходимо создать пользователя в Предприятии, а потом зайти в Конфигуратор и настроить доступные роли пользователя? Но тогда возникает большая проблема : если в Предприятии пользователя редактировали (например, изменили имя), то все настроенные доступные роли в Конфигураторе слетают и остается только «Администратор системы».

    Создавать пользователя и редактировать ему права надо исключительно в режиме Предприятия. Меняя права в конфигураторе вы рано или поздно поймаете обновление ролей и пользователю достанутся роли из Предприятия, а ваши, терпеливо созданные из Конфигуратора, благополучно очистятся.

    1С считает, что раз у пользователя есть полные права(Администратор системы), то никаких других прав ему давать не следует. И это в общем-то логично. Но вы хотите для пользователей с полными правами вести раздельный управленческий учет.

    Вариант: в Предприятии назначаете пользователю Полные права+ваши управленческие роли.И т.к. в Конфигураторе у пользователя будет только Полные права, заменяете свой код с РольДоступна(«МояУправленческаяРоль») на функцию, которая определяет, есть ли для текущего пользователя группа с этой ролью РольДоступнаПоГруппе(«МояУправленческаяРоль») .

    Reply
  28. johnnyshut23

    Хорошая публикация, спасибо! воспользуюсь!

    Reply
  29. leksv

    РодительРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию(«Роли»);//ничего страшного искать по наименованию,

    //справочник — служебный и непосредственного редактрования в нем нет

    ИдентификаторМоейРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту(«Имя»,»МояРоль»,РодительРоли);

    Почему то ошибка выходит при поиске по реквизиту. «Имя» = «БазовыеПрава»; «МояРоль» = «Базовые права» (тип ОбъектМетаданных)

    Reply
  30. 7OH

    (18) Да, если есть ПолныеПрава — другие удаляются при записи профилей или групп.

    Как это красиво обойти БЕЗ добавления в коде «ИЛИ РольДоступна(«МоиПолныеПрава»)» ?

    Reply
  31. Terve!R

    (31) так роль не будет доступна, в конфигураторе все галки с доп ролей снимаются((

    Замучился уже ставить галки на место.

    Видимо придется убирать полные права у всех, но у администратора то они должны быть, получается все равно галка у доп роли будет слетать?((

    Может найти где-то это место где удаляются эти галки при записи профиля ролей?

    Вот нашел тут решение:

    Создать группу ролей по нужной роли и в коде РольДоступна(«МояРоль») менять на РольДоступнаПоГруппе(«МояРоль»)

    Reply
  32. Terve!R

    (28)

    РольДоступнаПоГруппе(«МояУправленческаяРоль»)

    Спасибо! Всю голову сломал уже с этими слетающими галками у пользователей с полными правами!

    Reply
  33. Terve!R

    (28) Стало понятнее, но вот только в УТ 11.4 не ничего такого типа «РольДоступнаПоГруппе»

    Имелось ввиду, что нужно самому такую функцию писать?

    Reply

Leave a Comment

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