Как обработать нажатие на гиперссылку в поле HTML документа в 1С?

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

При разработке интерфейсов в 1С часто требуется вывести форматированный блок текста с несколькими интерактивными ссылками, нажатие на которые должно запускать процедуры встроенного языка 1С. Рассмотрим типичные ошибки, возникающие при попытке связать HTML с кодом формы, проанализируем причины их возникновения и разберем проверенные способы реализации этой задачи.

Почему не работает вызов процедур напрямую из HTML-кода

Выясним причину, по которой попытка сформировать строку вида "<a href=" + НажатиеСсылки() + ">Текст</a>" не приводит к желаемому результату. В 1С выражение в строке вычисляется непосредственно в момент конкатенации, то есть функция НажатиеСсылки() отрабатывает сразу во время присвоения текста элементу формы, а в саму разметку подставляется возвращаемое значение функции.

Другая распространенная ошибка — попытка передать ссылку на форму в JavaScript через объектную модель MSHTML в обычных формах (толстый клиент):


Процедура ЗадачиСписокHTMLДокументСформирован(Элемент)
    ЭлементыФормы.ЗадачиСписокHTML.Документ.parentWindow.SetForm1c(ЭтаФорма);
КонецПроцедуры

В этом случае платформа выдает исключение "Метод объекта не обнаружен (SetForm1c)" или ошибку о том, что объект не поддерживает свойство. В обычных формах контекст ЭтаФорма не экспортируется в среду выполнения скрипта страницы как доступный COM-объект. Кроме того, использование ссылок с пустым значением адреса (например, href="" или href=) провоцирует перезагрузку содержимого страницы браузером, из-за чего DOM-дерево и переменные JavaScript обнуляются.

Способ 1. Обработка клика через событие onclick поля HTML-документа

Разберем рабочий и надежный вариант для обычных форм. Мы не будем пытаться передавать управление из браузера обратно в 1С через пользовательские функции JavaScript, а перехватим клик средствами самой платформы 1С.

В свойствах элемента управления ПолеHTMLДокумента присутствует событие onclick. Платформа передает в обработчик два параметра: сам элемент управления и объект события COM-модели pEvtObj. С помощью объекта pEvtObj можно точно определить, по какому DOM-узлу был совершен клик, прочитать его идентификатор или атрибуты, а также отменить стандартный переход по ссылке.

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

  1. Сформируем HTML-разметку. Чтобы страница не перезагружалась, в ссылках укажем заглушку href="javascript:void(0)", а для идентификации действия назначим атрибут id:
    
    ТекстHTML = "
    |<html>
    |<body>
    |    Ошибки: <a id=""Link_Errors"" href=""javascript:void(0)"">" + КолвоОшибок + " шт.</a>
    |    <br>
    |    Предупреждения: <a id=""Link_Warnings"" href=""javascript:void(0)"">" + КолвоПредупреждений + " шт.</a>
    |</body>
    |</html>";
    
    ЭлементыФормы.ЗадачиСписокHTML.УстановитьТекст(ТекстHTML);
    
  2. В свойствах поля HTML назначим процедуру-обработчик для события onclick:
    
    Процедура ЗадачиСписокHTMLonclick(Элемент, pEvtObj)
        
        // Отменяем стандартный переход браузера по ссылке
        pEvtObj.returnValue = Ложь;
        
        DOMЭлемент = pEvtObj.srcElement;
        
        // Если клик пришелся на дочерний узел внутри ссылки, поднимаемся к родителю
        Пока DOMЭлемент <> Неопределено И ВРег(DOMЭлемент.tagName) <> "A" Цикл
            DOMЭлемент = DOMЭлемент.parentElement;
        КонецЦикла;
        
        Если DOMЭлемент = Неопределено Тогда
            Возврат;
        КонецЕсли;
        
        // Анализируем идентификатор нажатой ссылки
        ИмяСсылки = DOMЭлемент.id;
        
        Если ИмяСсылки = "Link_Errors" Тогда
            ОткрытьСписокОшибок();
        ИначеЕсли ИмяСсылки = "Link_Warnings" Тогда
            ОткрытьСписокПредупреждений();
        КонецЕсли;
        
    КонецПроцедуры
    

Способ 2. Особенности обработки кликов в управляемых формах

Если решение переносится на управляемые формы платформы 8.3, механизм меняется. Для элемента ПолеHTMLДокумента на клиенте используется событие ПриНажатии. В процедуру передаются параметры (Элемент, ДанныеСобытия, СтандартнаяОбработка).

Посмотрим на пример обработки:


&НаКлиенте
Процедура ЗадачиСписокHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеСобытия) = Тип("ФиксированнаяСтруктура") Тогда
        // Проверяем наличие элемента, по которому кликнули
        Если ДанныеСобытия.Свойство("Href") И ЗначениеЗаполнено(ДанныеСобытия.Href) Тогда
            СтандартнаяОбработка = Ложь;
            
            Если Найти(ДанныеСобытия.Href, "action:errors") > 0 Тогда
                ОткрытьСписокОшибок();
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Альтернатива с использованием элементов интерфейса 1С

В ситуациях, когда требуется простая связка текста и одной-двух ссылок, интеграция с HTML-полем может быть избыточной. Проанализируем более легкие пути, не требующие работы с веб-движком:

  1. Комбинация элементов «Надпись» (Декорация-Надпись): создадим статическую надпись для поясняющего текста, а рядом разместим вторую надпись, у которой в свойствах включен флаг Гиперссылка. Нажатие на нее перехватывается стандартным событием Нажатие. При изменении текста ширину первой надписи можно регулировать программно.
  2. Поле табличного документа: в форму встраивается компактная область табличного документа без заголовков строк и колонок. Для ячейки включается флаг Гиперссылка, в свойство ПараметрРасшифровки передается действие, а клик перехватывается стандартным событием ОбработкаРасшифровки, где параметр СтандартнаяОбработка устанавливается в значение Ложь. Это дает полный контроль над стилизацией текста и ссылок в рамках встроенных механизмов платформы.
← На главную