При разработке интерфейсов на платформе 1С:Предприятие 8.3 программисты часто используют элемент формы Поле HTML документа. Это мощный инструмент, позволяющий выводить форматированный текст, изображения и интерактивные элементы. Однако часто возникает ситуация, когда привычные гиперссылки перестают работать: курсор меняет форму при наведении, но клик не приводит к переходу. Рассмотрим подробно причины этого поведения и разберем эффективные способы решения проблемы.
Проанализируем ситуацию, описанную в теме форума. Автор столкнулся с тем, что ссылки внутри тега <a> перестали открываться после добавления определенного блока кода. Причина кроется в использовании атрибута contentEditable=true. Разберем, как этот механизм влияет на работу встроенного браузера.
Когда для тега <body> или любого другого родительского контейнера устанавливается режим редактирования, браузер (будь то Internet Explorer в старых версиях платформы или Chromium в новых) меняет приоритет обработки событий. Вместо выполнения стандартного действия для ссылки (переход по адресу), браузер ожидает, что пользователь хочет установить курсор в текст для его изменения. Посмотрим на код, который вызывает данную проблему:
Если Найти(ТекстПисьма, "<body") <> 0 Тогда
ТекстПисьма = СтрЗаменить(ТекстПисьма, "<body", "<body contentEditable=true");
Иначе
ТекстПисьма = СтрЗаменить(ТекстПисьма, "<html>", "<html><body contentEditable=true>");
ТекстПисьма = СтрЗаменить(ТекстПисьма, "</html>", "</body></html>");
КонецЕсли;
В данном случае платформа 1С интерпретирует клик как попытку редактирования содержимого. Чтобы ссылка сработала в таком режиме в обычном браузере, часто требуется зажать клавишу Ctrl, что совершенно неочевидно для конечного пользователя программы 1С.
Самый надежный и «чистый» способ заставить ссылки работать в 1С — это перехватить событие нажатия на уровне платформы и программно открыть нужный адрес. Это решение универсально и работает даже при включенном contentEditable.
Разберем реализацию этого метода по шагам:
ПриНажатии (или OnClick для обычных форм) и создадим соответствующую процедуру на клиенте.Проанализируем пример кода для управляемых форм:
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
// Получаем элемент, на который нажали
ТекущийЭлемент = ДанныеСобытия.Event.srcElement;
// Проверяем, является ли элемент ссылкой (тег "A")
// Или, возможно, нажали на картинку внутри ссылки
Пока ТекущийЭлемент <> Неопределено Цикл
Если ВРег(ТекущийЭлемент.tagName) = "A" Тогда
// Мы нашли ссылку! Предотвращаем стандартное поведение
СтандартнаяОбработка = Ложь;
// Получаем адрес из атрибута href
АдресСсылки = ТекущийЭлемент.href;
// Открываем ссылку в системном браузере
Если ЗначениеЗаполнено(АдресСсылки) Тогда
ЗапуститьПриложение(АдресСсылки);
КонецЕсли;
Прервать;
КонецЕсли;
// Поднимаемся выше по дереву DOM, если кликнули на вложенный элемент (например, img)
ТекущийЭлемент = ТекущийЭлемент.parentElement;
КонецЦикла;
КонецПроцедуры
Важный момент: использование метода ЗапуститьПриложение() позволяет открыть ссылку в браузере по умолчанию (например, Chrome или Firefox), установленном в операционной системе пользователя, а не внутри маленького окна 1С. Это значительно повышает удобство работы.
Если по каким-то причинам вы не хотите использовать обработчики событий платформы, можно встроить логику открытия ссылки непосредственно в HTML-код. Рассмотрим, как модифицировать формирование строки с картинкой-ссылкой.
Вместо стандартного тега <a href="...">, мы можем добавить обработчик события onclick, который будет принудительно открывать окно. Посмотрим на пример изменения кода:
ТекстHTML = "<a href=""#"" onclick=""window.open('" + СтруктураСоцсетей.Facebook + "'); return false;"">
|<img src=""" + ВложениеПутьFB + """></a>";
Однако стоит учитывать, что встроенные движки (особенно старый IE) могут блокировать всплывающие окна по соображениям безопасности. Поэтому первый способ с использованием 1С-события ПриНажатии считается более стабильным в среде 1С.
Выясним еще одну важную причину, по которой ссылки могут не открываться. Платформа 1С очень чувствительна к безопасности. Если в переменной СтруктураСоцсетей.Facebook хранится адрес без указания протокола (например, facebook.com вместо https://facebook.com), встроенный браузер может попытаться интерпретировать это как путь к локальному файлу.
Всегда проверяйте наличие префикса http:// или https:// в ваших ссылках. Рассмотрим вспомогательную функцию для нормализации ссылок:
Функция НормализоватьСсылку(Знач Ссылка)
Если Не СтрНачинаетсяС(НРег(Ссылка), "http") Тогда
Возврат "https://" + Ссылка;
КонецЕсли;
Возврат Ссылка;
КонецФункции
Поведение ссылок также сильно зависит от того, какой движок рендеринга использует ваша версия 1С. Проанализируем эти различия:
СтандартнаяОбработка = Ложь, если вы перехватываете нажатие программно.Для обеспечения максимальной совместимости рекомендуется использовать подход с программным перехватом события ПриНажатии и последующим вызовом ЗапуститьПриложение(). Это гарантирует, что ссылка откроется независимо от настроек безопасности встроенного браузера 1С и наличия атрибутов редактирования текста.
Подводя итог, отметим, что если ваша задача — создать интерактивное письмо или карточку с рабочими ссылками, но при этом сохранить возможность редактирования текста, всегда используйте программный перехват события клика. Это избавит вас от конфликтов с атрибутом contentEditable и обеспечит предсказуемое поведение интерфейса для пользователя.