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

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

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

Основа концепции: почему UUID лучше Имени

Разберем фундаментальный принцип связи. Многие начинающие разработчики пытаются связать справочник и список пользователей по имени (логину). Однако это ненадежный путь: имя пользователя в Конфигураторе может измениться, что приведет к потере связи. Единственным стабильным идентификатором является УникальныйИдентификатор (UUID).

Проанализируем необходимые шаги для реализации этой связи:

  1. В справочнике Пользователи создаем реквизит, например, ИдентификаторПользователяИБ.
  2. Устанавливаем для этого реквизита тип данных УникальныйИдентификатор. Это критически важно, так как поиск по типизированному UUID работает значительно быстрее, чем по строковому представлению.
  3. При создании связи мы будем записывать UUID системного пользователя в этот реквизит.

Реализация поиска и сопоставления пользователей

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


// Процедура для сканирования пользователей ИБ
ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();

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

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


ТекущийУИД = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ТекущийУИД);

Редактирование параметров пользователя ИБ через справочник

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

Важный момент: Доступ к списку пользователей ИБ обычно ограничен. Чтобы рядовой пользователь мог изменить, например, свой пароль или полное имя, код должен выполняться в привилегированном режиме.


Процедура ПриЗаписи(Отказ)
    // Устанавливаем привилегированный режим для доступа к пользователям ИБ
    УстановитьПривилегированныйРежим(Истина);
    
    // Ищем пользователя ИБ по сохраненному идентификатору
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ЭтотОбъект.ИдентификаторПользователяИБ);
    
    Если ПользовательИБ <> Неопределено Тогда
        // Обновляем свойства
        ПользовательИБ.ПолноеИмя = ЭтотОбъект.Наименование;
        // Здесь можно добавить обновление пароля, ролей и т.д.
        ПользовательИБ.Записать();
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Оптимизация производительности: Параметры сеанса

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

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

Синхронизация сложных свойств (Роли и Аутентификация)

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

Рассмотрим пример программного управления ролями. Если в вашем справочнике есть табличная часть Роли, вы можете синхронизировать их со списком ролей в Конфигураторе:


// Очищаем старые роли
ПользовательИБ.Роли.Очистить();

// Добавляем роли из нашей табличной части
Для Каждого СтрокаРоли Из ЭтотОбъект.Роли Цикл
    НайденнаяРоль = Метаданные.Роли.Найти(СтрокаРоли.ИмяРоли);
    Если НайденнаяРоль <> Неопределено Тогда
        ПользовательИБ.Роли.Добавить(НайденнаяРоль);
    КонецЕсли;
КонецЦикла;

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

Выбор между самописным механизмом и БСП

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

Однако, если ваша конфигурация крайне мала и специфична («микро-сервис»), внедрение тяжелой БСП может неоправданно увеличить размер метаданных. Если же планируется развитие системы, использование БСП является предпочтительным стандартом в современной разработке на платформе 1С 8.3.

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

← На главную