При разработке собственных конфигураций или отказе от использования механизмов БСП (Библиотеки стандартных подсистем) программисты часто сталкиваются с необходимостью создать свой справочник Пользователи. Основная сложность здесь заключается в том, чтобы корректно «подружить» элементы этого справочника с реальными учетными записями, которые хранятся в списке пользователей информационной базы (ИБ) в Конфигураторе. Разберем подробно, как это реализовать, какие ошибки могут возникнуть и как их избежать.
Рассмотрим типичную ситуацию, с которой сталкиваются разработчики. При попытке вывести список пользователей ИБ в таблицу на форме программным способом часто возникает ошибка: Тип "ПользовательИнформационнойБазы" не может использоваться в данных формы. Проанализируем причину ее возникновения.
Объект типа ПользовательИнформационнойБазы — это специальный системный объект, который существует только на стороне сервера и предназначен для манипуляций с учетными записями (смена пароля, назначение ролей, настройка аутентификации). Этот тип не является сериализуемым, а значит, платформа 1С не может передать его с сервера на клиент или сохранить его непосредственно в реквизите формы (например, в колонке таблицы значений на форме). Выясним, как правильно обойти это ограничение.
Вместо того чтобы пытаться записать весь объект в строку таблицы, нам нужно извлечь из него только необходимые данные простых типов: строки, булево или уникальные идентификаторы. Посмотрим на исправленный пример кода для заполнения списка на форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем массив всех пользователей ИБ
СписокПользователейИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого ТекущийПользовательИБ Из СписокПользователейИБ Цикл
НоваяСтрока = Список.Добавить();
// Вместо самого объекта записываем его имя (строка)
НоваяСтрока.ИмяПользователя = ТекущийПользовательИБ.Имя;
// И самое главное — сохраняем уникальный идентификатор (UUID)
НоваяСтрока.ИдентификаторПользователяИБ = ТекущийПользовательИБ.УникальныйИдентификатор;
КонецЦикла;
КонецПроцедуры
Самый надежный и правильный способ связать элемент справочника Пользователи с учетной записью ИБ — это использование реквизита с типом УникальныйИдентификатор. Назовем его, например, ИдентификаторПользователяИБ. Рассмотрим преимущества этого подхода:
UUID останется прежним. Если бы связь была по имени, она бы разорвалась.Для поиска пользователя по этому идентификатору на сервере используется метод:
ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор)
Проанализируем ситуацию, когда нам нужно не просто отобразить список, а полноценно управлять пользователями. При создании нового элемента в справочнике мы должны программно создать и «настоящего» пользователя в системе. Разберем, как это реализовать в модуле объекта справочника Пользователи в процедуре ПередЗаписью.
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Если это новый пользователь, создадим учетную запись в ИБ
Если ЭтоНовый() Или ИдентификаторПользователяИБ.Пустой() Тогда
НовыйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользовательИБ.Имя = ЭтотОбъект.Наименование; // Используем наименование как логин
НовыйПользовательИБ.ПолноеИмя = ЭтотОбъект.Наименование;
НовыйПользовательИБ.Записать();
// Сохраняем связь
ЭтотОбъект.ИдентификаторПользователяИБ = НовыйПользовательИБ.УникальныйИдентификатор;
Иначе
// Обновляем существующего пользователя
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ЭтотОбъект.ИдентификаторПользователяИБ);
Если ПользовательИБ <> Неопределено Тогда
ПользовательИБ.Имя = ЭтотОбъект.Наименование;
ПользовательИБ.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важно помнить: работа с менеджером ПользователиИнформационнойБазы требует наличия административных прав. Если запись справочника будет выполнять обычный пользователь (например, при редактировании своих контактных данных), система выдаст ошибку прав доступа. Чтобы этого избежать, код работы с пользователями ИБ следует выносить в привилегированный общий модуль или использовать команду УстановитьПривилегированныйРежим(Истина).
Если в вашей организации используется вход в 1С через доменную учетную запись, нам необходимо хранить и синхронизировать свойство ПользовательОС. В справочнике для этого рекомендуется создать отдельный строковый реквизит. Рассмотрим формат хранения этих данных.
Значение должно записываться в формате \\DomainName\UserName или Windows-имя-компьютера\UserName. При программном создании пользователя ИБ вы можете установить это свойство:
ПользовательИБ.ПользовательОС = ЭтотОбъект.ПутьКУчеткеОС;
Это позволит пользователям входить в систему без ввода пароля 1С, при этом программа автоматически найдет соответствующий элемент в вашем справочнике по идентификатору текущего пользователя ИБ.
В процессе эксплуатации системы может возникнуть ситуация, когда пользователь был удален из Конфигуратора вручную, но запись в справочнике Пользователи осталась. Проанализируем, как обеспечить стабильность в этом случае. При открытии формы элемента справочника всегда стоит проверять актуальность связи:
&НаСервере
Процедура ПроверитьСвязьСИБ()
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Объект.ИдентификаторПользователяИБ);
Если ПользовательИБ = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Внимание: соответствующая учетная запись в информационной базе не найдена!";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
Для создания надежной связи кастомного справочника с пользователями ИБ необходимо выполнить следующие шаги:
ИдентификаторПользователяИБ с типом УникальныйИдентификатор.ПользовательИнформационнойБазы напрямую, заменяя его строками или UUID.ПользователиИнформационнойБазы.ТекущийПользователь() для определения того, какой именно элемент справочника соответствует человеку, работающему в данный момент в программе.Таким образом, мы получаем гибкую систему управления пользователями, которая не зависит от ограничений БСП и позволяет полностью контролировать процесс авторизации и хранения дополнительных данных сотрудников.