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

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

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

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

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

Справочник Пользователи — это обычный объект метаданных, который мы создаем в Конфигураторе. Он нужен для того, чтобы на него можно было ссылаться в документах (например, в реквизите Ответственный), строить отчеты в разрезе сотрудников и хранить их персональные настройки.

Шаг 1. Подготовка справочника «Пользователи»

Чтобы установить связь, нам нужен уникальный ключ. Использовать «Наименование» или «Логин» не совсем надежно, так как их могут изменить. Рассмотрим лучший способ — использование Уникального идентификатора пользователя ИБ.

Разберем, что нужно сделать в Конфигураторе:

  1. Откроем справочник Пользователи.
  2. Добавим новый реквизит ИдентификаторПользователяИБ.
  3. Установим тип данных для этого реквизита — УникальныйИдентификатор. Если в вашей версии платформы этот тип недоступен для реквизита, можно использовать Строку длиной 36 символов, но первый вариант предпочтительнее для производительности.
  4. Важно: Установите свойство Индексировать для этого реквизита. Это критически важно, так как поиск пользователя при каждом входе в систему должен выполняться мгновенно.

Шаг 2. Инициализация связи через Параметры сеанса

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

Рассмотрим пошагово реализацию в коде:

  1. Создадим параметр сеанса ТекущийПользователь с типом СправочникСсылка.Пользователи.
  2. Откроем Модуль сеанса и пропишем процедуру УстановкаПараметровСеанса.

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

Шаг 3. Программная привязка при создании пользователя

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

Лучше всего делать это в модуле объекта справочника Пользователи в процедуре ПередЗаписью. Обратите внимание, что для работы с пользователями ИБ могут потребоваться привилегии администратора. Рассмотрим пример реализации:


Процедура ПередЗаписью(Отказ)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Работаем только с элементами, группы не трогаем
    Если ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;

    // Если связь еще не установлена
    Если ИдентификаторПользователяИБ = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        
        // Пытаемся найти пользователя ИБ по имени (логину)
        ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Наименование);
        
        Если ПользовательИБ = Неопределено Тогда
            // Создаем нового пользователя информационной базы
            ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
            ПользовательИБ.Имя = Наименование;
            ПользовательИБ.ПолноеИмя = Наименование;
            ПользовательИБ.АутентификацияСтандартная = Истина;
            // Установите здесь нужные роли по умолчанию
            // ПользовательИБ.Роли.Добавить(Метаданные.Роли.ПолныеПрава);
            ПользовательИБ.Записать();
        КонецЕсли;
        
        // Сохраняем связь
        ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
        
    КонецЕсли;
    
КонецПроцедуры

Шаг 4. Использование в формах документов

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

В модуле формы документа используем событие ПриСозданииНаСервере:


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

Важные нюансы и рекомендации

Проанализируем несколько моментов, которые могут вызвать сложности при эксплуатации системы:

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

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

← На главную