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

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

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

Анализ ошибки «Тип не может использоваться в данных формы»

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

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

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


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

Механизм связи через Уникальный Идентификатор (UUID)

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

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

Для поиска пользователя по этому идентификатору на сервере используется метод:

ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор)

Синхронизация справочника и списка пользователей ИБ

Проанализируем ситуацию, когда нам нужно не просто отобразить список, а полноценно управлять пользователями. При создании нового элемента в справочнике мы должны программно создать и «настоящего» пользователя в системе. Разберем, как это реализовать в модуле объекта справочника Пользователи в процедуре ПередЗаписью.


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

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

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

Работа с Windows-аутентификацией (OS Authentication)

Если в вашей организации используется вход в 1С через доменную учетную запись, нам необходимо хранить и синхронизировать свойство ПользовательОС. В справочнике для этого рекомендуется создать отдельный строковый реквизит. Рассмотрим формат хранения этих данных.

Значение должно записываться в формате \\DomainName\UserName или Windows-имя-компьютера\UserName. При программном создании пользователя ИБ вы можете установить это свойство:

ПользовательИБ.ПользовательОС = ЭтотОбъект.ПутьКУчеткеОС;

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

Обработка «фантомных» записей

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


&НаСервере
Процедура ПроверитьСвязьСИБ()
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Объект.ИдентификаторПользователяИБ);
    Если ПользовательИБ = Неопределено Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Внимание: соответствующая учетная запись в информационной базе не найдена!";
        Сообщение.Сообщить();
    КонецЕсли;
КонецПроцедуры

Подведем итоги

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

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

← На главную