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