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

База знаний
  1. 9 г. назад

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

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

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

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

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

    РодительРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию("Роли");//ничего страшного искать по наименованию, 
    //справочник - служебный и непосредственного редактрования в нем нет
    ИдентификаторМоейРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту("Имя","МояРоль",РодительРоли);
    Если ЗначениеЗаполнено(ИдентификаторМоейРоли) Тогда
    НайденныйИдентификаторМоейРоли = МойПрофиль.Роли.Найти(ИдентификаторМоейРоли );
    Если НайденныйИдентификаторМоейРоли= неопределено тогда
    НовСтрока = МойПрофиль.Роли.Добавить();
    НовСтрока.Роль = ИдентификаторМоейРоли;
    КонецЕсли;
    КонецЕсли;
     Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:
    Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(ИСТИНА,ЛОЖЬ,ЛОЖЬ);//ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка

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

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

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

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

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

    //МойПрофиль - профиль, который мы хотим добавить пользователю МойПользователь
    
    
    Если МойПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда // если мы хотим пользователю дать роль Администратора, 
    //то нельзя создавать новую группу доступа, надо редактировать предопределенную Администраторы
    ГруппаДоступаАдм = Справочники.ГруппыДоступа.Администраторы;
    Если ГруппаДоступаАдм.Пользователи.Найти(МойПользователь) = неопределено Тогда
    ГруппаДоступаАдмОб= ГруппаДоступаАдм.ПолучитьОбъект();
    НовСтрока = ГруппаДоступаАдмОб.Пользователи.Добавить();
    НовСтрока.Пользователь = МойПользователь;
    ГруппаДоступаАдмОб.Записать();
    КонецЕсли;
    Иначе // все прочие профили, кроме Администратора
    Запрос = новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |ГруппыДоступа.Ссылка
    |ИЗ
    |Справочник.ГруппыДоступа КАК ГруппыДоступа
    |ГДЕ
    |ГруппыДоступа.Профиль = &Профиль
    |И (ГруппыДоступа.Пользователь = &Пользователь
    |ИЛИ ГруппыДоступа.Пользователи.Пользователь = &Пользователь)
    |И НЕ ГруппыДоступа.ПометкаУдаления ";
    Запрос.УстановитьПараметр("Профиль",МойПрофиль);   
    Запрос.УстановитьПараметр("Пользователь",МойПользователь);
    Выборка = Запрос.Выполнить().Выбрать();
    Если НЕ Выборка.Следующий() тогда //нет такого профиля, надо создать
    МояГруппаДоступаОб = справочники.ГруппыДоступа.СоздатьЭлемент();
    МояГруппаДоступаОб.Наименование = Строка(МойПрофиль);
    МояГруппаДоступаОб.Пользователь = мойПользователь;
    Нов = МояГруппаДоступаОб.Пользователи.Добавить();
    Нов.Пользователь = МойПользователь;
    МояГруппаДоступаОб.Профиль = МойПрофиль;
    МояГруппаДоступаОб.Записать();
    КонецЕсли; //Нет такого профиля
    КонецЕсли;//профиль Администратор
    

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

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

    ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
    ПользовательИБ.имя = "Иванов";
    ПользовательИБ.ПолноеИмя = "Иванов Иван Иванович";
    ПользовательИБ.АутентификацияСтандартная = ИСТИНА;
    ПользовательИБ.Пароль = "";
    ПользовательИБ.записать();
    Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",ПользовательИБ.УникальныйИдентификатор));
    если Пользователь.Наименование = "" Тогда
    //создаем пользователя 
    ПользовательОб = Справочники.Пользователи.СоздатьЭлемент();
    ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
    ЗаполнитьЗначенияСвойств(ОписаниеПользователяИБ,ПользовательИБ);
    ОписаниеПользователяИБ.УникальныйИдентификатор =  Соединение.NewObject("УникальныйИдентификатор",ПользовательИБ.УникальныйИдентификатор);
    ПользовательОб.Наименование = ОписаниеПользователяИБ.ПолноеИмя; 
    ОписаниеПользователяИБ.Вставить("Действие","Записать");
    ПользовательОб.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ",ОписаниеПользователяИБ);
    ПользовательОб.записать();
     КонецЕсли;
    

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

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

  2. С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа. Теперь:
    Вводная та же. Чтобы дать пользователю какие-то права на документ - сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект

    Я дико извиняюсь, речь о типовых конфах ведь так ? Если я создам с нуля конфу на три справочника, документ, регистр в моей конфе не будет же этого геморроя верно ? И второй момент весь этот бедлам они выдумали ведь без относительно УФ ?

    Ответы: (2)
  3. (1)

    Будущий_Олигарх Я дико извиняюсь, речь о типовых конфах?

    ну естессно. речь о разработчиках конф, а не платформенных. В своей можешь делать как хочешь, но лучше конечно же ориентироваться на БСП(спорно)

    Будущий_Олигарх И второй момент весь этот бедлам они выдумали ведь без относительно УФ

    это и на обычных формах будет, но механизм начали внедрять только на УФ

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

  5. Мне интереснее понять задумку сего механизма, почему разрабы конф пошли таким путем. То есть целеполагание этого действия какие ? Дать больше возможностей разруливать права, через приложение, а не через конфигу ?

    Ответы: (5)
  6. (4) видимо, да, давно же муссируется мысль про вход в конфигуратор только по сертификату

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

    Ответы: (7)
  8. (6) новая система тоже не без греха. Например, все основные бух права сосредоточены в одной основной роли бухгалтерской. Чтобы ограничить, к примеру, доступ к справочнику СтатьиЗатрат - нужно создавать свою роль.
    Хорошо бы, если б новый механизм был действительно полноценным конструктором, а то сейчас получается это Автомобиль и куча прибамбасов к нему.

    Ответы: (8) (9)
  9. Stim ... тоже не без греха ...

    [smile=:D] Рассмешил ))))

    Система прав доступа это один сплошной ГРЕХ и СМЕХ. И что бы по человечий что либо сделать нужно столько грехов с пофигуратором совершить, что не удобно становиться ))))

    Ответы: (10)
  10. (7) Пейсатели конфигураций как могут исправляют кривую методологию пейсателей платформы

  11. Будущий_Олигарх нужно столько грехов с пофигуратором совершить

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

  12. Подскажите комрады, в типовой бухии 3.х сейчас есть тонкая настройка прав по объектно ? То есть разграничить списком контрагентов например ? То есть один бух видит только таких контрагентов, а другой бух видит только таких контрагентов ?

    Ответы: (12)
  13. (11) имхо - нет. такое только в УТ

    Ответы: (13)
  14. (12) Stim `ка ты как самый умный подскажи алгоритм действий что бы реализовать данную фичу в конфе ?
    Я так понимаю минимальный алгоритм действий это создать РС контрагенты=пользователь и в РЛС дописать типа получения списка с ограничением по текущему пользователю ?

    Ответы: (14)
  15. (13) ты там разделение данных допилил ли?

    Ответы: (15) (18)
  16. (14) а разве и в БП3 и в УТ11 не используется одни и те же подсистемы из БСП?

    Ответы: (16) (18)
  17. (15) мне очень сложно ответить тебе..без мата..

    Ответы: (17)
  18. (16) жги, не стесняйся. на крайняк есть скрытый текст

    Ответы: (19)
  19. (15) Они походу под разными соусами приготовлены, да еще и разными поварами которые особо не вдавались в консистенцию препарата!

    (14) Разделение данных интересное, но жестковатая тема. Как то мягче хочется, нежнее что ли.

  20. (17) ну вобщем, используется БСП - но как основа. в УТ есть спр ГруппыДоступаПартнеров, который связывает ГруппыДоступа польз с партнерами/контрагентами

    но блеать даже в ЗУП и БП - разные служебные модули! Служебные блеать!! по обновлению конфигурации! о какой унификации и БСП можно вообще говорить?!?

    Ответы: (20)
  21. Stim даже в ЗУП и БП - разные служебные модули!

    они разные - из разных версий БСП, или вообще тупо разные?

    Ответы: (21)
  22. (20) в БП это модуль ОбновлениеИнформационнойБазы(), в ЗУП - ОбновлениеИнформационнойБазыЗК()

    если захочешь обновлять базы программно - придется поиметь немало гемора

    Ответы: (22)
  23. (21) да, эти суффиксы "ЗК" видел, но особо не лез в дебри

  24. Stim поможи по вопросу есть типовая бухия и нужно наложить ограничение на какой ни будь справочник, который в типовой не разграничен. Какие действия ? Хотя бы на пальцах, те же когда статью эту писал ковырял всяко глубже этот РЛС ?

    Ответы: (24)
  25. (23)хз, чувак..разбираться в десятке справочников и РС, отвечающих за доступ - долго.
    я бы на твоем месте создал новые группы доступа с пустыми ролями( типа КонтрагентыМосква, КонтрагентыПитер или какое у тебя там разделение), добавил реквизит "ГруппаДоступа" каждому контру и в рлс к контрагентам на чтение проверял бы параметры сеанса пользователя(по группам) на включение в них значения реквизита.
    ну если разделение посложнее - то РС с реквизитами ГруппаДоступа, контрагент

  26. Это чума капитальная )))) Я просто не навижу УФ )))

    Пытался найти где заполняется вот этот списочек
    права доступа.png
    Хер, не смог. просто мистика какая-то, ткните кому не лень по ковырять РЛС.

    Ответы: (26)
  27. (25) это либо таблица на форме, либо запись РС

    Ответы: (27)
  28. (26) в свойствах реквизита вроде предопределенные элементы есть

    Ответы: (28)
  29. (27) Нет там нифига. Сам реквизит имеет умное значение "ОпределяемыйТип.ЗначениеДоступа", но вот список доступных значений где-то инициализируется в параметрах то ли сеанса, то ли еще какой мутатени. В общем поиски продолжаются.

  30. ОпределяемыйТип есть в дереве метаданных?

    Ответы: (30)
  31. (29) Есть, там куда больше значений определенно чем эти три. Там составной тип. Туда я свой справочник-то добавил, думал ща там появиться в списке моя хотелка, а дальше ошибки будут вываливаться и я на горячую по ошибкам везде где нужно подкручу. Но не тут то было.

  32. 15.09.2014 16:21:43 отредактировано Будущий_Олигарх

    Будь проклят тот день когда 1С выпустила УФ/ТАКСИ и прочую ересь.

    Ни хера не могу я добраться до этого злосчастного отбора. [smile=>:(]

или зарегистрируйтесь чтобы ответить!