Как установить пароль при открытии документа в 1С:Предприятие 8.3

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

В практике разработки на платформе 1С часто возникает задача ограничить доступ к определенным данным (например, к документу НачислениеЗаработнойПлаты) с помощью простого пароля. Несмотря на то, что штатным средством защиты является механизм ролей и RLS (Record Level Security), иногда требуется именно интерактивный запрос пароля непосредственно перед выводом формы на экран. Разберем, как это реализовать правильно, какие существуют методы и на что стоит обратить внимание.

Вариант 1. Использование события ПриОткрытии в модуле формы

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

Проанализируем программный код, который необходимо разместить в модуле управляемой формы документа. Мы будем использовать асинхронный метод ПоказатьВводСтроки, так как в современном интерфейсе «Такси» использование модальных окон (ВвестиСтроку) не рекомендуется или вовсе запрещено настройками конфигурации.


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Создаем оповещение, которое сработает после того, как пользователь введет текст
    Оповещение = Новый ОписаниеОповещения("ПослеВводаПароля", ЭтотОбъект);
    
    // Вызываем диалог ввода. Параметр "3" означает скрытый ввод (режим пароля)
    ПоказатьВводСтроки(Оповещение, "", "Введите пароль для доступа к документу", 0, Ложь);
    
КонецПроцедуры

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

Важное замечание: При использовании этого метода форма на доли секунды может «мелькнуть» перед пользователем. Если внутри формы содержатся критически важные данные, которые нельзя видеть даже мгновение, этот способ может быть недостаточно надежным.

Вариант 2. Перехват открытия через модуль менеджера (наиболее надежный)

Чтобы избежать визуального «мерцания» основной формы, мы можем использовать механизм переопределения формы в модуле менеджера документа. Рассмотрим ситуацию: когда система запрашивает форму документа, мы можем подменить ее на специальную вспомогательную форму ввода пароля.

Для этого выполним следующие шаги:

  1. Создадим в документе новую форму (назовем ее ФормаВводаПароля).
  2. В модуле менеджера документа используем обработчик ОбработкаПолученияФормы.

Рассмотрим пример реализации в модуле менеджера:


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

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

Вариант 3. Управление видимостью элементов

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

Пример кода в обработчике ПослеВводаПароля:


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

Почему «хардкод» пароля — это плохо?

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

Рекомендуемые улучшения:

Безопасность и RLS

Важно понимать, что любой «интерфейсный» пароль можно обойти. Если у пользователя есть права на чтение документа, он сможет увидеть данные через:

  1. Консоль запросов или Универсальный отчет.
  2. Глобальный поиск по базе.
  3. Внешние отчеты, которые обращаются к табличным частям документа.

Поэтому, если стоит задача реальной защиты персональных данных, единственным верным решением будет настройка Ролей и RLS. Пароль на форме — это лишь дополнительный психологический барьер или защита от случайного просмотра данных через плечо сотрудника, но не полноценная система безопасности.

Рассмотрим применение RLS: в настройках роли на чтение документа НачислениеЗаработнойПлаты можно прописать условие, которое позволит видеть суммы только ответственным лицам. Это ограничение будет работать на уровне сервера СУБД, и никакие отчеты или обработки не смогут показать данные пользователю без прав.

Резюме

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

← На главную