Как реализовать авторизацию пользователя через форму и открыть его профиль в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Реализация собственной системы авторизации в дополнение к стандартным механизмам платформы 1С — задача довольно частая, особенно в специализированных киосках, мобильных интерфейсах или при создании кастомных систем управления доступом. В этой статье мы подробно разберем, как организовать процесс ввода учетных данных, выполнить их проверку на сервере и корректно открыть форму профиля пользователя.

Постановка задачи и общая логика процесса

Представим ситуацию: у нас есть справочник Пользователи, в котором хранятся реквизиты IdNumber (уникальный идентификатор или номер карты) и Password (пароль). Нам необходимо создать обработку или общую форму, где пользователь вводит эти данные. После нажатия кнопки «Вход» система должна найти соответствующий элемент в справочнике и открыть его форму для дальнейшей работы. Если данные введены неверно, система должна выдать предупреждение.

Алгоритм работы будет состоять из трех этапов:

  1. Сбор данных на клиенте и передача их на сервер.
  2. Поиск пользователя в базе данных с помощью запроса или встроенных методов.
  3. Возврат результата на клиент и программное открытие формы найденного объекта.

Реализация поиска пользователя через запрос

Рассмотрим основной способ поиска данных в базе — использование объекта Запрос. Это наиболее гибкий метод, позволяющий искать пользователя по нескольким критериям одновременно. Проанализируем программный код серверной функции:


&НаСервере
Функция ПолучитьПользователя(Знач IdNumber, Знач Password)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	Пользователи.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |	Пользователи.IdNumber = &IdNumber
        |	И Пользователи.Password = &Password
        |	И НЕ Пользователи.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("IdNumber", IdNumber);
    Запрос.УстановитьПараметр("Password", Password);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Ссылка;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Обратите внимание на использование условия И НЕ Пользователи.ПометкаУдаления. Это критически важный момент: если пользователь помечен на удаление, он не должен иметь возможности авторизоваться, даже если пароль введен верно.

Оптимизация поиска через встроенные методы

Если поле IdNumber является уникальным и для него в конфигураторе установлено свойство Индексировать, мы можем ускорить работу системы, отказавшись от запроса в пользу метода НайтиПоРеквизиту. Рассмотрим, как это упрощает код:


&НаСервере
Функция НайтиПользователяБыстро(IdNumber, Password)
    НайденнаяСсылка = Справочники.Пользователи.НайтиПоРеквизиту("IdNumber", IdNumber);
    
    Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
        // Проверяем пароль, так как НайтиПоРеквизиту работает только по одному полю
        Если НайденнаяСсылка.Password = Password Тогда
            Возврат НайденнаяСсылка;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Метод НайтиПоРеквизиту работает быстрее запроса, если база данных велика, а поиск осуществляется по проиндексированному полю.

Программное открытие формы профиля

После того как мы получили ссылку на пользователя на сервере, нам нужно вернуться на клиент и открыть форму этого пользователя. Здесь ключевым моментом является использование параметра Ключ. Разберем клиентскую процедуру, которая вызывается при нажатии кнопки:


&НаКлиенте
Процедура Вход(Команда)
    
    // Вызываем серверную функцию для поиска
    НайденныйПользователь = ПолучитьПользователя(Объект.IdNumber, Объект.Password);
    
    Если ЗначениеЗаполнено(НайденныйПользователь) Тогда
        
        // Подготавливаем параметры для открытия формы
        // "Ключ" — это стандартный параметр 1С для передачи ссылки на объект
        ПараметрыФормы = Новый Структура("Ключ", НайденныйПользователь);
        
        // Открываем основную форму элемента справочника Пользователи
        ОткрытьФорму("Справочник.Пользователи.Форма.ФормаЭлемента", ПараметрыФормы);
        
        // Закрываем текущую форму авторизации, если вход выполнен
        ЭтаФорма.Закрыть();
        
    Иначе
        ПоказатьОповещениеПользователя("Ошибка!", , "Неверный логин или пароль", БиблиотекаКартинок.Ошибка);
    КонецЕсли;
    
КонецПроцедуры

Важное пояснение по параметру "Ключ": В платформе 1С при вызове метода ОткрытьФорму для объекта базы данных (справочника, документа), передача структуры с ключом "Ключ" сообщает системе, что нужно открыть не пустую форму нового объекта, а форму уже существующей записи из базы. Если этот параметр не передать или передать пустую ссылку, платформа откроет форму создания нового элемента.

Вопросы безопасности: хеширование паролей

Проанализируем важный аспект, который часто упускают начинающие разработчики. Хранить пароли в открытом (текстовом) виде в базе данных — крайне небезопасно. Любой администратор или программист с доступом к консоли запросов сможет увидеть пароли всех пользователей.

Правильный подход заключается в хранении хеша пароля. Выясним, как это реализовать:

  1. При регистрации пользователя введенный пароль прогоняется через алгоритм хеширования (например, SHA-256) с помощью объекта ХешированиеДанных.
  2. В реквизит Password записывается не «12345», а длинная зашифрованная строка.
  3. При авторизации введенный текст также хешируется, и в запросе сравниваются две зашифрованные строки.

Пример получения хеша в 1С:


ХешОбъект = Новый ХешированиеДанных(АлгоритмХеширования.SHA256);
ХешОбъект.Добавить(СтрокаПароля);
ХешСтрока = НРег(СтрЗаменить(Строка(ХешОбъект.ХешСумма), " ", ""));

Дополнительно рекомендуется использовать так называемую «соль» — добавление уникальной строки к паролю перед его шифрованием, чтобы защититься от взлома по словарям хешей.

Управление сеансом и параметрами приложения

Просто открыть форму профиля недостаточно, чтобы система «узнала» пользователя в других модулях. Чтобы ссылка на авторизованного пользователя была доступна во всей программе (например, для автозаполнения автора в документах), необходимо использовать Параметры сеанса.

Разберем последовательность действий:

  1. В конфигураторе создайте Параметр сеанса ТекущийПользовательСистемы с типом СправочникСсылка.Пользователи.
  2. В момент успешной авторизации на сервере установите значение этого параметра: ПараметрыСеанса.ТекущийПользовательСистемы = НайденныйПользователь;.
  3. Теперь в любом месте кода вы сможете обратиться к этой ссылке без повторного поиска.

Где разместить вызов формы авторизации?

Чтобы форма авторизации появлялась сразу при запуске программы, ее вызов следует прописать в Модуле управляемого приложения в процедуре ПриНачалеРаботыСистемы. Если пользователь закроет форму, не пройдя авторизацию, следует вызвать команду ЗавершитьРаботуСистемы(Ложь), чтобы предотвратить доступ к остальному функционалу программы.

Посмотрим на пример в модуле приложения:


Процедура ПриНачалеРаботыСистемы()
    // Здесь можно вызвать форму авторизации модально или через блокирующее окно
    // (в зависимости от настроек модальности конфигурации)
    ПараметрыОткрытия = Новый Структура;
    ОткрытьФорму("ОбщаяФорма.ФормаАвторизации", ПараметрыОткрытия, , Истина);
КонецПроцедуры

Таким образом, мы рассмотрели полный цикл создания системы авторизации: от проектирования структуры данных и написания поисковых запросов до нюансов безопасности и управления сессией пользователя. Использование параметров формы, в частности Ключ, позволяет гибко управлять интерфейсом и обеспечивать быстрый доступ к нужным данным.

← На главную