К статье
Практический материал

Администрирование · 10 мин

Как программно добавить роль в 1С

Как программно добавить роль в 1С: способы через конфигуратор, расширение и код, назначение ролей пользователям, проверка прав и типичные ошибки.

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

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

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

Что такое роль в 1С и какие способы её добавить существуют

Роль — это именованный набор прав: чтение, добавление, изменение, удаление, просмотр, интерактивные операции и доступ к командам. Роли комбинируются: итоговые права пользователя — это объединение прав всех назначенных ему ролей. Если хотя бы одна роль даёт право — оно есть; запретить право через другую роль нельзя.

Программно или полупрограммно роль можно добавить четырьмя путями: вручную в конфигураторе (базовый вариант), через расширение конфигурации, пакетной выгрузкой-загрузкой конфигурации в файлы XML с добавлением описания роли, а также через EDT. Непосредственно «создать объект метаданных роль» кодом встроенного языка в режиме предприятия нельзя — метаданные изменяются только на этапе разработки.

Добавление роли через конфигуратор и расширение

Классический способ: открыть конфигуратор, в дереве конфигурации перейти в ветку «Общие → Роли», добавить новую роль и в редакторе прав отметить нужные объекты и виды доступа. После сохранения конфигурации и обновления конфигурации базы данных роль становится доступна для назначения пользователям.

Если конфигурация типовая и находится на поддержке, изменять её напрямую нежелательно — при обновлении изменения могут быть потеряны. В этом случае роль добавляют через расширение: «Конфигурация → Расширения конфигурации», создать расширение, добавить в него собственную роль и настроить права. Расширение подключается без снятия конфигурации с поддержки и переживает обновления.

Программное назначение роли пользователю

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

ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");

Если ПользовательИБ = Неопределено Тогда

ВызватьИсключение "Пользователь не найден";

КонецЕсли;

Роль = Метаданные.Роли.Найти("МенеджерПоПродажам");

Если Роль = Неопределено Тогда

ВызватьИсключение "Роль не найдена в конфигурации";

КонецЕсли;

Если Не ПользовательИБ.Роли.Содержит(Роль) Тогда

ПользовательИБ.Роли.Добавить(Роль);

ПользовательИБ.Записать();

КонецЕсли;

Код выполняется в контексте, где у текущего сеанса есть право администрирования (роль «АдминистраторСистемы» или «ПолныеПрава»). Обычно такой код запускают из внешней обработки, фонового задания или обработчика обновления. Проверка Содержит перед добавлением защищает от дублирования и делает код идемпотентным — безопасным для повторного запуска.

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

Массовое назначение роли группе пользователей

Когда роль нужно выдать сразу нескольким пользователям, перебирают коллекцию пользователей информационной базы и назначают роль каждому. Фильтровать можно по имени, по принадлежности к подразделению (если пользователи ИБ связаны со справочником «Пользователи» в типовых конфигурациях) или по уже имеющимся ролям.

Роль = Метаданные.Роли.БазовыеПраваБСП;

Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл

Если Не ПользовательИБ.Роли.Содержит(Роль) Тогда

ПользовательИБ.Роли.Добавить(Роль);

ПользовательИБ.Записать();

КонецЕсли;

КонецЦикла;

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

Порядок действий
  1. 1
    Создайте роль в конфигураторе или расширении и настройте права
  2. 2
    Обновите конфигурацию базы данных
  3. 3
    Напишите код назначения роли через ПользователиИнформационнойБазы
  4. 4
    Проверьте код на копии базы под тестовым пользователем
  5. 5
    Выполните назначение в рабочей базе и проверьте вход пользователя

Добавление роли при обновлении конфигурации поставки

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

Для пакетного создания роли как метаданных при автоматизированной сборке используют выгрузку конфигурации в файлы XML: файл роли добавляется в каталог Roles, ссылка на него — в корневой файл конфигурации, после чего конфигурация загружается обратно параметром /LoadConfigFromFiles. Это продвинутый сценарий для CI/CD, требующий аккуратной работы с форматом выгрузки.

