При разработке сложных интерфейсов на управляемых формах 1С часто возникает необходимость динамического создания элементов. Одним из таких элементов является Декорация формы. В отличие от обычных кнопок, декорации позволяют создавать более изящные интерфейсы, имитируя гиперссылки или интерактивные надписи. Однако процесс программного назначения обработчиков событий для таких элементов имеет свои тонкости, которые мы подробно разберем в этой статье.
Представим ситуацию: нам необходимо вывести на форму список опросов или документов, количество которых заранее неизвестно. Мы хотим, чтобы каждое название было кликабельным. Для этого мы будем использовать Декорацию формы с видом Надпись.
Рассмотрим процесс создания элемента на стороне сервера. Процедуру создания логично разместить в обработчике ПриСозданииНаСервере или в другой серверной процедуре, отвечающей за инициализацию данных формы. Проанализируем базовый код создания элемента:
// Пример создания декорации на сервере
НазваниеЭлемента = "Декорация_Опрос_123";
ГруппаРодитель = ЭтаФорма.Элементы.ГруппаСодержание;
// Добавляем элемент на форму
НоваяДекорация = ЭтаФорма.Элементы.Добавить(НазваниеЭлемента, Тип("ДекорацияФормы"), ГруппаРодитель);
НоваяДекорация.Вид = ВидДекорацииФормы.Надпись;
НоваяДекорация.Заголовок = "Пройти опрос №123";
На данном этапе элемент уже появится на форме, но он будет вести себя как обычный статический текст. Чтобы превратить его в интерактивный объект, необходимо настроить дополнительные свойства.
Проанализируем критически важный момент: событие Нажатие для декорации-надписи не будет генерироваться, если не установлено свойство Гиперссылка. Без этого флага платформа воспринимает декорацию как чисто оформительский элемент, не предназначенный для взаимодействия с пользователем.
Выясним, как правильно настроить это свойство:
НоваяДекорация.Гиперссылка = Истина;
После установки этого свойства курсор мыши при наведении на текст будет принимать форму "руки", а сам текст (в зависимости от настроек оформления) может изменить цвет или стать подчеркнутым. Только теперь платформа будет готова "слушать" нажатия пользователя на этот элемент.
Для связи события элемента с процедурой в модуле формы используется метод УстановитьДействие. Разберем его синтаксис: первым параметром передается имя события в виде строки, вторым — имя процедуры-обработчика, также в виде строки.
Рассмотрим пример, где мы назначаем обработчик для события Нажатие:
// Устанавливаем обработчик события "Нажатие"
НоваяДекорация.УстановитьДействие("Нажатие", "ОбработчикНажатияНаДекорацию");
Важный нюанс: часто разработчики допускают ошибку, пытаясь передать объект типа Действие, как это делается в старых версиях платформы или в других объектах. В управляемых формах для элементов формы метод УстановитьДействие принимает именно строку с именем процедуры. Попытка вызвать Новый Действие("ИмяПроцедуры") приведет к ошибке "Тип не определен (Действие)" при проверке на сервере.
Процедура, имя которой мы указали в методе УстановитьДействие, должна соответствовать строгим правилам, иначе при нажатии на элемент пользователь получит сообщение об ошибке.
&НаКлиенте, так как обработка нажатия — это интерфейсное событие.Для события Нажатие декорации формы процедура должна принимать один параметр — Элемент. Посмотрим на пример реализации:
&НаКлиенте
Процедура ОбработчикНажатияНаДекорацию(Элемент)
// Элемент - это объект декорации, на которую нажали
ИмяЭлемента = Элемент.Имя;
ТекстЗаголовка = Элемент.Заголовок;
Сообщить("Вы нажали на декорацию: " + ТекстЗаголовка);
// Здесь можно реализовать логику открытия формы или документа
КонецПроцедуры
Иногда декорации используются для работы с навигационными ссылками 1С. В этом случае может потребоваться обработчик ОбработкаНавигационнойСсылки. Важно понимать, что у этого события другой состав параметров.
Проанализируем сигнатуру для этого случая:
&НаКлиенте
Процедура ОбработчикНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
// Логика обработки ссылки
КонецПроцедуры
Если вы назначите одну и ту же процедуру с одним параметром на оба этих события, программа аварийно завершится при попытке обработки навигационной ссылки из-за несовпадения количества параметров. Будьте внимательны и разделяйте логику или создавайте универсальные процедуры с учетом контекста.
Разберем основные причины, по которым код может не работать, как это случилось в обсуждении на форуме:
"ОбработчикЗапрос", а процедура в модуле называется "ОбработчикОпрос". Платформа не проверяет наличие процедуры в момент выполнения УстановитьДействие на сервере, ошибка проявится только в момент клика.Экспорт обычно не требуется, но процедура обязательно должна быть доступна в контексте клиента.УстановитьДействие вызывается на сервере, а сама процедура-обработчик выполняется на клиенте.Вид декорации установлен как ВидДекорацииФормы.Надпись или Картинка. Для вида Группа события нажатия работают иначе.Если вам нужно, чтобы кликабельным было не все поле декорации, а только отдельное слово в тексте, рассмотрим использование Форматированной строки. В этом случае мы не используем событие Нажатие самой декорации, а внедряем гиперссылку прямо в текст.
Пример реализации такой задачи:
&НаСервере
Процедура ДобавитьСложныйТекст()
// Создаем части строки
Часть1 = "Нажмите ";
// Создаем кликабельную часть через навигационную ссылку
ТекстСсылки = "здесь";
Ссылка = "e1cib/app/Справочник.Опросы"; // Пример внутренней ссылки
Часть2 = Новый ФорматированнаяСтрока(ТекстСсылки, , , , Ссылка);
Часть3 = " чтобы увидеть список.";
// Собираем общую строку
ИтоговаяСтрока = Новый ФорматированнаяСтрока(Часть1, Часть2, Часть3);
// Находим декорацию и устанавливаем заголовок
Декорация = ЭтаФорма.Элементы.ДекорацияТекст;
Декорация.Заголовок = ИтоговаяСтрока;
КонецПроцедуры
В этом сценарии при клике по слову "здесь" сработает событие формы ОбработкаНавигационнойСсылки, если оно определено, либо платформа попытается перейти по ссылке стандартными средствами.
Мы проанализировали процесс программного управления декорациями формы и выяснили, что для успешной реализации интерактивности необходимо соблюдение трех условий: корректное создание элемента через Элементы.Добавить, включение режима Гиперссылка и точное указание имени клиентской процедуры в методе УстановитьДействие. Внимательность к деталям, таким как имена процедур и состав их параметров, позволит вам создавать динамичные и удобные интерфейсы в среде 1С:Предприятие 8.3.