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


// ===== ЭТО КЛИЕНТСКАЯ ЧАСТЬ =====
// Здесь работаем с интерфейсом

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

// ===== ЭТО СЕРВЕРНАЯ ЧАСТЬ =====
// Здесь работаем с базой данных

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