Администрирование · 10 мин
Как программно добавить роль в 1С
Как программно добавить роль в 1С: способы через конфигуратор, расширение и код, назначение ролей пользователям, проверка прав и типичные ошибки.
Роль в 1С — это объект метаданных, который определяет набор прав доступа к объектам конфигурации: справочникам, документам, регистрам, отчётам. В отличие от интерактивной настройки через конфигуратор, программное добавление роли требуется при автоматизации развёртывания, поставке обновлений, создании расширений и массовой настройке прав для групп пользователей.
Важно сразу разделить две разные задачи, которые часто путают. Первая — создать сам объект метаданных «Роль» в конфигурации или расширении. Вторая — назначить уже существующую роль конкретному пользователю информационной базы. Первая задача решается средствами конфигуратора, пакетного режима или EDT, вторая — кодом на встроенном языке через менеджер пользователей.
Ниже разобраны оба сценария с конкретным кодом, условиями применения каждого способа, проверкой результата и типичными ошибками, которые приводят к потере прав или невозможности входа в базу.
Что такое роль в 1С и какие способы её добавить существуют
Роль — это именованный набор прав: чтение, добавление, изменение, удаление, просмотр, интерактивные операции и доступ к командам. Роли комбинируются: итоговые права пользователя — это объединение прав всех назначенных ему ролей. Если хотя бы одна роль даёт право — оно есть; запретить право через другую роль нельзя.
Программно или полупрограммно роль можно добавить четырьмя путями: вручную в конфигураторе (базовый вариант), через расширение конфигурации, пакетной выгрузкой-загрузкой конфигурации в файлы XML с добавлением описания роли, а также через EDT. Непосредственно «создать объект метаданных роль» кодом встроенного языка в режиме предприятия нельзя — метаданные изменяются только на этапе разработки.
Добавление роли через конфигуратор и расширение
Классический способ: открыть конфигуратор, в дереве конфигурации перейти в ветку «Общие → Роли», добавить новую роль и в редакторе прав отметить нужные объекты и виды доступа. После сохранения конфигурации и обновления конфигурации базы данных роль становится доступна для назначения пользователям.
Если конфигурация типовая и находится на поддержке, изменять её напрямую нежелательно — при обновлении изменения могут быть потеряны. В этом случае роль добавляют через расширение: «Конфигурация → Расширения конфигурации», создать расширение, добавить в него собственную роль и настроить права. Расширение подключается без снятия конфигурации с поддержки и переживает обновления.
Программное назначение роли пользователю
Назначение роли выполняется кодом встроенного языка через объект ПользователиИнформационнойБазы. Типовой сценарий: найти пользователя по имени, получить объект роли из метаданных, добавить её в коллекцию ролей пользователя и записать изменения.
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ = Неопределено Тогда
ВызватьИсключение "Пользователь не найден";
КонецЕсли;
Роль = Метаданные.Роли.Найти("МенеджерПоПродажам");
Если Роль = Неопределено Тогда
ВызватьИсключение "Роль не найдена в конфигурации";
КонецЕсли;
Если Не ПользовательИБ.Роли.Содержит(Роль) Тогда
ПользовательИБ.Роли.Добавить(Роль);
ПользовательИБ.Записать();
КонецЕсли;
Код выполняется в контексте, где у текущего сеанса есть право администрирования (роль «АдминистраторСистемы» или «ПолныеПрава»). Обычно такой код запускают из внешней обработки, фонового задания или обработчика обновления. Проверка Содержит перед добавлением защищает от дублирования и делает код идемпотентным — безопасным для повторного запуска.
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ <> Неопределено Тогда
ПользовательИБ.Роли.Добавить(Метаданные.Роли.МенеджерПоПродажам);
ПользовательИБ.Записать();
КонецЕсли;Массовое назначение роли группе пользователей
Когда роль нужно выдать сразу нескольким пользователям, перебирают коллекцию пользователей информационной базы и назначают роль каждому. Фильтровать можно по имени, по принадлежности к подразделению (если пользователи ИБ связаны со справочником «Пользователи» в типовых конфигурациях) или по уже имеющимся ролям.
Роль = Метаданные.Роли.БазовыеПраваБСП;
Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если Не ПользовательИБ.Роли.Содержит(Роль) Тогда
ПользовательИБ.Роли.Добавить(Роль);
ПользовательИБ.Записать();
КонецЕсли;
КонецЦикла;
В типовых конфигурациях на базе БСП вместо прямой работы с пользователями ИБ правильнее использовать группы доступа и профили групп доступа: роли назначаются профилю, а пользователи включаются в группу. Это снижает риск рассинхронизации прав и упрощает аудит. Прямая запись в пользователей ИБ оправдана в самописных конфигурациях и служебных сценариях.
- 1Создайте роль в конфигураторе или расширении и настройте права
- 2Обновите конфигурацию базы данных
- 3Напишите код назначения роли через ПользователиИнформационнойБазы
- 4Проверьте код на копии базы под тестовым пользователем
- 5Выполните назначение в рабочей базе и проверьте вход пользователя
Добавление роли при обновлении конфигурации поставки
Если роль поставляется в составе решения, её назначение удобно выполнять в обработчике обновления версии. В БСП для этого используется процедура в модуле обновления информационной базы: обработчик находит нужных пользователей (например, всех с ролью старого формата) и добавляет новую роль. Такой подход гарантирует, что после обновления ни один пользователь не останется без прав.
Для пакетного создания роли как метаданных при автоматизированной сборке используют выгрузку конфигурации в файлы XML: файл роли добавляется в каталог Roles, ссылка на него — в корневой файл конфигурации, после чего конфигурация загружается обратно параметром /LoadConfigFromFiles. Это продвинутый сценарий для CI/CD, требующий аккуратной работы с форматом выгрузки.
Проверка результата и ограничения
После назначения роли проверьте результат двумя способами. Программно — повторно получите пользователя и убедитесь, что Роли.Содержит() возвращает Истина, либо используйте функцию РольДоступна("ИмяРоли") в сеансе нужного пользователя. Практически — войдите под этим пользователем и откройте объект, на который давались права.
Учтите ограничения: изменения ролей пользователя ИБ применяются к уже открытым сеансам не всегда сразу — надёжнее попросить пользователя перезайти. В клиент-серверном режиме запись пользователей ИБ требует монопольного доступа не всегда, но при активных блокировках возможны ошибки — выполняйте операцию в период низкой нагрузки. Также помните про права на уровне записей (RLS): даже при наличии роли доступ может ограничиваться шаблонами ограничений.
Как проверить результат
Роли.Содержит(Роль) возвращает Истина
Роль отсутствует — код не выполнился или была ошибка записи
Пользователь входит и видит нужные объекты
Ошибка «Нарушение прав доступа» при открытии объекта
Возвращает Истина в сеансе пользователя
Ложь — роль не назначена или сеанс не обновлён
Типичные ошибки при программной работе с ролями
Самая частая ошибка — обращение к несуществующей роли по имени: после переименования роли в конфигурации код с литералом имени перестаёт работать. Используйте проверку Метаданные.Роли.Найти() и осмысленное исключение. Вторая ошибка — забытый вызов Записать(): коллекция ролей изменена в памяти, но в базу не сохранена.
Третья группа ошибок связана с правами самого исполнителя кода: попытка назначить роль из-под пользователя без административных прав приводит к исключению. Четвёртая — назначение роли напрямую в типовой конфигурации в обход механизма профилей групп доступа, из-за чего при следующем обновлении прав через штатные механизмы ручные назначения затираются.
Что важно запомнить
Роль как метаданные создаётся в конфигураторе, расширении или пакетной загрузке файлов конфигурации; назначение пользователю выполняется кодом через ПользователиИнформационнойБазы с обязательным Записать(). Работайте на копии базы, проверяйте результат входом под пользователем, а в типовых конфигурациях предпочитайте профили групп доступа.
Частые вопросы
Можно ли создать роль кодом прямо в режиме 1С:Предприятие?
Нет. Объекты метаданных, включая роли, изменяются только на этапе разработки — в конфигураторе, EDT или через загрузку конфигурации из файлов. В режиме предприятия кодом можно только назначать уже существующие роли пользователям информационной базы.
Как назначить роль сразу всем пользователям базы?
Переберите коллекцию ПользователиИнформационнойБазы.ПолучитьПользователей() и для каждого пользователя добавьте роль с проверкой Содержит() и вызовом Записать(). В типовых конфигурациях вместо этого лучше создать профиль группы доступа с нужной ролью и включить в него всех пользователей.
Почему после назначения роли пользователь всё равно не видит объект?
Возможные причины: сеанс пользователя не был перезапущен, роль даёт право «Чтение», но не «Просмотр», действует ограничение доступа на уровне записей (RLS), либо объект скрыт настройками интерфейса или функциональными опциями. Проверяйте по очереди: РольДоступна(), состав прав роли, шаблоны RLS.
Чем роль отличается от профиля группы доступа?
Роль — объект метаданных, задаётся разработчиком и меняется только через конфигурацию. Профиль группы доступа — данные в базе (механизм БСП), которые администратор настраивает без конфигуратора, комбинируя существующие роли. В типовых конфигурациях пользователям назначают именно профили, а не роли напрямую.
Что произойдёт с правами, если удалить роль из конфигурации?
После обновления конфигурации базы данных роль исчезнет из списков ролей всех пользователей, и права, которые давала только она, будут потеряны. Перед удалением роли проверьте, какие пользователи её используют, и назначьте им заменяющие роли заранее.
Нужны ли особые права для выполнения кода назначения ролей?
Да. Изменение пользователей информационной базы требует права «Администрирование» — обычно это роль «АдминистраторСистемы» или «ПолныеПрава». Код, запущенный под обычным пользователем, завершится ошибкой нарушения прав доступа.