При разработке интерфейсов на управляемых формах нередко возникает задача вывести в одну ячейку таблицы динамический текст со ссылками. Например, когда требуется показать две связанные сущности или два действия в компактном виде с помощью объекта ФорматированнаяСтрока. Однако при попытке отследить клик по конкретной ссылке разработчики сталкиваются с аппаратными ограничениями платформы.
Разберем детально, почему стандартный механизм ссылок ведет себя таким образом внутри таблицы, и рассмотрим рабочие способы реализации нужного поведения.
Проанализируем механику работы управляемой формы. Событие ОбработкаНавигационнойСсылки и событие Нажатие у элементов с видом ПолеНадписи полноценно функционируют только тогда, когда элемент расположен непосредственно на самой форме как самостоятельный элемент управления. Как только мы помещаем поле внутрь элемента ТаблицаФормы (будь то табличная часть, таблица значений или динамический список), платформа перестает вызывать данные события для ячеек.
Если мы включаем у колонки свойство ГиперссылкаЯчейки = Истина, это не делает кликабельными отдельные фрагменты форматированной строки. Данное свойство лишь меняет поведение всей ячейки целиком: при одинарном щелчке мыши вызывается событие таблицы Выбор (вместо привычного двойного клика). Однако в параметрах обработчика Выбор передаются только ссылка на строку и элемент Поле (колонка). Платформа не предоставляет координаты клика или данные о том, на какой конкретно символ или часть строки нажал пользователь. Следовательно, различить две гиперссылки внутри одного поля штатными средствами невозможно.
Рассмотрим проверенные способы решения этой задачи.
Это наиболее удобный и визуально бесшовный способ, позволяющий сохранить компактность строки и обеспечить независимую обработку нажатий.
Разберем реализацию по шагам:
Ссылка1 и Ссылка2) с видом ПолеНадписи.ГруппаКолонокФормы.Группировка в значение В ячейке (или Горизонтальная).ГиперссылкаЯчейки = Истина.Выбор.Посмотрим на пример обработки события Выбор в модуле формы:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Поле = Элементы.СписокСсылка1 Тогда
// Обработка перехода по первой ссылке
ПерейтиПоНавигационнойСсылке(ТекущиеДанные.АдресПервойСсылки);
ИначеЕсли Поле = Элементы.СписокСсылка2 Тогда
// Обработка перехода по второй ссылке
ПерейтиПоНавигационнойСсылке(ТекущиеДанные.АдресВторойСсылки);
КонецЕсли;
КонецПроцедуры
Преимущество подхода: визуально для пользователя текст и ссылки отображаются в границах единой ячейки, но для платформы это два независимых элемента, клик по каждому из которых четко идентифицируется через параметр Поле.
Если ссылки представляют собой команды (например, «Открыть документ» и «Сформировать отчет»), их можно представить кнопками компактного вида.
ПолеКнопки, связав их с созданными командами.ГруппаКолонокФормы с группировкой В ячейке).Элементы.ИмяТаблицы.ТекущиеДанные и выполним требуемое действие.Если объединение колонок не подходит по визуальным требованиям и ячейка должна оставаться неделимой, можно использовать промежуточное меню выбора.
В этом случае колонка настраивается со свойством ГиперссылкаЯчейки = Истина. При одиночном клике по ячейке срабатывает событие таблицы Выбор, в котором разработчик открывает небольшое всплывающее меню или компактную модальную форму с вариантами действий.
Посмотрим на пример реализации с вызовом выпадающего меню:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле = Элементы.КолонкаСДвумяДействиями Тогда
СтандартнаяОбработка = Ложь;
МенюДействий = Новый СписокЗначений;
МенюДействий.Добавить("Действие1", "Перейти к основному объекту");
МенюДействий.Добавить("Действие2", "Перейти к связанному документу");
Оповещение = Новый ОписаниеОповещения("ПослеВыбораДействия", ЭтотОбъект);
ПоказатьВыборИзСписка(Оповещение, МенюДействий, Элементы.КолонкаСДвумяДействиями);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораДействия(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ВыбранныйЭлемент.Значение = "Действие1" Тогда
ПерейтиПоНавигационнойСсылке(ТекущиеДанные.Адрес1);
ИначеЕсли ВыбранныйЭлемент.Значение = "Действие2" Тогда
ПерейтиПоНавигационнойСсылке(ТекущиеДанные.Адрес2);
КонецЕсли;
КонецПроцедуры
Рассмотрим альтернативные варианты, когда данные выводятся только для просмотра и анализа без непосредственного редактирования строк в табличной части:
ФорматированнаяСтрока поддерживается в полном объеме. У элемента формы ПолеТабличногоДокумента штатно отрабатывает событие ОбработкаНавигационнойСсылки, куда передается конкретный навигационный адрес нажатой части текста. Также доступен стандартный механизм расшифровки ячеек.<a> легко обрабатываются через навигационные ссылки пользовательских схем или событие ПриНажатии. Это дает полную свободу в размещении любого количества интерактивных элементов в одной строке.Таким образом, для стандартных таблиц управляемой формы оптимальным и рекомендуемым решением остается группировка двух независимых колонок со свойством В ячейке.