При разработке механизмов авторизации или защиты от несанкционированного доступа часто возникает задача ограничить количество попыток ввода пароля. Рассмотрим, как правильно реализовать счетчик, который будет блокировать форму после трех неудачных попыток, и разберем распространенные ошибки при работе с контекстом управляемых форм.
Одной из самых частых причин, почему счетчик не работает, является неправильное объявление переменных. Если вы объявляете переменную внутри процедуры, она становится локальной. Это значит, что при каждом вызове процедуры значение переменной создается заново и уничтожается сразу после завершения работы кода.
Чтобы переменная «помнила» количество попыток между нажатиями кнопки, её необходимо объявить на уровне модуля формы, используя директиву &НаКлиенте. Давайте разберем правильную структуру модуля:
&НаКлиенте
Перем Ввели_не_правильно_раз;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Ввели_не_правильно_раз = 0;
КонецПроцедуры
Таким образом, переменная Ввели_не_правильно_раз будет существовать в течение всего жизненного цикла открытой формы.
Рассмотрим пошагово, как реализовать механизм блокировки. Когда пользователь нажимает кнопку «Вход», система должна проверить учетные данные, а при их неверности — инкрементировать (увеличить на единицу) счетчик.
ПриОткрытии.Вход проверяем результат авторизации. Если авторизация не удалась — увеличиваем счетчик.ЭтаФорма.Доступность = Ложь и запускаем таймер.Посмотрим на пример реализации кода для процедуры Вход:
&НаКлиенте
Процедура Вход(Команда)
Авторизация = ВойтиВСистему();
Если Авторизация Тогда
ОткрытьФорму("ОбщаяФорма.Пользователь");
Иначе
Ввели_не_правильно_раз = Ввели_не_правильно_раз + 1;
Если Ввели_не_правильно_раз >= 3 Тогда
Ввели_не_правильно_раз = 0; // Сбрасываем для следующего цикла
Таймер = 10;
ТаймерНадпись = Таймер;
ЭтаФорма.Доступность = Ложь;
ПодключитьОбработчикОжидания("ЗапуститьТаймер", 1);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для создания эффекта ожидания мы используем ПодключитьОбработчикОжидания. Этот метод позволяет выполнять определенную процедуру с заданным интервалом. Важно не забывать отключать обработчик, когда таймер доходит до нуля, чтобы не нагружать клиентский процесс лишними вызовами.
Разберем процедуру, которая управляет обратным отсчетом:
&НаКлиенте
Процедура ЗапуститьТаймер()
Если Таймер > 0 Тогда
Таймер = Таймер - 1;
ТаймерНадпись = Таймер;
Иначе
ОтключитьОбработчикОжидания("ЗапуститьТаймер");
ЭтаФорма.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
При реализации собственных механизмов авторизации всегда помните о следующих моментах:
&НаКлиенте и &НаСервере. Помните, что серверные функции не имеют доступа к переменным модуля формы, если те не объявлены как реквизиты формы.Теперь, когда мы разобрали причины ошибок и увидели корректную структуру кода, вы сможете легко адаптировать этот алгоритм под свои задачи. Не забывайте проверять область видимости переменных и всегда инициализировать счетчики при открытии формы!