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