При доработке типовых конфигураций, таких как 1С:Управление нашей фирмой, часто возникает задача тонкой настройки прав для линейного персонала: кладовщиков, операторов производства, менеджеров. Чтобы не снимать типовую конфигурацию с поддержки, разработчики выносят настройки в расширения. Однако создание и назначение ролей через механизм расширений имеет ряд неочевидных особенностей, связанных с подсистемой управления доступом БСП (Библиотеки стандартных подсистем) и принципами работы платформы 1С.
Разберем по шагам, с какими сложностями можно столкнуться при создании ролей в расширении, как правильно зарегистрировать новую роль в системе, включить ее в профили групп доступа и почему назначенные права могут работать некорректно.
При попытке добавить созданную в расширении роль напрямую в профиль групп доступа в пользовательском режиме система часто выдает ошибку о том, что объект метаданных не зарегистрирован. Выясним причину такого поведения.
Типовые конфигурации на базе БСП хранят сведения о доступных ролях и объектах метаданных в служебных справочниках (например, ИдентификаторыОбъектовМетаданных и ИдентификаторыОбъектовРасширений). Если роль создана в расширении, БСП еще не знает о ее существовании в базе данных, поэтому не позволяет выбрать ее в профилях или группах доступа.
Кроме того, если роль назначается пользователю напрямую, разработчики нередко сталкиваются с ситуацией, когда ограничения роли игнорируются платформой, либо права неожиданно сбрасываются фоновыми заданиями.
Чтобы типовые механизмы прав увидели новую роль из расширения в справочниках профилей групп доступа, необходимо инициировать обновление вспомогательных данных информационной базы. Рассмотрим два способа решения этой задачи:
/C ЗапуститьОбновлениеИнформационнойБазы. При старте система выполнит процедуры инициализации БСП и внесет новые объекты расширения в справочник ИдентификаторыОбъектовРасширений.ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf (входит в состав БСП). Запустим ее в пользовательском режиме и выполним обновление справочников идентификаторов объектов.Важный нюанс: обязательно включим новую роль в состав хотя бы одной подсистемы (собственной в расширении или заимствованной типовой). Если роль не включена ни в одну подсистему, механизмы БСП могут проигнорировать ее при заполнении метаданных.
Проанализируем программный способ внедрения роли в типовые профили БСП. Для этого переопределим типовую логику заполнения поставляемых профилей через механизм расширений или типовой модуль.
Посмотрим на пример кода в общем модуле УправлениеДоступомПереопределяемый. Переопределим процедуру ПриЗаполненииПоставляемыхПрофилейГруппДоступа, добавив в нее свою логику распределения ролей:
Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
// Добавление новой роли в профиль "Главный бухгалтер"
Если ОписаниеПрофиля.Наименование = "Главный бухгалтер" Тогда
ОписаниеПрофиля.Роли.Добавить("ПравоРучнойКорректировкиДвиженийДокументов");
// Корректировка состава ролей для профиля "Бухгалтер"
ИначеЕсли ОписаниеПрофиля.Наименование = "Бухгалтер" Тогда
ОписаниеПрофиля.Роли.Добавить("ЧтениеДанныхСотрудников");
УдалитьРольИзОписанияПрофиля(ОписаниеПрофиля, "ДобавлениеИзменениеДанныхСотрудников");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После внесения изменений в процедуру необходимо запустить обновление информационных баз для актуализации данных профилей в пользовательском режиме.
В сценариях, когда подсистема групп доступа не используется или требуется тестовое назначение прав конкретному пользователю, можно применить прямое добавление роли к учетной записи ИБ. Разберем работу с коллекцией ролей объекта ПользовательИнформационнойБазы.
Свойство Роли доступно только для чтения как коллекция, но мы можем использовать методы Добавить() и Удалить() для изменения ее содержимого. Посмотрим на программную реализацию:
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("Кладовщик1");
Если ПользовательИБ <> Неопределено Тогда
РольИзРасширения = Метаданные.Роли.Найти("НоваяРольКладовщика");
Если РольИзРасширения <> Неопределено Тогда
ПользовательИБ.Роли.Добавить(РольИзРасширения);
ПользовательИБ.Записать();
КонецЕсли;
КонецЕсли;
Внимание: если в конфигурации включено типовое управление пользователями БСП, карточка пользователя и регламентные задания со временем синхронизируют состав ролей со справочником «Группы доступа». Поэтому прямое назначение роли объекту ПользовательИнформационнойБазы без настройки групп доступа БСП приведет к тому, что при следующей записи пользователя в режиме предприятия добавленные роли будут сброшены.
Если роль назначена, но пользователь видит лишние объекты или, наоборот, не может получить доступ, проанализируем следующие ключевые особенности платформы: