Почему не открываются ссылки в поле HTML документа 1С и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на платформе 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: Программная обработка события «ПриНажатии»

Самый надежный и «чистый» способ заставить ссылки работать в 1С — это перехватить событие нажатия на уровне платформы и программно открыть нужный адрес. Это решение универсально и работает даже при включенном contentEditable.

Разберем реализацию этого метода по шагам:

  1. Перейдем в свойства элемента формы Поле HTML документа.
  2. Найдем событие ПриНажатии (или OnClick для обычных форм) и создадим соответствующую процедуру на клиенте.
  3. Внутри обработчика проанализируем объект события, чтобы понять, на какой именно HTML-элемент нажал пользователь.

Проанализируем пример кода для управляемых форм:


&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    // Получаем элемент, на который нажали
    ТекущийЭлемент = ДанныеСобытия.Event.srcElement;
    
    // Проверяем, является ли элемент ссылкой (тег "A")
    // Или, возможно, нажали на картинку внутри ссылки
    Пока ТекущийЭлемент <> Неопределено Цикл
        
        Если ВРег(ТекущийЭлемент.tagName) = "A" Тогда
            // Мы нашли ссылку! Предотвращаем стандартное поведение
            СтандартнаяОбработка = Ложь;
            
            // Получаем адрес из атрибута href
            АдресСсылки = ТекущийЭлемент.href;
            
            // Открываем ссылку в системном браузере
            Если ЗначениеЗаполнено(АдресСсылки) Тогда
                ЗапуститьПриложение(АдресСсылки);
            КонецЕсли;
            
            Прервать;
        КонецЕсли;
        
        // Поднимаемся выше по дереву DOM, если кликнули на вложенный элемент (например, img)
        ТекущийЭлемент = ТекущийЭлемент.parentElement;
        
    КонецЦикла;

КонецПроцедуры

Важный момент: использование метода ЗапуститьПриложение() позволяет открыть ссылку в браузере по умолчанию (например, Chrome или Firefox), установленном в операционной системе пользователя, а не внутри маленького окна 1С. Это значительно повышает удобство работы.

Решение №2: Использование JavaScript внутри HTML-кода

Если по каким-то причинам вы не хотите использовать обработчики событий платформы, можно встроить логику открытия ссылки непосредственно в HTML-код. Рассмотрим, как модифицировать формирование строки с картинкой-ссылкой.

Вместо стандартного тега <a href="...">, мы можем добавить обработчик события onclick, который будет принудительно открывать окно. Посмотрим на пример изменения кода:


ТекстHTML = "<a href=""#"" onclick=""window.open('" + СтруктураСоцсетей.Facebook + "'); return false;"">
            |<img src=""" + ВложениеПутьFB + """></a>";

Однако стоит учитывать, что встроенные движки (особенно старый IE) могут блокировать всплывающие окна по соображениям безопасности. Поэтому первый способ с использованием 1С-события ПриНажатии считается более стабильным в среде 1С.

Решение №3: Проверка протоколов и безопасности

Выясним еще одну важную причину, по которой ссылки могут не открываться. Платформа 1С очень чувствительна к безопасности. Если в переменной СтруктураСоцсетей.Facebook хранится адрес без указания протокола (например, facebook.com вместо https://facebook.com), встроенный браузер может попытаться интерпретировать это как путь к локальному файлу.

Всегда проверяйте наличие префикса http:// или https:// в ваших ссылках. Рассмотрим вспомогательную функцию для нормализации ссылок:


Функция НормализоватьСсылку(Знач Ссылка)
    Если Не СтрНачинаетсяС(НРег(Ссылка), "http") Тогда
        Возврат "https://" + Ссылка;
    КонецЕсли;
    Возврат Ссылка;
КонецФункции

Особенности движков: Internet Explorer vs Chromium

Поведение ссылок также сильно зависит от того, какой движок рендеринга использует ваша версия 1С. Проанализируем эти различия:

Для обеспечения максимальной совместимости рекомендуется использовать подход с программным перехватом события ПриНажатии и последующим вызовом ЗапуститьПриложение(). Это гарантирует, что ссылка откроется независимо от настроек безопасности встроенного браузера 1С и наличия атрибутов редактирования текста.

Подводя итог, отметим, что если ваша задача — создать интерактивное письмо или карточку с рабочими ссылками, но при этом сохранить возможность редактирования текста, всегда используйте программный перехват события клика. Это избавит вас от конфликтов с атрибутом contentEditable и обеспечит предсказуемое поведение интерфейса для пользователя.

← На главную