Как программно добавить пользователя в информационную базу 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Способ 1. Низкоуровневый метод работы напрямую с платформой 1С

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

Рассмотрим по шагам рабочий пример создания пользователя с базовыми правами:


Функция СоздатьНовогоПользователяИБ(ИмяПользователя, ПарольПользователя) Экспорт
    // Получаем текущее количество пользователей в базе данных
    КоличествоПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей().Количество();
    
    // Если база пустая или мы создаем первого администратора
    НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
    НовыйПользователь.АутентификацияОС = Ложь;
    НовыйПользователь.АутентификацияСтандартная = Истина;
    НовыйПользователь.Имя = ИмяПользователя;
    НовыйПользователь.ПолноеИмя = ИмяПользователя;
    НовыйПользователь.Пароль = ПарольПользователя;
    НовыйПользователь.ПоказыватьВСпискеВыбора = Истина;
    
    // Назначение интерфейса и основного языка
    НовыйПользователь.ОсновнойИнтерфейс = Метаданные.Интерфейсы.Полный;
    НовыйПользователь.Язык = Метаданные.Языки.Русский;
    
    // Добавление роли программно
    РольПолныеПрава = Метаданные.Роли.ПолныеПрава;
    НовыйПользователь.Роли.Добавить(РольПолныеПрава);
    
    Попытка
        НовыйПользователь.Записать();
        Возврат Истина;
    Исключение
        Сообщить("Не удалось записать пользователя: " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
КонецФункции

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

Разбор критической ошибки «Переменная не определена (НовыйПользователь)»

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


// ОШИБОЧНЫЙ КОД
РольАдминистратор = Метаданные.Роли.Администратор;
Если НовыйПользователь.Роли.Содержит(РольАдминистратор) Тогда 
    Сообщить("Добавление пользователя с административными правами запрещено.");
Иначе
    НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
    // ... дальнейшее заполнение
КонецЕсли;

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

  1. Сначала проверяются права текущего администратора, запускающего процедуру, через функцию РольДоступна().
  2. Инициализируется объект НовыйПользователь.
  3. Заполняются реквизиты нового пользователя.
  4. Перед финальной записью выполняется проверка назначаемых ролей, и если среди них есть критические роли типа «Администратор», запись прерывается.

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

Если вы работаете в современных типовых решениях (Бухгалтерия предприятия 3.0, Управление торговлей 11, ERP 2.x), использовать низкоуровневый метод работы с платформой напрямую категорически запрещено. Дело в том, что в современных конфигурациях учетные записи должны быть синхронизированы со справочником Справочники.Пользователи.

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

Разберем по шагам правильный алгоритм создания пользователя через API БСП:


Процедура СоздатьПользователяБСП(ИмяВхода, ФИО, Пароль) Экспорт
    // 1. Создаем новый элемент в справочнике Пользователи
    НовыйСотрудник = Справочники.Пользователи.СоздатьЭлемент();
    НовыйСотрудник.Наименование = ФИО;
    НовыйСотрудник.Недействителен = Ложь;
    
    // 2. Подготавливаем структуру описания пользователя ИБ
    ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
    ОписаниеПользователяИБ.Вставить("Действие", "Записать");
    ОписаниеПользователяИБ.Имя = ИмяВхода;
    ОписаниеПользователяИБ.ПолноеИмя = ФИО;
    ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
    ОписаниеПользователяИБ.Пароль = Пароль;
    ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Истина;
    
    // Передаем параметры платформенного пользователя в дополнительные свойства элемента справочника
    НовыйСотрудник.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
    
    Попытка
        // БСП автоматически перехватит запись элемента справочника и создаст пользователя ИБ
        НовыйСотрудник.Записать();
        Сообщить("Пользователь успешно создан и связан с базой данных!");
    Исключение
        Сообщить("Ошибка при создании пользователя БСП: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

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

Назначение прав в БСП через группы доступа

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


Процедура ДобавитьПользователяВГруппу(СсылкаНаПользователя, СсылкаНаГруппуДоступа) Экспорт
    ГруппаОбъект = СсылкаНаГруппуДоступа.ПолучитьОбъект();
    
    // Проверяем, нет ли уже пользователя в группе
    СтрокаТаблицы = ГруппаОбъект.Пользователи.Найти(СсылкаНаПользователя, "Пользователь");
    Если СтрокаТаблицы = Неопределено Тогда
        НоваяСтрока = ГруппаОбъект.Пользователи.Добавить();
        НоваяСтрока.Пользователь = СсылкаНаПользователя;
        ГруппаОбъект.Записать();
    КонецЕсли;
КонецПроцедуры

Использование привилегированного режима для создания пользователей

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

Для этого в общем модуле с установленным флагом «Привилегированный» размещают код создания пользователя либо вызывают программную инструкцию:


УстановитьПривилегированныйРежим(Истина);
// Выполнение создания пользователя ИБ под административными правами платформы
НовыйПользователь.Записать();
УстановитьПривилегированныйРежим(Ложь);

Использование привилегированного режима временно отключает проверку прав доступа текущего сеанса 1С, позволяя рядовому менеджеру успешно завершить процедуру регистрации нового коллеги.

Автоподстановка текущего пользователя в создаваемые документы

Часто в рамках автоматизации создания объектов (например, документов поступления или реализации) требуется заполнить реквизит Ответственный. Разберем, как получить ссылку на текущего пользователя системы.

В обычных формах и классических конфигурациях для этого использовался механизм параметров сеанса:


НовДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
// Прямая подстановка из параметров сеанса
НовДок.Ответственный = ПараметрыСеанса.ТекущийПользователь;
НовДок.Записать();

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


// Безопасное получение текущего пользователя в БСП
НовДок.Ответственный = Пользователи.АвторизованныйПользователь();

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

← На главную