Проверка результата и ограничения

После назначения роли проверьте результат двумя способами. Программно — повторно получите пользователя и убедитесь, что Роли.Содержит() возвращает Истина, либо используйте функцию РольДоступна("ИмяРоли") в сеансе нужного пользователя. Практически — войдите под этим пользователем и откройте объект, на который давались права.

Учтите ограничения: изменения ролей пользователя ИБ применяются к уже открытым сеансам не всегда сразу — надёжнее попросить пользователя перезайти. В клиент-серверном режиме запись пользователей ИБ требует монопольного доступа не всегда, но при активных блокировках возможны ошибки — выполняйте операцию в период низкой нагрузки. Также помните про права на уровне записей (RLS): даже при наличии роли доступ может ограничиваться шаблонами ограничений.

Контрольные точки

Как проверить результат

Роль в коллекции пользователя
Норма

Роли.Содержит(Роль) возвращает Истина

Тревожный признак

Роль отсутствует — код не выполнился или была ошибка записи

Вход пользователя
Норма

Пользователь входит и видит нужные объекты

Тревожный признак

Ошибка «Нарушение прав доступа» при открытии объекта

Функция РольДоступна()
Норма

Возвращает Истина в сеансе пользователя

Тревожный признак

Ложь — роль не назначена или сеанс не обновлён

Типичные ошибки при программной работе с ролями

Самая частая ошибка — обращение к несуществующей роли по имени: после переименования роли в конфигурации код с литералом имени перестаёт работать. Используйте проверку Метаданные.Роли.Найти() и осмысленное исключение. Вторая ошибка — забытый вызов Записать(): коллекция ролей изменена в памяти, но в базу не сохранена.

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

Типичные ошибки
01
Обращение к роли по имени без проверки Найти() — исключение после переименования роли
02
Пропущен вызов Записать() — изменения не сохраняются в базе
03
Запуск кода без административных прав — ошибка нарушения прав доступа
04
Назначение ролей напрямую в типовой конфигурации вместо профилей групп доступа — конфликт со штатными механизмами
05
Назначение роли из расширения без учёта его возможного отключения — потеря прав у пользователей
Итог

Что важно запомнить

Роль как метаданные создаётся в конфигураторе, расширении или пакетной загрузке файлов конфигурации; назначение пользователю выполняется кодом через ПользователиИнформационнойБазы с обязательным Записать(). Работайте на копии базы, проверяйте результат входом под пользователем, а в типовых конфигурациях предпочитайте профили групп доступа.

Частые вопросы

Можно ли создать роль кодом прямо в режиме 1С:Предприятие?

Нет. Объекты метаданных, включая роли, изменяются только на этапе разработки — в конфигураторе, EDT или через загрузку конфигурации из файлов. В режиме предприятия кодом можно только назначать уже существующие роли пользователям информационной базы.

Как назначить роль сразу всем пользователям базы?

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

Почему после назначения роли пользователь всё равно не видит объект?

Возможные причины: сеанс пользователя не был перезапущен, роль даёт право «Чтение», но не «Просмотр», действует ограничение доступа на уровне записей (RLS), либо объект скрыт настройками интерфейса или функциональными опциями. Проверяйте по очереди: РольДоступна(), состав прав роли, шаблоны RLS.

Чем роль отличается от профиля группы доступа?

Роль — объект метаданных, задаётся разработчиком и меняется только через конфигурацию. Профиль группы доступа — данные в базе (механизм БСП), которые администратор настраивает без конфигуратора, комбинируя существующие роли. В типовых конфигурациях пользователям назначают именно профили, а не роли напрямую.

Что произойдёт с правами, если удалить роль из конфигурации?

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

Нужны ли особые права для выполнения кода назначения ролей?

Да. Изменение пользователей информационной базы требует права «Администрирование» — обычно это роль «АдминистраторСистемы» или «ПолныеПрава». Код, запущенный под обычным пользователем, завершится ошибкой нарушения прав доступа.