Как программно создать пользователя в 1С 8.3 и синхронизировать его со справочником в режиме Предприятие?

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

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

Программное создание пользователя информационной базы

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

Проанализируем типовой код, который выполняется на сервере в модуле формы справочника при записи. Важно правильно обращаться к реквизитам формы и объектам метаданных.


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

Важный нюанс: При работе с ролями начинающие разработчики часто совершают ошибку, пытаясь передать строку или ссылку вместо объекта метаданных. Используйте конструкцию Метаданные.Роли.ИмяРоли или Метаданные.Роли[ИмяПеременной], чтобы получить правильную ссылку на объект роли.

Автоматическое создание элемента справочника при входе нового пользователя

Разберем обратную задачу: пользователь был создан администратором вручную в «Конфигураторе». Нам нужно, чтобы при его первом входе в систему в справочнике Пользователи автоматически появилась соответствующая запись. Для этого лучше всего использовать Модуль сеанса.

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

Проанализируем логику проверки и создания записи в справочнике:


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

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

Иногда требуется разово или регламентно синхронизировать весь список пользователей ИБ со справочником. В этом случае мы используем метод ПолучитьПользователей(). Рассмотрим пример обработки, которая обходит весь список:


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

Важные рекомендации по безопасности и архитектуре

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

  1. Привилегированный режим: Работа с объектом ПользователиИнформационнойБазы требует административных прав. Если код выполняется от лица обычного пользователя (например, при саморегистрации), используйте УстановитьПривилегированныйРежим(Истина) в серверном коде.
  2. Идентификация по UUID: Поиск пользователя по имени (наименованию) может быть ненадежным, если администраторы часто меняют логины. Правильнее всего хранить в справочнике реквизит с типом УникальныйИдентификатор и связывать объекты именно по нему.
  3. Пароли: Помните, что платформа 1С не позволяет прочитать пароль существующего пользователя. Вы можете только установить новый пароль при записи объекта ПользовательИнформационнойБазы.
  4. Библиотека стандартных подсистем (БСП): Если вы работаете в современной типовой конфигурации, рассмотрите возможность использования подсистемы «Пользователи» из состава БСП. Она уже содержит все описанные механизмы, включая сложные формы управления правами и автоматическую синхронизацию.

Таким образом, мы рассмотрели основные способы взаимодействия с учетными записями пользователей в 1С 8.3. Использование этих методов позволяет гибко настраивать права доступа и автоматизировать рутинные операции по администрированию системы.

← На главную