При администрировании крупных баз данных, интеграции с внешними системами (например, корпоративными порталами или Active Directory) или при развертывании новых рабочих мест часто возникает необходимость автоматизировать процесс создания учетных записей. В этой статье мы подробно разберем, как программно добавить пользователя в информационную базу 1С:Предприятие, проанализируем частые ошибки разработчиков и рассмотрим особенности создания пользователей в современных конфигурациях.
Этот метод подходит для старых конфигураций (работающих на обычных формах) или самописных решений, где не используется Библиотека стандартных подсистем (БСП). В этом случае мы обращаемся напрямую к менеджеру пользователей информационной базы через объект ПользователиИнформационнойБазы.
Рассмотрим по шагам рабочий пример создания пользователя с базовыми правами:
Функция СоздатьНовогоПользователяИБ(ИмяПользователя, ПарольПользователя) Экспорт
// Получаем текущее количество пользователей в базе данных
КоличествоПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей().Количество();
// Если база пустая или мы создаем первого администратора
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользователь.АутентификацияОС = Ложь;
НовыйПользователь.АутентификацияСтандартная = Истина;
НовыйПользователь.Имя = ИмяПользователя;
НовыйПользователь.ПолноеИмя = ИмяПользователя;
НовыйПользователь.Пароль = ПарольПользователя;
НовыйПользователь.ПоказыватьВСпискеВыбора = Истина;
// Назначение интерфейса и основного языка
НовыйПользователь.ОсновнойИнтерфейс = Метаданные.Интерфейсы.Полный;
НовыйПользователь.Язык = Метаданные.Языки.Русский;
// Добавление роли программно
РольПолныеПрава = Метаданные.Роли.ПолныеПрава;
НовыйПользователь.Роли.Добавить(РольПолныеПрава);
Попытка
НовыйПользователь.Записать();
Возврат Истина;
Исключение
Сообщить("Не удалось записать пользователя: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
В данном коде мы сначала создаем пустой объект пользователя с помощью метода СоздатьПользователя(), заполняем ключевые реквизиты аутентификации, привязываем интерфейс и добавляем метаданные роли. Важно всегда помещать метод Записать() в конструкцию попытки-исключения для обработки возможных конфликтов блокировок или уникальности имен.
На форумах часто встречается ошибка, когда разработчики пытаются проверить права или роли до физического создания переменной. Проанализируем ошибочный код:
// ОШИБОЧНЫЙ КОД
РольАдминистратор = Метаданные.Роли.Администратор;
Если НовыйПользователь.Роли.Содержит(РольАдминистратор) Тогда
Сообщить("Добавление пользователя с административными правами запрещено.");
Иначе
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
// ... дальнейшее заполнение
КонецЕсли;
При выполнении этого кода платформа выдаст ошибку: «Переменная не определена (НовыйПользователь)». Выясним причину: программа пытается обратиться к коллекции Роли объекта, который еще не был объявлен и инициализирован конструктором. Логика проверки должна быть строго последовательной:
РольДоступна().НовыйПользователь.Если вы работаете в современных типовых решениях (Бухгалтерия предприятия 3.0, Управление торговлей 11, ERP 2.x), использовать низкоуровневый метод работы с платформой напрямую категорически запрещено. Дело в том, что в современных конфигурациях учетные записи должны быть синхронизированы со справочником Справочники.Пользователи.
Если создать пользователя только на уровне платформы ИБ, он не будет связан со справочником пользователей. В результате под этой учетной записью либо не удастся выполнить вход, либо система не сможет инициализировать персональные настройки программы.
Разберем по шагам правильный алгоритм создания пользователя через API БСП:
Процедура СоздатьПользователяБСП(ИмяВхода, ФИО, Пароль) Экспорт
// 1. Создаем новый элемент в справочнике Пользователи
НовыйСотрудник = Справочники.Пользователи.СоздатьЭлемент();
НовыйСотрудник.Наименование = ФИО;
НовыйСотрудник.Недействителен = Ложь;
// 2. Подготавливаем структуру описания пользователя ИБ
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Имя = ИмяВхода;
ОписаниеПользователяИБ.ПолноеИмя = ФИО;
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.Пароль = Пароль;
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Истина;
// Передаем параметры платформенного пользователя в дополнительные свойства элемента справочника
НовыйСотрудник.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
Попытка
// БСП автоматически перехватит запись элемента справочника и создаст пользователя ИБ
НовыйСотрудник.Записать();
Сообщить("Пользователь успешно создан и связан с базой данных!");
Исключение
Сообщить("Ошибка при создании пользователя БСП: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
При таком подходе БСП берет на себя все низкоуровневые операции, автоматически связывает элемент справочника с платформенной учетной записью по уникальному идентификатору UUID и готовит среду для назначения прав.
В БСП роли не добавляются напрямую в объект пользователя платформы. Вместо этого пользователя программно добавляют в соответствующие группы доступа (элементы справочника ГруппыДоступа), и система сама транслирует нужные роли на уровень платформы. Рассмотрим пример добавления пользователя в группу:
Процедура ДобавитьПользователяВГруппу(СсылкаНаПользователя, СсылкаНаГруппуДоступа) Экспорт
ГруппаОбъект = СсылкаНаГруппуДоступа.ПолучитьОбъект();
// Проверяем, нет ли уже пользователя в группе
СтрокаТаблицы = ГруппаОбъект.Пользователи.Найти(СсылкаНаПользователя, "Пользователь");
Если СтрокаТаблицы = Неопределено Тогда
НоваяСтрока = ГруппаОбъект.Пользователи.Добавить();
НоваяСтрока.Пользователь = СсылкаНаПользователя;
ГруппаОбъект.Записать();
КонецЕсли;
КонецПроцедуры
Для записи нового пользователя ИБ у текущей учетной записи должны быть административные права. Если создавать пользователей должен сотрудник без полных прав (например, HR-менеджер), операцию записи необходимо выполнять в привилегированном режиме.
Для этого в общем модуле с установленным флагом «Привилегированный» размещают код создания пользователя либо вызывают программную инструкцию:
УстановитьПривилегированныйРежим(Истина);
// Выполнение создания пользователя ИБ под административными правами платформы
НовыйПользователь.Записать();
УстановитьПривилегированныйРежим(Ложь);
Использование привилегированного режима временно отключает проверку прав доступа текущего сеанса 1С, позволяя рядовому менеджеру успешно завершить процедуру регистрации нового коллеги.
Часто в рамках автоматизации создания объектов (например, документов поступления или реализации) требуется заполнить реквизит Ответственный. Разберем, как получить ссылку на текущего пользователя системы.
В обычных формах и классических конфигурациях для этого использовался механизм параметров сеанса:
НовДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
// Прямая подстановка из параметров сеанса
НовДок.Ответственный = ПараметрыСеанса.ТекущийПользователь;
НовДок.Записать();
Однако при работе в фоновых заданиях или при использовании веб-клиентов прямое обращение к параметру сеанса может вызвать критическую ошибку, если параметр не был инициализирован. В базах на БСП безопаснее и надежнее использовать вызовы специализированных функций общего модуля:
// Безопасное получение текущего пользователя в БСП
НовДок.Ответственный = Пользователи.АвторизованныйПользователь();
Эта функция содержит встроенные проверки безопасности, корректно отрабатывает в фоновых заданиях и возвращает ссылку на элемент справочника Справочники.Пользователи, предотвращая возможные аварийные завершения работы программы.