Администрирование · 9 мин
Как программно изменить роль пользователя в 1С
Как программно изменить роль пользователя в 1С: работа с ПользователиИнформационнойБазы, добавление и снятие ролей, проверка прав, типовые ошибки и примеры кода.
Изменение роли пользователя в 1С программным способом требуется, когда нужно массово назначить права, автоматизировать выдачу доступа при приёме сотрудника или управлять ролями из внешней системы. В типовых конфигурациях и в конфигурациях на обычных формах используется объект ПользователиИнформационнойБазы, а в решениях на БСП (Библиотека стандартных подсистем) — дополнительные механизмы групп доступа и профилей.
Ключевая идея проста: роль хранится не в справочнике «Пользователи», а в объекте пользователя информационной базы, у которого есть коллекция Роли. Программно роль добавляется методом Добавить() этой коллекции, снимается методом Удалить(), после чего объект нужно записать. Всё это выполняется на сервере и требует права «Администрирование» у того, кто запускает код.
Ниже разобраны рабочие примеры кода, особенности файлового и клиент-серверного режимов, работа через БСП, проверка результата и типичные ошибки, из-за которых роль «вроде назначена», но пользователь доступа не получает.
Где хранятся роли и что именно нужно менять
В 1С существуют два уровня «пользователей»: пользователь информационной базы (хранится в самой базе, виден в конфигураторе в разделе «Администрирование — Пользователи») и элемент справочника «Пользователи» в режиме предприятия. Роли назначаются именно первому объекту. Справочник лишь ссылается на него через идентификатор.
Поэтому прямое редактирование справочника «Пользователи» или установка галочек в форме элемента не всегда даёт эффект: если конфигурация построена на БСП, права определяются профилями групп доступа, а не ролями напрямую. Перед написанием кода определите, как устроено разграничение прав в вашей конфигурации.
Базовый код: добавить и снять роль
Минимальный пример — найти пользователя по имени и добавить ему роль. Код выполняется на сервере, например во внешней обработке или в процедуре регламентного задания:
// Найти пользователя информационной базы
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ = Неопределено Тогда
ВызватьИсключение "Пользователь информационной базы не найден";
КонецЕсли;
// Проверить, есть ли уже роль
Роль = Метаданные.Роли.Найти("ДобавлениеИзменениеДокументов");
Если Роль = Неопределено Тогда
ВызватьИсключение "Роль не найдена в метаданных";
КонецЕсли;
Если Не ПользовательИБ.Роли.Содержит(Роль) Тогда
ПользовательИБ.Роли.Добавить(Роль);
ПользовательИБ.Записать();
КонецЕсли;
Снятие роли выполняется зеркально — методом Удалить() с последующим Записать():
Если ПользовательИБ.Роли.Содержит(Роль) Тогда
ПользовательИБ.Роли.Удалить(Роль);
ПользовательИБ.Записать();
КонецЕсли;
Обратите внимание: коллекция Роли работает с объектами метаданных, а не со строками. Передавать туда имя роли строкой нельзя — сначала роль нужно получить через Метаданные.Роли.Найти().
- 1Найдите пользователя через ПользователиИнформационнойБазы.НайтиПоИмени() или НайтиПоУникальномуИдентификатору()
- 2Получите объект роли через Метаданные.Роли.Найти()
- 3Проверьте наличие роли методом Роли.Содержит()
- 4Добавьте или удалите роль и вызовите Записать()
- 5Проверьте результат под учётной записью пользователя
Массовое изменение ролей нескольким пользователям
Для массовой обработки перебирают всю коллекцию пользователей базы. Типовой сценарий — снять у всех уволенных сотрудников роли или добавить новую роль определённой группе:
Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
// Логика отбора: например, по списку имён из таблицы значений
Продолжить;
КонецЕсли;
ПользовательИБ.Роли.Добавить(Метаданные.Роли.ЧтениеДанных);
ПользовательИБ.Записать();
КонецЦикла;
При массовой обработке обязательно логируйте, кому и какая роль была изменена, — в журнал регистрации через ЗаписьЖурналаРегистрации() или в текстовый файл. Это позволит откатить изменения и разобраться в инцидентах с доступом.
Изменение ролей в конфигурациях на БСП
В конфигурациях на базе Библиотеки стандартных подсистем (1С:ERP, УТ 11, ЗУП 3, БП 3.0) прямое назначение ролей пользователю ИБ — не основной механизм. Права там выдаются через профили групп доступа, а роли назначаются автоматически при записи пользователя по его профилям.
Если в такой конфигурации добавить роль напрямую через ПользователиИнформационнойБазы, при следующем обновлении прав (например, при записи пользователя в режиме предприятия) механизм БСП может перезаписать состав ролей, и ваши изменения пропадут. Корректный путь — программно включить пользователя в группу доступа:
// Добавить пользователя в группу доступа (БСП)
ГруппаДоступа = Справочники.ГруппыДоступа.НайтиПоНаименованию("Менеджеры по продажам");
Если Не ГруппаДоступа.Пустая() Тогда
ГруппаОбъект = ГруппаДоступа.ПолучитьОбъект();
НоваяСтрока = ГруппаОбъект.Пользователи.Добавить();
НоваяСтрока.Пользователь = СсылкаНаПользователя; // элемент справочника Пользователи
ГруппаОбъект.Записать();
КонецЕсли;
Особенности клиент-серверного режима и прав на выполнение
Код, изменяющий пользователей ИБ, должен выполняться на сервере и под учётной записью с правом «Администрирование». Если запустить такую обработку под обычным пользователем, вызов Записать() завершится ошибкой нарушения прав доступа. Для регламентных заданий это решается выполнением от имени служебной учётной записи с полными правами.
В файловом режиме есть дополнительное ограничение: запись пользователя ИБ может завершиться ошибкой, если база открыта в монопольном конфликте с другими сеансами в момент обновления кластера аутентификации. На практике это проявляется редко, но при массовой обработке стоит обернуть запись в попытку/исключение и повторить операцию.
Ещё один нюанс — изменение ролей текущего сеанса. Если пользователь уже работает в базе, новые роли применятся к нему только после перезапуска сеанса. Сообщите об этом пользователю или завершите его сеанс принудительно через консоль кластера.
Проверка результата
После изменения роли проверьте результат двумя способами. Первый — программно: повторно получите пользователя и убедитесь, что Роли.Содержит() возвращает нужное значение. Второй — функционально: войдите под учётной записью пользователя и проверьте доступность целевых операций (открытие документов, проведение, доступ к отчётам).
Для точечной диагностики прав удобна функция ПравоДоступа("Изменение", Метаданные.Документы.РеализацияТоваровУслуг) — она показывает итоговое право текущего пользователя с учётом всех его ролей.
Как проверить результат
Роли.Содержит() возвращает Истина для добавленной роли
Роль отсутствует после записи — проверьте, не перезаписывает ли её БСП
Пользователь видит и выполняет нужные операции после перезахода
Доступа нет — проверьте RLS, профили групп доступа и перезапуск сеанса
Есть запись об изменении пользователя ИБ
Ошибки нарушения прав доступа — не хватает права Администрирование
Частые вопросы
Можно ли изменить роль пользователя, который сейчас работает в базе?
Да, объект пользователя ИБ записывается без блокировки его сеанса. Однако изменения вступят в силу для этого пользователя только после перезапуска его сеанса — активный сеанс продолжит работать со старым набором прав.
Как назначить роль новому пользователю, которого ещё нет в базе?
Создайте объект через ПользователиИнформационнойБазы.СоздатьПользователя(), заполните имя, пароль и аутентификацию, добавьте роли в коллекцию Роли и вызовите Записать(). Порядок тот же, что и при изменении существующего.
Почему добавленная роль исчезает через некоторое время?
Наиболее вероятная причина — конфигурация на БСП: механизм обновления прав пересчитывает состав ролей по профилям групп доступа и затирает ручные изменения. Назначайте права через группы доступа, а не напрямую.
Можно ли изменить роль через COM-подключение из другой базы?
Да, через COMConnector можно подключиться к другой базе и выполнить тот же код с объектом ПользователиИнформационнойБазы. Учётная запись, под которой идёт подключение, должна иметь право администрирования в целевой базе.
Как снять все роли у пользователя одним действием?
Переберите копию коллекции ролей в цикле и удаляйте каждую, затем вызовите Записать(). Осторожно: пользователь без ролей не сможет войти в базу в режиме предприятия. Проверьте, не остался ли он единственным администратором.
Работает ли этот код в веб-клиенте?
Да, если код выполняется в серверной процедуре. Объект ПользователиИнформационнойБазы доступен только на сервере, поэтому вызов из клиентского модуля нужно обернуть в серверный вызов общего модуля с признаком «Сервер».
Что важно запомнить
Роли меняются через коллекцию Роли объекта пользователя информационной базы с обязательным вызовом Записать(). В конфигурациях на БСП используйте группы доступа. Проверяйте результат перезаходом под пользователем и делайте резервную копию перед массовыми изменениями.