Будут перечислены все те грабли, которые собрал автор, чтобы вы о них знали.
Как было раньше( в обычном приложении):
Есть документ. Есть Роли — ПолныеПрава, ДокументНетДоступа, ДокументТолькоЧтение, ДокументЧтениеИРедактирование. В конфигураторе(аналогичный механизм в реж предприятия) вы выставляете пользователям эти роли и у них появляются соответствующие права доступа на документ. Все просто и скучно и даже зевать хочется.
С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа. Теперь:
Вводная та же. Чтобы дать пользователю какие-то права на документ — сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект, который объединяет роли в группы ролей. Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N — количество ролей), но на практике количество профилей определяется количеством должностных обязанностей пользователей в организации и их гораздо меньше, чем ролей.
Создаем профили Бесправный(с ролью ДокументНетДоступа), Аудитор(с ролью ДокументТолькоЧтение), Бухгалтер(с ролью ДокументЧтениеИРедактирование).
Чтобы «привязать» эти профили к пользователям — нужно создать элементы справочника ГруппыДоступа. В типовых они создаются автоматически, когда вы отмечаете галочками профили для пользователя. Этот справочник соединяет профиль и пользователя(или нескольких пользователей).
При записи этого элемента справочника система автоматически добавляет роли (из профиля) в роли пользователя. Поэтому не стоит напрямую редактировать роли в конфигураторе, как раньше — при редактировании прав в Предприятии все роли в конфигураторе будут обновлены на роли из профилей пользователя. Кроме того, будет наблюдаться явное противоречение между набором профилей с ролями и ролями, установленными в конфигураторе.
Как хранятся роли в Профиле групп доступа, спросите вы. Ведь роли — это объекты МД, это не ссылочные типы. Отвечаю — для этого(и не только) разработчики создали служебный справочник ИдентификаторыОбъектовМетаданных, в котором хранится( в иерархии!) имена, синонимы, значения пустых ссылок всех объектов МД. Если вы хотите создать Профиль программно и добавить в него роль, то код примерно будет таким:
РодительРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию("Роли");//ничего страшного искать по наименованию,
//справочник - служебный и непосредственного редактрования в нем нет
ИдентификаторМоейРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту("Имя","МояРоль",РодительРоли);
Если ЗначениеЗаполнено(ИдентификаторМоейРоли) Тогда
НайденныйИдентификаторМоейРоли = МойПрофиль.Роли.Найти(ИдентификаторМоейРоли );
Если НайденныйИдентификаторМоейРоли= неопределено тогда
НовСтрока = МойПрофиль.Роли.Добавить();
НовСтрока.Роль = ИдентификаторМоейРоли;
КонецЕсли;
КонецЕсли;
Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(ИСТИНА,ЛОЖЬ,ЛОЖЬ);//ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка
Процедуру следует запускать каждый раз, когда вы вносите изменения в метаданные, особенно когда изменяете роли, объекты, связанные с новыми ролями.
Отлично. Роль добавили, идентификаторы обновили.
Но обратная связь не работает — вы в режиме предприятия назначили пользователю профиль( с созданием группы доступа), а роль у пользователя в конфигураторе не добавилась! Что делать?
За синхронизацию ролей/профилей отвечает константа ПараметрыРаботыПользователей. Если роли не обновляются в конфигураторе, следует обновить её значение:
Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();
Хорошо, скажите вы. А как быть, если я хочу создать группы доступа программно? Да не вопрос. Единственное ограничение — не допускаются дубли связок Профиль-Пользоваль в группах доступа. Примерный код будет таким:
//МойПрофиль - профиль, который мы хотим добавить пользователю МойПользователь
Если МойПрофиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда // если мы хотим пользователю дать роль Администратора,
//то нельзя создавать новую группу доступа, надо редактировать предопределенную Администраторы
ГруппаДоступаАдм = Справочники.ГруппыДоступа.Администраторы;
Если ГруппаДоступаАдм.Пользователи.Найти(МойПользователь) = неопределено Тогда
ГруппаДоступаАдмОб= ГруппаДоступаАдм.ПолучитьОбъект();
НовСтрока = ГруппаДоступаАдмОб.Пользователи.Добавить();
НовСтрока.Пользователь = МойПользователь;
ГруппаДоступаАдмОб.Записать();
КонецЕсли;
Иначе // все прочие профили, кроме Администратора
Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|ГруппыДоступа.Ссылка
|ИЗ
|Справочник.ГруппыДоступа КАК ГруппыДоступа
|ГДЕ
|ГруппыДоступа.Профиль = &Профиль
|И (ГруппыДоступа.Пользователь = &Пользователь
|ИЛИ ГруппыДоступа.Пользователи.Пользователь = &Пользователь)
|И НЕ ГруппыДоступа.ПометкаУдаления ";
Запрос.УстановитьПараметр("Профиль",МойПрофиль);
Запрос.УстановитьПараметр("Пользователь",МойПользователь);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() тогда //нет такого профиля, надо создать
МояГруппаДоступаОб = справочники.ГруппыДоступа.СоздатьЭлемент();
МояГруппаДоступаОб.Наименование = Строка(МойПрофиль);
МояГруппаДоступаОб.Пользователь = мойПользователь;
Нов = МояГруппаДоступаОб.Пользователи.Добавить();
Нов.Пользователь = МойПользователь;
МояГруппаДоступаОб.Профиль = МойПрофиль;
МояГруппаДоступаОб.Записать();
КонецЕсли; //Нет такого профиля
КонецЕсли;//профиль Администратор
После выполнения этого кода, если все, что нужно обновлено — типовая конфигурация добавит пользователю роли.
Раз уж пошли по программному пути, вот код, который добавляет пользователя в справочник Пользователи и ПользователяИБ в ПользователиИнформационнойБазы:
ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
ПользовательИБ.имя = "Иванов";
ПользовательИБ.ПолноеИмя = "Иванов Иван Иванович";
ПользовательИБ.АутентификацияСтандартная = ИСТИНА;
ПользовательИБ.Пароль = "";
ПользовательИБ.записать();
Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",ПользовательИБ.УникальныйИдентификатор));
если Пользователь.Наименование = "" Тогда
//создаем пользователя
ПользовательОб = Справочники.Пользователи.СоздатьЭлемент();
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ЗаполнитьЗначенияСвойств(ОписаниеПользователяИБ,ПользовательИБ);
ОписаниеПользователяИБ.УникальныйИдентификатор = ПользовательИБ.УникальныйИдентификатор;
ПользовательОб.Наименование = ОписаниеПользователяИБ.ПолноеИмя;
ОписаниеПользователяИБ.Вставить("Действие","Записать");
ПользовательОб.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ",ОписаниеПользователяИБ);
ПользовательОб.записать();
КонецЕсли;
Если вы добавляете не программно, то добавлять нужно из режима Предприятия — тогда пользовательИБ у вас сам создатся.
И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе — и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит — система не даст зайти под пользователемИБ, которого нет в справочнике Пользователи.
Пока вроде все. Если будет что-то еще, буду дополнять.
(0) Оформление бы поправили, а так любопытно.
Спасибо за информацию. Плюс
Инфа полезная, но оформить бы.
Несмотря на небольшой объем, статья достаточно содержательная. Картинки добавили бы жизни к оформлению, так же как и раскраска кода. А оформление примера кода в обработку принесло бы автору sm.
В любом случае +.
(5) Yurcha62, Обработка, безусловно, полезная, и ею стоит пользоваться, как многими другими, но только после того, когда знаешь, что она делает и зачем. В данной небольшой статье я и постарался принести это знание.
Спасибо за статью.
Недавно потратил полдня, чтобы выяснить ровно то, что здесь описано.
Теперь, при добавлении новых объектов план действий такой:
1) Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
2) Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры(ЕстьИзменения, ТолькоПроверка);
в УТ11 можно и так:
ПользователиСлужебный.ОбновитьПараметрыРаботыПользователей(ЕстьТекущиеИзменения, ТолькоПроверка);
3) Редактировать профили групп пользователей
Отличная статья. Жаль что в 3.0ных решениях есть еще грабли. Недавно на них наступил на примере ЗУП 3.0.
Коротко следующее:
Я хотел дать пользователю права на один отчет. Все оказалось не так просто.
1. При запуске программа охренеть сколько всего читает и проверяет. В роль пришлось включить много служебных справочников, несколько общих форм и регистров сведений.
2. отчет на компановке требует не «чтение», а «просмотр». А значит пользователь через расшифровки может залезть внутрь и увидеть лишнее
3. При правах на просомотр, если справочник был в интерфейсе, то он в нем и останется, а задача стоялала в интерфейсе оставить только отчет. Пришлось править командный интерфейс.
Еще добавлю по другой задаче, там надо было дать доступ к документу «кадровый перевод».
Проблем в том, что многие роли используются еще и как флажки. Т.е. они не содержат в себе прав совсем. Просто при открытии документа анализируется кодом наличие этой роли у пользователя и в зависимости от этого рисуются или НЕ рисуются элементы управления.
таким образом создание своей роли с доступом к документу не позволяет его нормально открыть, приходится править код, что считаю недопустимым при настройке прав, но выхода нет.
И вообще в ЗУП 3.0 более 140 ролей типовых — они в 1С совсем охренели.
Вот здесь я подробно с картинаками описывал:статья про УТ 11
(7) А ещё связки этих процедур срабатывают при изменении версии конфигурации.
На ИТС об этом пишут в доках по внедрению/разработке БСП:
Соответственно в процессе разработки необходимо учитывать, что для «вступиления в силу» перечисленных изменений необходим запуск обработчиков (перед проверкой текущей разработки).
Обычно, для этого требуется изменить версию конфигурации на следующую. Для повторных запусков обработчиков следует изменять версию в регистре сведений ВерсииПодсистем на предыдующую.
(8) monkbest, в ЗУП 3.0 если быть точным, 243 роли !!!! это кошмар какой-то.
на каждый «пшик» — роль.
(12) trumanl, видимо, от релиза к релизу их число растет:)
Минус за плохое оформление.
статья хорошая! будет ли обновление? 1сники что- то заново нагородили в ролях
(7) meganibler, что-то мне это не помогает.:(
Добавил свою роль, обновил справочник «ИдентификаторыОбъектовМетаданных»,
обновил константу «ПараметрыРаботыПользователей», отредактировал профили групп доступа,
а роль у пользователя так и не появилась.
и мне не помогает
При работе с правами, похоже, есть еще одна хитрость, если у пользователя установлены Полные права, а Вы хотите добавить права, которые будут работать отдельно, скажем, на новые реквизиты конфигурации хотелось бы задавать права полностью отдельно, то бишь независимо от наличия или отсутствия полных прав у пользователя, то оказывается, что установка галки в базе данных не изменяет доступность данной дополнительной роли в конфигураторе 🙁 , то бишь приходится либо самому устанавливать эту галку в конфигураторе, либо отказываться от таких «дополнительных» прав. При этом, если полных прав у пользователя нет, то все работает нормально. Данное замечание актуально не только для дополнительных прав, но и для типовых… Идея, конечно понятна, зачем нужна куча галок, если достаточно одной «ПолныеПрава», но честно сказать такой вариант несколько затрудняет администрирование дополнительных объектов…
Обновление константы:
Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();
Отрабатывает только при установке монопольного режима. Поэтому чтобы собственные роли отработали (встали галочки у ролей в конфигураторе) при создании пользователя потребуется зайти в монопольном режиме.
Как этого можно избежать?
(16) Spacer,
обновил константу «ПараметрыРаботыПользователей», отредактировал профили групп доступа,
а роль у пользователя так и не появилась.
надо пометить группу доступа на удаление, и снять пометку.
Так бывает когда группы созданы до того, как выполнены эти действия.
(18)
Спасибо! А я всю голову сломал, что не так.
Очень полезная статья, спасибо!
просто мрак
из простого и доступного метода сделать дикие грабли
а за статью спасибо, помогло
Теоретически количество профилей с различным набором ролей =2#k8SjZc9DxkN, в т.ч. однин пустой профиль (без ролей)
Спасибо за статью, роль добавил, взлетело. Но есть такой вопрос: моя новая роль должна открывать доступ к одному справочнику с использованием RLS, т.е. хотелось бы заполнять вкладку «Ограничения доступа» для моего справочника, но не понятно как будут передаваться значения от туда в шаблоны RLS… Буду рад любой информации по данной теме 🙂
Отлично, благодарю. Инфа то, что нужно, второй день ковырял сам, пока не наткнулся на Вас.
Хорошая статья. А как поступать с разными доступами до ролей для пользователя, созданного в Конфигураторе и пользователя, созданного в Предприятии? На примере УТ : в Конфигураторе — до 40 доступных ролей (Администратор системы, …, Чтение электронных документов) можно выбрать для пользователя, созданного в Конфигураторе, а для Предприятия — можно выбрать только группу доступа — Администраторы, остальные группы нужно создавать самостоятельно.
Так получается, что сначала необходимо создать пользователя в Предприятии, а потом зайти в Конфигуратор и настроить доступные роли пользователя? Но тогда возникает большая проблема : если в Предприятии пользователя редактировали (например, изменили имя), то все настроенные доступные роли в Конфигураторе слетают и остается только «Администратор системы».
(27)
27. Сергей (Sergoninfostarru) 2 07.04.18 01:09
Хорошая статья. А как поступать с разными доступами до ролей для пользователя, созданного в Конфигураторе и пользователя, созданного в Предприятии? На примере УТ : в Конфигураторе — до 40 доступных ролей (Администратор системы, …, Чтение электронных документов) можно выбрать для пользователя, созданного в Конфигураторе, а для Предприятия — можно выбрать только группу доступа — Администраторы, остальные группы нужно создавать самостоятельно.
Так получается, что сначала необходимо создать пользователя в Предприятии, а потом зайти в Конфигуратор и настроить доступные роли пользователя? Но тогда возникает большая проблема : если в Предприятии пользователя редактировали (например, изменили имя), то все настроенные доступные роли в Конфигураторе слетают и остается только «Администратор системы».
Создавать пользователя и редактировать ему права надо исключительно в режиме Предприятия. Меняя права в конфигураторе вы рано или поздно поймаете обновление ролей и пользователю достанутся роли из Предприятия, а ваши, терпеливо созданные из Конфигуратора, благополучно очистятся.
1С считает, что раз у пользователя есть полные права(Администратор системы), то никаких других прав ему давать не следует. И это в общем-то логично. Но вы хотите для пользователей с полными правами вести раздельный управленческий учет.
Вариант: в Предприятии назначаете пользователю Полные права+ваши управленческие роли.И т.к. в Конфигураторе у пользователя будет только Полные права, заменяете свой код с РольДоступна(«МояУправленческаяРоль») на функцию, которая определяет, есть ли для текущего пользователя группа с этой ролью РольДоступнаПоГруппе(«МояУправленческаяРоль») .
Хорошая публикация, спасибо! воспользуюсь!
РодительРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию(«Роли»);//ничего страшного искать по наименованию,
//справочник — служебный и непосредственного редактрования в нем нет
ИдентификаторМоейРоли = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоРеквизиту(«Имя»,»МояРоль»,РодительРоли);
Почему то ошибка выходит при поиске по реквизиту. «Имя» = «БазовыеПрава»; «МояРоль» = «Базовые права» (тип ОбъектМетаданных)
(18) Да, если есть ПолныеПрава — другие удаляются при записи профилей или групп.
Как это красиво обойти БЕЗ добавления в коде «ИЛИ РольДоступна(«МоиПолныеПрава»)» ?
(31) так роль не будет доступна, в конфигураторе все галки с доп ролей снимаются((
Замучился уже ставить галки на место.
Видимо придется убирать полные права у всех, но у администратора то они должны быть, получается все равно галка у доп роли будет слетать?((
Может найти где-то это место где удаляются эти галки при записи профиля ролей?
Вот нашел тут решение:
Создать группу ролей по нужной роли и в коде РольДоступна(«МояРоль») менять на РольДоступнаПоГруппе(«МояРоль»)
(28)
Спасибо! Всю голову сломал уже с этими слетающими галками у пользователей с полными правами!
(28) Стало понятнее, но вот только в УТ 11.4 не ничего такого типа «РольДоступнаПоГруппе»
Имелось ввиду, что нужно самому такую функцию писать?