Я выпускаю расширение конфигурации для разработчиков, которое имеет свою роль. Если ее включить для пользователя, то у него будут работать многие нужные только разработчику функции из моего расширения. Поэтому всем администраторам базы ее включать вредно, т.к. они могут не обладать нужными знаниями для корректного использования этих функций.
Как БСП обновляет роли администраторов базы
БСП регулярно удаляет все лишние с ее точки зрения роли у администраторов базы даже если они назначены через группы и профили доступа. Рассмотрим логику обновления ролей администраторов в БСП 3.1.7
Администраторами считаются все элементы справочника "Пользователи", входящие в предопределенную группу доступа "Администраторы". Периодически БСП запускает процедуру УправлениеДоступомСлужебный.ОбновитьРолиПользователей() для обновления ролей пользователей базы. Она очищает все роли у администраторов базы и заполняет их списком, получаемым методом Справочники.ПрофилиГруппДоступа.ПодготовленныеСтандартныеРолиРасширенийСеанса(). Помимо предопределенных ролей он добавляет в результат только роли, имя которых кончается на следующие строки
АдминистраторСистемы
ПолныеПрава
ОбщиеПрава
Подробнее о стандартных ролях БСП можно прочитать в ИТС
Таким образом, если в расширении будет такая роль, то она будет автоматически добавляться всем администраторам. Остальные роли расширения будут удаляться у всех администраторов. А мне нужно добавить ее только выбранным администраторам. Поэтому моему расширению приходится добавлять роль прямо в пользователя базы при начале сеанса и перезапускать сеанс. Через некоторое время БСП опять удаляет эту роль и все повторяется. Это доставляет ощутимые неудобства пользователю.
Решение проблемы
Я направил в 1С пожелание обеспечить в БСП возможность выборочного добавления ролей администраторам.
Однако сейчас в качестве временного решения я сделал отдельное расширение конфигурации, которое обеспечивает защиту назначенных ролей расширений через членство администраторов в других группах доступа помимо предопределенной "Администраторы".
Расширение конфигурации состоит из одного расширения метода УправлениеДоступомСлужебный.ОбновитьРолиПользователейИБ():
&Перед("ОбновитьРолиПользователейИБ")
Процедура зршОбновитьРолиПользователейИБ(ОбновляемыеПользователиИБ, ПарольПользователяСервиса)
МассивПользователей = Новый Массив;
Для Каждого ОписаниеПользователя Из ОбновляемыеПользователиИБ Цикл
МассивПользователей.Добавить(ОписаниеПользователя.Ключ);
КонецЦикла;
СвойстваПользователей = ТекущиеСвойстваПользователей(МассивПользователей);
НовыеРолиПользователей = СвойстваПользователей.РолиПользователей;
Если СвойстваПользователей.Свойство("ИменаРолей") Тогда
ИменаРолей = СвойстваПользователей.ИменаРолей;
Для Каждого НоваяРольПользователей Из НовыеРолиПользователей Цикл
НоваяРольПользователей.Роль = ИменаРолей[НоваяРольПользователей.РольСсылка];
КонецЦикла;
КонецЕсли;
УдалитьОбновлениеПользователей = Новый Массив;
Для Каждого ОписаниеПользователя Из ОбновляемыеПользователиИБ Цикл
РолиДляУдаления = ОписаниеПользователя.Значение.РолиДляУдаления;
Отбор = Новый Структура("Пользователь", ОписаниеПользователя.Значение.ПользовательСсылка);
НовыеРоли = НовыеРолиПользователей.Скопировать(НовыеРолиПользователей.НайтиСтроки(Отбор), "Роль, РольСсылка");
ОтменитьУдалениеРолей = Новый Массив;
Для Каждого КлючИЗначение Из РолиДляУдаления Цикл
Если ТипЗнч(КлючИЗначение.Значение) = Тип("ОбъектМетаданных") Тогда
Роль = КлючИЗначение.Значение;
Иначе
Роль = Метаданные.Роли[КлючИЗначение.Ключ];
КонецЕсли;
Расширение = Роль.РасширениеКонфигурации();
Если Истина
И Расширение <> Неопределено
И НовыеРоли.Найти(Роль.Имя, "Роль") <> Неопределено
Тогда
ОтменитьУдалениеРолей.Добавить(КлючИЗначение.Ключ);
КонецЕсли;
КонецЦикла;
Для Каждого Ключ Из ОтменитьУдалениеРолей Цикл
РолиДляУдаления.Удалить(Ключ);
КонецЦикла;
Если РолиДляУдаления.Количество() = 0 И ОписаниеПользователя.Значение.РолиДляДобавления.Количество() = 0 Тогда
УдалитьОбновлениеПользователей.Добавить(ОписаниеПользователя.Ключ);
КонецЕсли;
КонецЦикла;
Для Каждого Ключ Из УдалитьОбновлениеПользователей Цикл
ОбновляемыеПользователиИБ.Удалить(Ключ);
КонецЦикла;
КонецПроцедуры
Проверено на БСП 3.1.1-10. Возможно будет работать и на других версиях 3.* . Буду постепенно обновлять эту информацию.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.344, 3.1.1.91