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