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