Реализация собственной системы авторизации в дополнение к стандартным механизмам платформы 1С — задача довольно частая, особенно в специализированных киосках, мобильных интерфейсах или при создании кастомных систем управления доступом. В этой статье мы подробно разберем, как организовать процесс ввода учетных данных, выполнить их проверку на сервере и корректно открыть форму профиля пользователя.
Представим ситуацию: у нас есть справочник Пользователи, в котором хранятся реквизиты IdNumber (уникальный идентификатор или номер карты) и Password (пароль). Нам необходимо создать обработку или общую форму, где пользователь вводит эти данные. После нажатия кнопки «Вход» система должна найти соответствующий элемент в справочнике и открыть его форму для дальнейшей работы. Если данные введены неверно, система должна выдать предупреждение.
Алгоритм работы будет состоять из трех этапов:
Рассмотрим основной способ поиска данных в базе — использование объекта Запрос. Это наиболее гибкий метод, позволяющий искать пользователя по нескольким критериям одновременно. Проанализируем программный код серверной функции:
&НаСервере
Функция ПолучитьПользователя(Знач IdNumber, Знач Password)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.IdNumber = &IdNumber
| И Пользователи.Password = &Password
| И НЕ Пользователи.ПометкаУдаления";
Запрос.УстановитьПараметр("IdNumber", IdNumber);
Запрос.УстановитьПараметр("Password", Password);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Обратите внимание на использование условия И НЕ Пользователи.ПометкаУдаления. Это критически важный момент: если пользователь помечен на удаление, он не должен иметь возможности авторизоваться, даже если пароль введен верно.
Если поле IdNumber является уникальным и для него в конфигураторе установлено свойство Индексировать, мы можем ускорить работу системы, отказавшись от запроса в пользу метода НайтиПоРеквизиту. Рассмотрим, как это упрощает код:
&НаСервере
Функция НайтиПользователяБыстро(IdNumber, Password)
НайденнаяСсылка = Справочники.Пользователи.НайтиПоРеквизиту("IdNumber", IdNumber);
Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
// Проверяем пароль, так как НайтиПоРеквизиту работает только по одному полю
Если НайденнаяСсылка.Password = Password Тогда
Возврат НайденнаяСсылка;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Метод НайтиПоРеквизиту работает быстрее запроса, если база данных велика, а поиск осуществляется по проиндексированному полю.
После того как мы получили ссылку на пользователя на сервере, нам нужно вернуться на клиент и открыть форму этого пользователя. Здесь ключевым моментом является использование параметра Ключ. Разберем клиентскую процедуру, которая вызывается при нажатии кнопки:
&НаКлиенте
Процедура Вход(Команда)
// Вызываем серверную функцию для поиска
НайденныйПользователь = ПолучитьПользователя(Объект.IdNumber, Объект.Password);
Если ЗначениеЗаполнено(НайденныйПользователь) Тогда
// Подготавливаем параметры для открытия формы
// "Ключ" — это стандартный параметр 1С для передачи ссылки на объект
ПараметрыФормы = Новый Структура("Ключ", НайденныйПользователь);
// Открываем основную форму элемента справочника Пользователи
ОткрытьФорму("Справочник.Пользователи.Форма.ФормаЭлемента", ПараметрыФормы);
// Закрываем текущую форму авторизации, если вход выполнен
ЭтаФорма.Закрыть();
Иначе
ПоказатьОповещениеПользователя("Ошибка!", , "Неверный логин или пароль", БиблиотекаКартинок.Ошибка);
КонецЕсли;
КонецПроцедуры
Важное пояснение по параметру "Ключ": В платформе 1С при вызове метода ОткрытьФорму для объекта базы данных (справочника, документа), передача структуры с ключом "Ключ" сообщает системе, что нужно открыть не пустую форму нового объекта, а форму уже существующей записи из базы. Если этот параметр не передать или передать пустую ссылку, платформа откроет форму создания нового элемента.
Проанализируем важный аспект, который часто упускают начинающие разработчики. Хранить пароли в открытом (текстовом) виде в базе данных — крайне небезопасно. Любой администратор или программист с доступом к консоли запросов сможет увидеть пароли всех пользователей.
Правильный подход заключается в хранении хеша пароля. Выясним, как это реализовать:
ХешированиеДанных.Password записывается не «12345», а длинная зашифрованная строка.Пример получения хеша в 1С:
ХешОбъект = Новый ХешированиеДанных(АлгоритмХеширования.SHA256);
ХешОбъект.Добавить(СтрокаПароля);
ХешСтрока = НРег(СтрЗаменить(Строка(ХешОбъект.ХешСумма), " ", ""));
Дополнительно рекомендуется использовать так называемую «соль» — добавление уникальной строки к паролю перед его шифрованием, чтобы защититься от взлома по словарям хешей.
Просто открыть форму профиля недостаточно, чтобы система «узнала» пользователя в других модулях. Чтобы ссылка на авторизованного пользователя была доступна во всей программе (например, для автозаполнения автора в документах), необходимо использовать Параметры сеанса.
Разберем последовательность действий:
ТекущийПользовательСистемы с типом СправочникСсылка.Пользователи.ПараметрыСеанса.ТекущийПользовательСистемы = НайденныйПользователь;.Чтобы форма авторизации появлялась сразу при запуске программы, ее вызов следует прописать в Модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы. Если пользователь закроет форму, не пройдя авторизацию, следует вызвать команду ЗавершитьРаботуСистемы(Ложь), чтобы предотвратить доступ к остальному функционалу программы.
Посмотрим на пример в модуле приложения:
Процедура ПриНачалеРаботыСистемы()
// Здесь можно вызвать форму авторизации модально или через блокирующее окно
// (в зависимости от настроек модальности конфигурации)
ПараметрыОткрытия = Новый Структура;
ОткрытьФорму("ОбщаяФорма.ФормаАвторизации", ПараметрыОткрытия, , Истина);
КонецПроцедуры
Таким образом, мы рассмотрели полный цикл создания системы авторизации: от проектирования структуры данных и написания поисковых запросов до нюансов безопасности и управления сессией пользователя. Использование параметров формы, в частности Ключ, позволяет гибко управлять интерфейсом и обеспечивать быстрый доступ к нужным данным.