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