Загрузка данных


// Кнопка "Войти"
Процедура Войти(Команда)
    
    // 1. Проверка обязательных полей
    Если ПустаяСтрока(Логин) Или ПустаяСтрока(Пароль) Тогда
        Предупреждение("Поля Логин и Пароль обязательны для заполнения!");
        Возврат;
    КонецЕсли;
    
    // 2. Поиск пользователя в базе
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |   Пользователи.Ссылка КАК Ссылка,
    |   Пользователи.Пароль КАК Пароль,
    |   Пользователи.Роль КАК Роль,
    |   Пользователи.Заблокирован КАК Заблокирован,
    |   Пользователи.НеудачныеПопытки КАК НеудачныеПопытки,
    |   Пользователи.ДатаПоследнегоВхода КАК ДатаПоследнегоВхода,
    |   Пользователи.ПервыйВход КАК ПервыйВход
    |ИЗ
    |   Справочник.Пользователи КАК Пользователи
    |ГДЕ
    |   Пользователи.Логин = &Логин";
    Запрос.УстановитьПараметр("Логин", Логин);
    
    Результат = Запрос.Выполнить().Выбрать();
    
    // 3. Если пользователь не найден
    Если Не Результат.Следующий() Тогда
        Предупреждение("Вы ввели неверный логин или пароль. Пожалуйста проверьте ещё раз введенные данные");
        Возврат;
    КонецЕсли;
    
    // 4. Проверка блокировки
    Если Результат.Заблокирован Тогда
        Предупреждение("Вы заблокированы. Обратитесь к администратору");
        Возврат;
    КонецЕсли;
    
    // 5. Проверка блокировки по времени (1 месяц без входа)
    Если Результат.ДатаПоследнегоВхода <> Дата(1,1,1) Тогда
        Если Результат.ДатаПоследнегоВхода < ДобавитьМесяц(ТекущаяДата(), -1) Тогда
            // Блокируем пользователя
            ОбъектПользователя = Результат.Ссылка.ПолучитьОбъект();
            ОбъектПользователя.Заблокирован = Истина;
            ОбъектПользователя.Записать();
            Предупреждение("Вы заблокированы. Обратитесь к администратору");
            Возврат;
        КонецЕсли;
    КонецЕсли;
    
    // 6. Проверка пароля (сравниваем напрямую, без хэша)
    Если Результат.Пароль <> Пароль Тогда
        
        // Увеличиваем счётчик неудачных попыток
        ОбъектПользователя = Результат.Ссылка.ПолучитьОбъект();
        ОбъектПользователя.НеудачныеПопытки = ОбъектПользователя.НеудачныеПопытки + 1;
        
        Если ОбъектПользователя.НеудачныеПопытки >= 3 Тогда
            ОбъектПользователя.Заблокирован = Истина;
            ОбъектПользователя.Записать();
            Предупреждение("Вы заблокированы. Обратитесь к администратору");
        Иначе
            ОбъектПользователя.Записать();
            Предупреждение("Вы ввели неверный логин или пароль. Пожалуйста проверьте ещё раз введенные данные");
        КонецЕсли;
        Возврат;
    КонецЕсли;
    
    // 7. Успешная авторизация — сброс счётчика
    ОбъектПользователя = Результат.Ссылка.ПолучитьОбъект();
    ОбъектПользователя.НеудачныеПопытки = 0;
    ОбъектПользователя.ДатаПоследнегоВхода = ТекущаяДата();
    ОбъектПользователя.Записать();
    
    Предупреждение("Вы успешно авторизовались");
    
    // 8. Проверка первого входа
    Если Результат.ПервыйВход Тогда
        // Открыть форму смены пароля
        ФормаСмены = ПолучитьФорму("ОбщаяФорма.ФормаСменыПароля");
        ФормаСмены.Параметры.Установить("ПользовательСсылка", Результат.Ссылка);
        ФормаСмены.ОткрытьМодально();
    Иначе
        // Переход на рабочий стол в зависимости от роли
        Если Результат.Роль = Перечисления.Роли.Администратор Тогда
            ОткрытьФорму("ОбщаяФорма.РабочийСтолАдминистратора");
        Иначе
            ОткрытьФорму("ОбщаяФорма.РабочийСтолПользователя");
        КонецЕсли;
    КонецЕсли;
    
    Закрыть();
    
КонецПроцедуры