Как создать роль в расширении конфигурации 1С и назначить ее пользователям

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

При доработке типовых конфигураций, таких как 1С:Управление нашей фирмой, часто возникает задача тонкой настройки прав для линейного персонала: кладовщиков, операторов производства, менеджеров. Чтобы не снимать типовую конфигурацию с поддержки, разработчики выносят настройки в расширения. Однако создание и назначение ролей через механизм расширений имеет ряд неочевидных особенностей, связанных с подсистемой управления доступом БСП (Библиотеки стандартных подсистем) и принципами работы платформы 1С.

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

Анализ проблемы: почему роль не видна или выдает ошибку

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

Типовые конфигурации на базе БСП хранят сведения о доступных ролях и объектах метаданных в служебных справочниках (например, ИдентификаторыОбъектовМетаданных и ИдентификаторыОбъектовРасширений). Если роль создана в расширении, БСП еще не знает о ее существовании в базе данных, поэтому не позволяет выбрать ее в профилях или группах доступа.

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

Решение 1. Обновление служебных данных БСП для регистрации роли

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

  1. Запуск с параметром обновления: запустим информационную базу в режиме «Предприятие» с ключом командной строки /C ЗапуститьОбновлениеИнформационнойБазы. При старте система выполнит процедуры инициализации БСП и внесет новые объекты расширения в справочник ИдентификаторыОбъектовРасширений.
  2. Использование внешней обработки: воспользуемся специализированной служебной обработкой ИнструментыРазработчикаОбновлениеВспомогательныхДанных.epf (входит в состав БСП). Запустим ее в пользовательском режиме и выполним обновление справочников идентификаторов объектов.

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

Решение 2. Программное включение роли в профили групп доступа

Проанализируем программный способ внедрения роли в типовые профили БСП. Для этого переопределим типовую логику заполнения поставляемых профилей через механизм расширений или типовой модуль.

Посмотрим на пример кода в общем модуле УправлениеДоступомПереопределяемый. Переопределим процедуру ПриЗаполненииПоставляемыхПрофилейГруппДоступа, добавив в нее свою логику распределения ролей:


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

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

Решение 3. Назначение роли напрямую через ПользовательИнформационнойБазы

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

Свойство Роли доступно только для чтения как коллекция, но мы можем использовать методы Добавить() и Удалить() для изменения ее содержимого. Посмотрим на программную реализацию:


ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("Кладовщик1");
Если ПользовательИБ <> Неопределено Тогда
    РольИзРасширения = Метаданные.Роли.Найти("НоваяРольКладовщика");
    Если РольИзРасширения <> Неопределено Тогда
        ПользовательИБ.Роли.Добавить(РольИзРасширения);
        ПользовательИБ.Записать();
    КонецЕсли;
КонецЕсли;

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

Почему права и ограничения созданной роли могут не работать

Если роль назначена, но пользователь видит лишние объекты или, наоборот, не может получить доступ, проанализируем следующие ключевые особенности платформы:

  1. Принцип объединения прав (логическое «ИЛИ»): Права нескольких ролей одного пользователя в 1С всегда суммируются. Новая роль может дать дополнительные разрешения, но не способна отобрать права, выданные другими ролями. Если кладовщику назначена типовая роль, открывающая весь справочник или документы, создание отдельной ограниченной роли не закроет к ним доступ.
  2. Заимствование объектов в расширение: Чтобы настроить права или ограничения доступа (RLS) на конкретные справочники или документы основной конфигурации, эти объекты обязательно должны быть предварительно заимствованы в состав метаданных расширения.
  3. Безопасный режим расширения: Проверим список расширений в режиме конфигуратора или предприятия. Если для расширения установлен флажок «Безопасный режим», платформа накладывает жесткие ограничения на доступ к данным и выполнение кода, что может блокировать работу ролей. Для полноценного управления доступом безопасный режим расширения должен быть отключен.
  4. Модификация типовой роли вместо создания новой: Если цель состоит в том, чтобы урезать доступ (запретить редактирование определенных реквизитов или проведение документов), правильнее не создавать новую роль, а заимствовать в расширение существующую типовую роль и снять с нее лишние флаги прав. В этом случае платформа применит результирующие права с учетом изменений в расширении.
← На главную