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