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