В практике разработки на платформе 1С:Предприятие 8 часто возникает задача ограничить доступ к определенному действию в форме. Это может быть проведение документа задним числом, удаление важных записей или выполнение специфических административных функций. Одним из наиболее востребованных способов является установка пароля непосредственно на нажатие кнопки. В этой статье мы разберем, как реализовать этот функционал правильно, начиная от самых простых методов и заканчивая профессиональными подходами к безопасности.
Проанализируем самый быстрый способ реализации — использование системных диалогов. Если нам нужно оперативно добавить проверку, мы можем воспользоваться методом ВвестиЗначение или его современным асинхронным аналогом ПоказатьВводЗначения. Рассмотрим пример реализации в коде команды:
&НаКлиенте
Процедура ВыполнитьДействиеСПаролем(Команда)
ПеременнаяПароль = "";
Подсказка = "Введите пароль для выполнения операции";
// Используем маску для скрытия символов (звездочки)
Если ВвестиСтроку(ПеременнаяПароль, Подсказка, 0, Ложь) Тогда
Если ПеременнаяПароль = "1234" Тогда
// Вызываем серверную процедуру для выполнения действия
ВыполнитьДействиеНаСервере();
Иначе
ПоказатьПредупреждение(, "Неверный пароль!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: использование модальных окон (как в примере выше) в современных конфигурациях может быть запрещено настройками платформы. Поэтому рассмотрим, как сделать это правильно через ОписаниеОповещения.
Разберем, как реализовать ту же задачу, не блокируя интерфейс и соблюдая требования к разработке под веб-клиент. Выясним, как работает метод ПоказатьВводСтроки. Процесс разделяется на два этапа: вызов окна и обработка результата.
&НаКлиенте
Процедура КомандаКнопки(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВводаПароля", ЭтотОбъект);
ПараметрыВвода = Новый Структура("Маска", Истина); // Чтобы скрыть ввод
ПоказатьВводСтроки(Оповещение, "", "Введите пароль доступа", , ПараметрыВвода);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаПароля(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь нажал Отмена
КонецЕсли;
Если ПроверитьПарольНаСервере(Результат) Тогда
// Выполняем полезное действие
Сообщить("Доступ разрешен");
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Доступ запрещен!");
КонецЕсли;
КонецПроцедуры
Посмотрим на ситуацию с точки зрения архитектуры. Если таких кнопок в системе много, создание отдельной логики в каждой форме приведет к дублированию кода. Проанализируем совет из практики: лучше "забодяжить" одну общую форму. Это позволит централизованно менять дизайн окна ввода или логику проверки.
ФормаВводаПароля.ВведенныйПароль с типом Строка и свойством РежимПароля = Истина.Такой подход позволяет в будущем легко добавить дополнительные факторы защиты, такие как двухфакторная авторизация или распознавание пользователя по биометрии, без изменения каждой формы документа.
Проанализируем критическую ошибку новичков — хранение пароля в открытом виде (как "1234" в коде). Любой пользователь с доступом к конфигуратору или отладчику сможет его увидеть. Профессиональное решение подразумевает использование хеширования с солью.
Выясним алгоритм безопасной проверки:
ХешированиеДанных (например, SHA-256).
&НаСервереБезКонтекста
Функция ПроверитьПарольНаСервере(ВведенныйТекст)
Соль = ПараметрыСеанса.ТекущийПользователь.УникальныйИдентификатор();
Хеширование = Новый ХешированиеДанных(АлгоритмХеширования.SHA256);
Хеширование.Добавить(Строка(Соль) + ВведенныйТекст);
РезультатХеширования = СтрЗаменить(Строка(Хеширование.ХешСумма), " ", "");
// Сравниваем с сохраненным значением из константы или регистра
Возврат РезультатХеширования = Константы.ХешПароляАдминистратора.Получить();
КонецФункции
Рассмотрим альтернативный, более "правильный" для 1С подход. Вместо того чтобы заставлять пользователя каждый раз вводить пароль, мы можем использовать механизм ролей. Если у пользователя есть определенная роль, кнопка доступна; если нет — система запрашивает подтверждение от другого пользователя (например, супервайзера).
В коде кнопки это выглядит так:
Если РольДоступна("ПолныеПрава") Или РольДоступна("РазрешитьСпецДействие") Тогда
ВыполнитьДействие();
Иначе
// Здесь вызываем форму ввода пароля супервайзера
КонецЕсли;
Этот метод удобен тем, что управление доступом переносится в стандартную подсистему администрирования прав доступа, что значительно упрощает эксплуатацию системы в крупных организациях.
Разберем несколько важных моментов, которые сделают ваше решение завершенным:
ЗаписатьВЖурналРегистрации.Элементы.ИмяКнопки.Видимость = Ложь) при создании формы на сервере, чтобы не перегружать интерфейс лишними элементами.Подводя итог, можно сказать, что выбор метода зависит от требуемого уровня безопасности. Для простого "защиты от дурака" в локальной базе достаточно ПоказатьВводСтроки. Для серьезных систем учета в ритейле или производстве следует комбинировать хеширование, логирование и работу с ролями доступа.