Как в отчете СКД сделать поле для ввода пароля со звездочками?

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

При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача передать в качестве параметра конфиденциальную информацию, например, пароль для подключения к внешнему источнику данных. Стандартно СКД выводит поле для ввода параметра на форму отчета, но вводимые символы отображаются в открытом виде, что небезопасно.

Попытка использовать стандартное свойство параметра СКД "Маска" не даст нужного результата. Это свойство предназначено для форматирования ввода (например, для номеров телефонов или дат), а не для скрытия символов. Рассмотрим несколько рабочих способов, как правильно реализовать ввод пароля со скрытием символов (звездочками).

Решение 1: Создание собственной формы отчета

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

Разберем по шагам:

  1. В конфигураторе откройте ваш отчет и создайте для него новую основную форму (или используйте существующую, если она есть).
  2. На форму нужно добавить поле для ввода пароля. Для этого создайте реквизит формы, например, с именем ПарольПользователя и типом Строка.
  3. Перетащите этот реквизит на форму, чтобы создать элемент управления — поле ввода.
  4. Выделите созданное поле ввода на форме, откройте палитру свойств (правая кнопка мыши → "Свойства") и найдите свойство РежимПароля. Установите его значение в Истина. Теперь все символы, вводимые в это поле, будут отображаться звездочками.
  5. Последний шаг — передать значение из нашего поля в параметр СКД перед формированием отчета. Для этого в коде формы, в обработчике события, который формирует отчет (например, в обработчике нажатия кнопки "Сформировать"), нужно добавить следующий код:

// Получаем доступ к настройкам компоновщика
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
 
// Находим параметр СКД по его имени ("ПарольSQL" - имя из СКД)
// и устанавливаем его значение из нашего реквизита формы
ПараметрПароль = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЭлементПоИдентификатору("ПарольSQL");
Если ПараметрПароль <> Неопределено Тогда
    ПараметрПароль.Значение = ЭтаФорма.ПарольПользователя;
    ПараметрПароль.Использование = Истина;
КонецЕсли;

// Далее стандартный код формирования отчета
...

Таким образом, пользователь вводит пароль в безопасное поле на нашей форме, а система передает его значение в СКД "за кулисами".

Решение 2: Программная настройка для отчетов на базе БСП

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

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

Для этого в модуле вашего отчета необходимо разместить две экспортные процедуры:


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

Этот способ очень элегантен: он не требует создания лишних объектов в конфигурации и работает автоматически для стандартной формы отчета. Главное — убедиться, что заголовок в коде ("Пароль") точно совпадает с тем, как параметр отображается на форме.

Решение 3: Альтернативный подход — использование безопасного хранилища

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

Этот метод идеально подходит, когда пароль является системной настройкой и не должен меняться рядовыми пользователями. Однако он не подойдет для сценария, когда, например, внешний консультант должен временно ввести свои учетные данные для доступа.

Для работы с хранилищем в БСП есть удобные функции в общем модуле ОбщегоНазначения:

Как это работает:

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

Посмотрим на пример кода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Адрес, под которым пароль был сохранен в хранилище
    АдресХранилища = "ПарольДляПодключенияКSQLСерверуОтчетаXYZ";
    
    // Читаем пароль из безопасного хранилища
    Пароль = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(АдресХранилища);
    
    // Если пароль успешно получен, устанавливаем его в параметр СКД
    Если ЗначениеЗаполнено(Пароль) Тогда
        Настройки = КомпоновщикНастроек.ПолучитьНастройки();
        ПараметрПароль = Настройки.ПараметрыДанных.НайтиЭлементПоИдентификатору("ПарольSQL");
        Если ПараметрПароль <> Неопределено Тогда
            ПараметрПароль.Значение = Пароль;
            ПараметрПароль.Использование = Истина;
        КонецЕсли;
        КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
    Иначе
        // Можно вывести сообщение пользователю, что пароль не настроен
        // или прервать формирование отчета
    КонецЕсли;
    
КонецПроцедуры

Преимущества этого подхода:

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

← На главную