Как программно установить пароль на выполнение команды кнопки в форме 1С

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

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

Метод 1. Использование встроенных функций ввода значения

Проанализируем самый быстрый способ реализации — использование системных диалогов. Если нам нужно оперативно добавить проверку, мы можем воспользоваться методом ВвестиЗначение или его современным асинхронным аналогом ПоказатьВводЗначения. Рассмотрим пример реализации в коде команды:


&НаКлиенте
Процедура ВыполнитьДействиеСПаролем(Команда)
    
    ПеременнаяПароль = "";
    Подсказка = "Введите пароль для выполнения операции";
    
    // Используем маску для скрытия символов (звездочки)
    Если ВвестиСтроку(ПеременнаяПароль, Подсказка, 0, Ложь) Тогда
        Если ПеременнаяПароль = "1234" Тогда
            // Вызываем серверную процедуру для выполнения действия
            ВыполнитьДействиеНаСервере();
        Иначе
            ПоказатьПредупреждение(, "Неверный пароль!");
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Метод 2. Асинхронный ввод пароля (стандарт для 8.3)

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


&НаКлиенте
Процедура КомандаКнопки(Команда)
    
    Оповещение = Новый ОписаниеОповещения("ПослеВводаПароля", ЭтотОбъект);
    ПараметрыВвода = Новый Структура("Маска", Истина); // Чтобы скрыть ввод
    
    ПоказатьВводСтроки(Оповещение, "", "Введите пароль доступа", , ПараметрыВвода);
    
КонецПроцедуры

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

Метод 3. Создание общей формы для ввода пароля

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

  1. Создаем в дереве конфигурации объект ОбщаяФорма с именем ФормаВводаПароля.
  2. Добавляем реквизит ВведенныйПароль с типом Строка и свойством РежимПароля = Истина.
  3. В коде основной формы вызываем эту общую форму и обрабатываем результат закрытия.

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

Метод 4. Безопасное хранение и хеширование

Проанализируем критическую ошибку новичков — хранение пароля в открытом виде (как "1234" в коде). Любой пользователь с доступом к конфигуратору или отладчику сможет его увидеть. Профессиональное решение подразумевает использование хеширования с солью.

Выясним алгоритм безопасной проверки:

  1. В базе (например, в регистре сведений) хранится не пароль, а результат функции ХешированиеДанных (например, SHA-256).
  2. К паролю добавляется "соль" — уникальная строка, привязанная к пользователю.
  3. При нажатии кнопки система вычисляет хеш от введенной строки и сравнивает его с эталоном в базе.

&НаСервереБезКонтекста
Функция ПроверитьПарольНаСервере(ВведенныйТекст)
    
    Соль = ПараметрыСеанса.ТекущийПользователь.УникальныйИдентификатор();
    Хеширование = Новый ХешированиеДанных(АлгоритмХеширования.SHA256);
    Хеширование.Добавить(Строка(Соль) + ВведенныйТекст);
    
    РезультатХеширования = СтрЗаменить(Строка(Хеширование.ХешСумма), " ", "");
    
    // Сравниваем с сохраненным значением из константы или регистра
    Возврат РезультатХеширования = Константы.ХешПароляАдминистратора.Получить();
    
КонецФункции

Метод 5. Использование ролей вместо паролей

Рассмотрим альтернативный, более "правильный" для 1С подход. Вместо того чтобы заставлять пользователя каждый раз вводить пароль, мы можем использовать механизм ролей. Если у пользователя есть определенная роль, кнопка доступна; если нет — система запрашивает подтверждение от другого пользователя (например, супервайзера).

В коде кнопки это выглядит так:


Если РольДоступна("ПолныеПрава") Или РольДоступна("РазрешитьСпецДействие") Тогда
    ВыполнитьДействие();
Иначе
    // Здесь вызываем форму ввода пароля супервайзера
КонецЕсли;

Этот метод удобен тем, что управление доступом переносится в стандартную подсистему администрирования прав доступа, что значительно упрощает эксплуатацию системы в крупных организациях.

Рекомендации по юзабилити и логированию

Разберем несколько важных моментов, которые сделают ваше решение завершенным:

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

← На главную