В процессе эксплуатации информационных систем на базе 1С:Предприятие администраторы и разработчики часто сталкиваются с ситуацией, когда в штате появляются сотрудники с абсолютно идентичными фамилиями, именами и отчествами. Если система настроена на поиск пользователя только по строковому представлению имени, это неизбежно приводит к путанице: один сотрудник может зайти под учетной записью другого, или система вовсе откажет в доступе. Рассмотрим подробно, как правильно организовать архитектуру авторизации, чтобы корректно различать полных тезок.
Для начала проанализируем, как 1С хранит данные о пользователях в Конфигураторе. У каждого пользователя информационной базы (ИБ) есть два ключевых поля, которые часто путают:
Разберем по шагам, как использовать это различие. Для тезок мы можем оставить «Полное имя» одинаковым (например, «Иванов Иван Иванович»), но создать разные «Имена» для входа. В качестве уникального дополнения к логину можно использовать:
ИвановИИ_0045.ИвановИИ_1985.ИвановИИ_МСК.Такой подход позволяет пользователю четко понимать, какой логин вводить, при этом в документах он по-прежнему будет значиться как «Иванов Иван Иванович».
Проанализируем ситуацию с точки зрения программного кода, особенно в самописных конфигурациях. Одной из главных архитектурных ошибок является поиск соответствия между справочником Пользователи в режиме «Предприятие» и пользователем информационной базы в «Конфигураторе» по текстовому имени. Правильным методом является связка через GUID (UUID).
Рассмотрим пример того, как получить уникальный идентификатор пользователя информационной базы. Даже если у двух пользователей совпадают имена, их внутренние идентификаторы в системе всегда будут разными. Выясним, как программно найти пользователя по его уникальному коду:
// Пример получения пользователя ИБ по его уникальному идентификатору
ИдентификаторПользователя = Справочники.Пользователи.НайтиПоНаименованию("Иванов").ИдентификаторПользователяИБ;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователя);
Если ПользовательИБ <> Неопределено Тогда
Сообщить("Найден пользователь: " + ПользовательИБ.ПолноеИмя);
КонецЕсли;
В типовых конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем), этот механизм уже реализован «из коробки». В справочнике Пользователи есть скрытый реквизит ИдентификаторПользователяИБ, который хранит GUID. Если вы разрабатываете свою систему, обязательно предусмотрите хранение этого идентификатора, а не полагайтесь на строковое совпадение имен.
Рассмотрим наиболее надежный способ решения проблемы тезок — использование аутентификации Windows (Active Directory). В этом случае 1С не занимается проверкой пароля, а доверяет операционной системе.
Посмотрим на ситуацию со стороны системного администрирования. В домене Active Directory невозможно создать двух пользователей с одинаковыми логинами (sAMAccountName). Даже если в компании работают два «Иванова Ивана Ивановича», их доменные имена будут различаться (например, domain\ivanov.i1 и domain\ivanov.i2).
При настройке пользователя в 1С мы указываем конкретную доменную учетную запись. Система связывает пользователя 1С с SID (Security Identifier) пользователя Windows. Это гарантирует, что под конкретным пользователем в базу сможет зайти только владелец конкретной учетной записи компьютера, независимо от того, как его карточка называется в самой 1С.
Если в вашей информационной базе включена опция «Показывать в списке выбора» при авторизации, то при наличии тезок пользователь увидит в выпадающем списке несколько абсолютно одинаковых строк «Иванов Иван Иванович». Это запутает сотрудников.
Чтобы решить эту задачу в режиме «Предприятие», выполним следующие действия:
Пользователи (или ФизическиеЛица, если авторизация завязана на них) найдем настройки Данных выбора.ОбработкаПолученияДанныхВыбора в модуле менеджера справочника, чтобы динамически формировать текст подсказки.Рассмотрим пример кода, который изменяет представление в списке выбора, добавляя к имени должность:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Ссылка КАК Ссылка,
| Пользователи.Наименование + "" ("" + Пользователи.Должность + "")"" КАК Представление
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.Наименование ПОДОБНО &ТекстЗапроса";
Запрос.УстановитьПараметр("ТекстЗапроса", "%" + Параметры.СтрокаПоиска + "%");
ТаблицаРезультатов = Запрос.Выполнить().Выгрузить();
СписокВыбора = Новый СписокЗначений;
Для Каждого Строка Из ТаблицаРезультатов Цикл
СписокВыбора.Добавить(Строка.Ссылка, Строка.Представление);
КонецЦикла;
ДанныеВыбора = СписокВыбора;
КонецПроцедуры
Иногда возникают ситуации, когда регламент компании запрещает менять даже логин (хотя это странно), и пользователи настаивают на визуальной идентичности. В таких редких случаях администраторы прибегают к использованию спецсимволов.
Внимание: мы рекомендуем использовать этот метод только в самом крайнем случае, так как он может усложнить программный поиск пользователей в будущем.
Суть заключается в добавлении в конец имени одного из тезок неразрывного пробела (комбинация клавиш Alt + 0160 на цифровой клавиатуре). Визуально имена в списке и при входе будут выглядеть одинаково, но для платформы 1С это будут разные строки, так как коды символов различаются. Обычный пробел (код 32) платформа может автоматически обрезать функцией СокрЛП, а неразрывный пробел часто сохраняется, что позволяет обойти проверку на уникальность имени.
Проанализировав все доступные методы, мы можем составить оптимальный план действий при появлении однофамильцев:
Наименованию и перейдите к использованию ИдентификаторПользователяИБ.Помните, что корректная идентификация пользователей важна не только для входа, но и для аудита действий в Журнале регистрации. Использование уникальных логинов (даже с цифровыми индексами) позволит вам всегда точно знать, какой именно «Иванов» внес изменения в документ или удалил запись.