Как реализовать ввод пароля при открытии формы в 1С 8.3 через ПоказатьВводСтроки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок в среде 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью защитить инструмент паролем. В старых версиях платформы (на обычных формах) это решалось простым модальным окном. Однако в современном управляемом приложении и веб-клиенте используется асинхронная модель, которая требует иного подхода. Разберем подробно, почему стандартные методы могут не срабатывать и как правильно написать код защиты.

Проблема асинхронности в управляемых формах

Рассмотрим типичную ситуацию: разработчик пытается вызвать окно ввода пароля прямо в процедуре ПриОткрытии и ожидает, что выполнение кода приостановится, пока пользователь не введет значение. Проанализируем ошибочный вариант кода:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Строка = "";
    ОписаниеОповещения = Новый ОписаниеОповещения("ПроверкаКода", ЭтаФорма);
    ПоказатьВводСтроки(ОписаниеОповещения, Строка, "Введите код");
    // ОШИБКА: Код ниже выполнится СРАЗУ, не дожидаясь ввода пользователя
    Если ВведенныйКод <> "123" Тогда 
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Выясним причину ошибки: метод ПоказатьВводСтроки является немодальным. Это означает, что как только платформа вызвала диалоговое окно, она тут же переходит к следующей строке кода. В этот момент переменная ВведенныйКод еще пуста, условие проверки срабатывает неверно, и форма либо закрывается сразу (если условие Отказ = Истина выполнилось), либо открывается, игнорируя ввод.

Правильное решение: использование обратного вызова

Для корректной работы нам необходимо перенести логику проверки и закрытия формы в процедуру, которая будет вызвана после того, как пользователь нажмет "ОК" в окне ввода пароля. Поскольку в процедуре оповещения у нас уже нет доступа к параметру Отказ, мы должны использовать метод Закрыть(). Рассмотрим рабочую схему реализации:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Создаем описание процедуры, которая выполнится после ввода пароля
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаПароля", ЭтаФорма);
    
    // Вызываем окно ввода
    ТекстЗаголовка = "Доступ ограничен. Введите пароль:";
    ПоказатьВводСтроки(ОписаниеОповещения, "", ТекстЗаголовка);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВводаПароля(ПолученноеЗначение, ПереданныеПараметры) Экспорт
    // Если пользователь нажал Отмена или ввел пустую строку
    Если ПолученноеЗначение = Неопределено Тогда
        Закрыть();
        Возврат;
    КонецЕсли;

    // Проверяем введенный код
    Если ПолученноеЗначение <> "123" Тогда 
        ПоказатьПредупреждение(, "Неверный пароль!");
        Закрыть();
    Иначе
        // Пароль верный, форма остается открытой
        Сообщить("Доступ разрешен");
    КонецЕсли;
КонецПроцедуры

Борьба с «мерцанием» формы

При использовании вышеописанного метода возникает неприятный визуальный эффект: основная форма обработки открывается на мгновение, прежде чем появится окно ввода пароля. Пользователь может успеть увидеть интерфейс обработки. Чтобы этого избежать, проанализируем ситуацию и применим свойство Видимость.

Рекомендуемый алгоритм действий:

  1. В процедуре ПриСозданииНаСервере или ПриОткрытии установите ЭтаФорма.Видимость = Ложь;.
  2. Если пароль введен верно, в процедуре оповещения установите ЭтаФорма.Видимость = Истина;.
  3. Если пароль неверный — вызывайте Закрыть().

Таким образом, до подтверждения прав доступа пользователь будет видеть только окно ввода строки на фоне пустого экрана или интерфейса программы.

Безопасность и хранение пароля

Простое сравнение строки ПолученноеЗначение <> "123" в коде модуля является крайне слабым методом защиты. Разберем, как повысить уровень безопасности вашей обработки:

Альтернативный подход: Проверка прав доступа

Вместо того чтобы заставлять пользователя вводить пароль каждый раз, логичнее использовать встроенные механизмы 1С. Проанализируем, как можно ограничить доступ к обработке на основе ролей пользователя. Этот метод работает синхронно и не требует асинхронных вызовов:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("АдминистраторСистемы") Тогда
        ВызватьИсключение "У вас недостаточно прав для запуска этой обработки!";
    КонецЕсли;
КонецПроцедуры

Использование ВызватьИсключение или установка Отказ = Истина в серверном контексте ПриСозданииНаСервере — это самый надежный и быстрый способ запретить открытие формы неавторизованным лицам, так как проверка происходит до того, как форма вообще будет передана на клиентскую сторону.

Подводя итог, можно сказать: для асинхронного ввода пароля используйте связку ПоказатьВводСтроки и Закрыть() в обработчике оповещения, а для профессиональной защиты отдавайте предпочтение проверке ролей или созданию специализированных форм ввода.

← На главную