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