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

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

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

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

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

Ключевая идея проста: роль хранится не в справочнике «Пользователи», а в объекте пользователя информационной базы, у которого есть коллекция Роли. Программно роль добавляется методом Добавить() этой коллекции, снимается методом Удалить(), после чего объект нужно записать. Всё это выполняется на сервере и требует права «Администрирование» у того, кто запускает код.

Ниже разобраны рабочие примеры кода, особенности файлового и клиент-серверного режимов, работа через БСП, проверка результата и типичные ошибки, из-за которых роль «вроде назначена», но пользователь доступа не получает.

Где хранятся роли и что именно нужно менять

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

Поэтому прямое редактирование справочника «Пользователи» или установка галочек в форме элемента не всегда даёт эффект: если конфигурация построена на БСП, права определяются профилями групп доступа, а не ролями напрямую. Перед написанием кода определите, как устроено разграничение прав в вашей конфигурации.

Базовый код: добавить и снять роль

Минимальный пример — найти пользователя по имени и добавить ему роль. Код выполняется на сервере, например во внешней обработке или в процедуре регламентного задания:

// Найти пользователя информационной базы

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

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

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

КонецЕсли;

// Проверить, есть ли уже роль

Роль = Метаданные.Роли.Найти("ДобавлениеИзменениеДокументов");

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

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

КонецЕсли;

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

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

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

КонецЕсли;

Снятие роли выполняется зеркально — методом Удалить() с последующим Записать():

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

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

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

КонецЕсли;

Обратите внимание: коллекция Роли работает с объектами метаданных, а не со строками. Передавать туда имя роли строкой нельзя — сначала роль нужно получить через Метаданные.Роли.Найти().

Порядок действий
  1. 1
    Найдите пользователя через ПользователиИнформационнойБазы.НайтиПоИмени() или НайтиПоУникальномуИдентификатору()
  2. 2
    Получите объект роли через Метаданные.Роли.Найти()
  3. 3
    Проверьте наличие роли методом Роли.Содержит()
  4. 4
    Добавьте или удалите роль и вызовите Записать()
  5. 5
    Проверьте результат под учётной записью пользователя

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

Для массовой обработки перебирают всю коллекцию пользователей базы. Типовой сценарий — снять у всех уволенных сотрудников роли или добавить новую роль определённой группе:

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

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

// Логика отбора: например, по списку имён из таблицы значений

Продолжить;

КонецЕсли;

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

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

КонецЦикла;

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

Изменение ролей в конфигурациях на БСП

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

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

// Добавить пользователя в группу доступа (БСП)

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

Если Не ГруппаДоступа.Пустая() Тогда

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

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

НоваяСтрока.Пользователь = СсылкаНаПользователя; // элемент справочника Пользователи

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

КонецЕсли;

Особенности клиент-серверного режима и прав на выполнение

Код, изменяющий пользователей ИБ, должен выполняться на сервере и под учётной записью с правом «Администрирование». Если запустить такую обработку под обычным пользователем, вызов Записать() завершится ошибкой нарушения прав доступа. Для регламентных заданий это решается выполнением от имени служебной учётной записи с полными правами.

В файловом режиме есть дополнительное ограничение: запись пользователя ИБ может завершиться ошибкой, если база открыта в монопольном конфликте с другими сеансами в момент обновления кластера аутентификации. На практике это проявляется редко, но при массовой обработке стоит обернуть запись в попытку/исключение и повторить операцию.

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

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

Проверка результата

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

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

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

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

Состав ролей пользователя ИБ
Норма

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

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

Роль отсутствует после записи — проверьте, не перезаписывает ли её БСП

Доступ в режиме предприятия
Норма

Пользователь видит и выполняет нужные операции после перезахода

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

Доступа нет — проверьте RLS, профили групп доступа и перезапуск сеанса

Журнал регистрации
Норма

Есть запись об изменении пользователя ИБ

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

Ошибки нарушения прав доступа — не хватает права Администрирование

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

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

Да, объект пользователя ИБ записывается без блокировки его сеанса. Однако изменения вступят в силу для этого пользователя только после перезапуска его сеанса — активный сеанс продолжит работать со старым набором прав.

Как назначить роль новому пользователю, которого ещё нет в базе?

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

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

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

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

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

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

Переберите копию коллекции ролей в цикле и удаляйте каждую, затем вызовите Записать(). Осторожно: пользователь без ролей не сможет войти в базу в режиме предприятия. Проверьте, не остался ли он единственным администратором.

Работает ли этот код в веб-клиенте?

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

Итог

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

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