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