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

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

Как программно назначить роль пользователю в 1С

Как программно назначить роль в 1С: работа с ПользователиИнформационнойБазы, объектом Роли, типовыми механизмами БСП и проверкой прав. Примеры кода и типичные ошибки.

Назначить роль пользователю в 1С можно не только через конфигуратор, но и программно — из встроенного языка. Это нужно при массовом заведении пользователей, автоматическом согласовании доступа, интеграции с кадровыми системами и при настройке прав по событиям (например, при приёме сотрудника на должность). Способ зависит от того, работаете вы с «чистой» платформой или с конфигурацией на Библиотеке стандартных подсистем (БСП), где действует своя модель профилей и групп доступа.

Ключевой объект платформы — ПользователиИнформационнойБазы. У каждого пользователя есть коллекция Роли, в которую можно добавить роль из метаданных и записать изменения. В типовых конфигурациях (УТ, ERP, БП, ЗУП) прямая установка ролей обычно не применяется: там права выдаются через профили групп доступа, и программное назначение делается через справочники «Профили групп доступа» и «Группы доступа».

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

Когда программное назначение роли оправдано

Ручное назначение через конфигуратор или раздел «Администрирование» подходит для разовых операций. Программный подход выбирают, когда действия повторяются и подчиняются правилам: выгрузка пользователей из Active Directory или кадровой системы, автоматическое создание учётных записей для новых филиалов, временное выделение прав на период проекта, массовое обновление прав после изменения матрицы доступа.

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

Назначение роли через ПользователиИнформационнойБазы

Базовый сценарий для конфигурации без БСП выглядит так: найти пользователя по имени или уникальному идентификатору, добавить роль в коллекцию, записать. Код выполняется на сервере и требует права «Администрирование» у текущего сеанса.

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

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

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

КонецЕсли;

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

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

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

КонецЕсли;

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

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

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

КонецЕсли;

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

Для снятия роли используется зеркальный вызов — ПользовательИБ.Роли.Удалить(РольМетаданные) с последующей записью. Полностью очистить набор ролей можно методом Роли.Очистить(), но делать это без резервной копии списка прав не стоит.

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

Массовое назначение ролей нескольким пользователям

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

МассивИмен = Новый Массив;

МассивИмен.Добавить("ИвановИИ");

МассивИмен.Добавить("ПетроваАС");

Для Каждого ИмяПользователя Из МассивИмен Цикл

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

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

Продолжить;

КонецЕсли;

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

ПользовательИБ.Роли.Добавить(Метаданные.Роли.МенеджерПоПродажам);

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

КонецЕсли;

КонецЦикла;

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

Порядок действий при массовой выдаче роли
  1. 1
    Сформируйте список пользователей (имена или GUID) и проверьте, что все они существуют в базе
  2. 2
    Убедитесь, что роль существует в метаданных конфигурации
  3. 3
    Выполните цикл с проверкой Роли.Содержит() и записью каждого пользователя
  4. 4
    Запишите в журнал или протокол, кому роль назначена, кто пропущен
  5. 5
    Проверьте результат под учётной записью одного из пользователей

Назначение прав в типовых конфигурациях на БСП

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

Правильный программный путь в БСП — найти или создать элемент справочника «Группы доступа» (или «Профили групп доступа») и включить в него пользователя через табличную часть «Пользователи». Упрощённый пример:

ГруппаСсылка = Справочники.ГруппыДоступа.НайтиПоНаименованию("Менеджеры по продажам");

ГруппаОбъект = ГруппаСсылка.ПолучитьОбъект();

НоваяСтрока = ГруппаОбъект.Пользователи.Добавить();

НоваяСтрока.Пользователь = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван");

ГруппаОбъект.Записать();

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

Сравнение подходов

Прямая установка роли (ПользователиИнформационнойБазы)

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

Группы доступа БСП

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

Назначение через конфигуратор вручную

Подходит для разовых действий и отладки. Не масштабируется и не фиксируется в коде

Проверка результата и границы безопасной работы

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

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

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

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

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

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

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

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

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

Нужные документы и отчёты открываются

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

Ошибки доступа — роль не применилась или сеанс не перезапущен

Поведение в типовой конфигурации
Норма

Права соответствуют профилю группы доступа

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

Роль «слетает» после обновления — значит, её установили в обход БСП

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

Типичные ошибки и ограничения

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

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

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

Альтернативные способы управления правами

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

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

Маршрут решения

Как выбрать действие

Конфигурация собственная, без БСПИспользуйте ПользователиИнформационнойБазы с проверкой Роли.Содержит()
Типовая конфигурация (УТ, ERP, БП, ЗУП)Добавляйте пользователя в группу доступа с нужным профилем, не трогайте роли напрямую
Нужно выдать права десяткам пользователей по правилуПишите обработку синхронизации с протоколом и тестом на копии
Разовая выдача одному пользователюПроще назначить права через интерфейс конфигуратора или раздел Администрирование
Итог

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

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

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

Можно ли назначить роль пользователю, который сейчас работает в базе?

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

Почему Метаданные.Роли.Найти() возвращает Неопределено, хотя роль есть?

Почти всегда причина в том, что поиск идёт по синониму (человекочитаемому названию с пробелами), а метод ищет по имени объекта метаданных. Откройте роль в конфигураторе и используйте значение поля «Имя», а не «Синоним».

Как программно узнать, какие роли есть у пользователя?

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

Можно ли назначить роль через COM-соединение из другой базы?

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

Что делать, если в типовой конфигурации роль «слетает» после обновления?

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

Можно ли выдать роль на время и автоматически снять?

Штатного «срока действия роли» в платформе нет. Реализуют это регламентным заданием: при выдаче роли сохраняют дату окончания в регистре сведений, а задание периодически проверяет записи и снимает просроченные роли через Роли.Удалить() с записью пользователя.