При разработке интерфейсов в 1С часто требуется вывести форматированный блок текста с несколькими интерактивными ссылками, нажатие на которые должно запускать процедуры встроенного языка 1С. Рассмотрим типичные ошибки, возникающие при попытке связать HTML с кодом формы, проанализируем причины их возникновения и разберем проверенные способы реализации этой задачи.
Выясним причину, по которой попытка сформировать строку вида "<a href=" + НажатиеСсылки() + ">Текст</a>" не приводит к желаемому результату. В 1С выражение в строке вычисляется непосредственно в момент конкатенации, то есть функция НажатиеСсылки() отрабатывает сразу во время присвоения текста элементу формы, а в саму разметку подставляется возвращаемое значение функции.
Другая распространенная ошибка — попытка передать ссылку на форму в JavaScript через объектную модель MSHTML в обычных формах (толстый клиент):
Процедура ЗадачиСписокHTMLДокументСформирован(Элемент)
ЭлементыФормы.ЗадачиСписокHTML.Документ.parentWindow.SetForm1c(ЭтаФорма);
КонецПроцедуры
В этом случае платформа выдает исключение "Метод объекта не обнаружен (SetForm1c)" или ошибку о том, что объект не поддерживает свойство. В обычных формах контекст ЭтаФорма не экспортируется в среду выполнения скрипта страницы как доступный COM-объект. Кроме того, использование ссылок с пустым значением адреса (например, href="" или href=) провоцирует перезагрузку содержимого страницы браузером, из-за чего DOM-дерево и переменные JavaScript обнуляются.
Разберем рабочий и надежный вариант для обычных форм. Мы не будем пытаться передавать управление из браузера обратно в 1С через пользовательские функции JavaScript, а перехватим клик средствами самой платформы 1С.
В свойствах элемента управления ПолеHTMLДокумента присутствует событие onclick. Платформа передает в обработчик два параметра: сам элемент управления и объект события COM-модели pEvtObj. С помощью объекта pEvtObj можно точно определить, по какому DOM-узлу был совершен клик, прочитать его идентификатор или атрибуты, а также отменить стандартный переход по ссылке.
Разберем по шагам реализацию этого механизма:
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);
onclick:
Процедура ЗадачиСписокHTMLonclick(Элемент, pEvtObj)
// Отменяем стандартный переход браузера по ссылке
pEvtObj.returnValue = Ложь;
DOMЭлемент = pEvtObj.srcElement;
// Если клик пришелся на дочерний узел внутри ссылки, поднимаемся к родителю
Пока DOMЭлемент <> Неопределено И ВРег(DOMЭлемент.tagName) <> "A" Цикл
DOMЭлемент = DOMЭлемент.parentElement;
КонецЦикла;
Если DOMЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
// Анализируем идентификатор нажатой ссылки
ИмяСсылки = DOMЭлемент.id;
Если ИмяСсылки = "Link_Errors" Тогда
ОткрытьСписокОшибок();
ИначеЕсли ИмяСсылки = "Link_Warnings" Тогда
ОткрытьСписокПредупреждений();
КонецЕсли;
КонецПроцедуры
Если решение переносится на управляемые формы платформы 8.3, механизм меняется. Для элемента ПолеHTMLДокумента на клиенте используется событие ПриНажатии. В процедуру передаются параметры (Элемент, ДанныеСобытия, СтандартнаяОбработка).
Посмотрим на пример обработки:
&НаКлиенте
Процедура ЗадачиСписокHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если ТипЗнч(ДанныеСобытия) = Тип("ФиксированнаяСтруктура") Тогда
// Проверяем наличие элемента, по которому кликнули
Если ДанныеСобытия.Свойство("Href") И ЗначениеЗаполнено(ДанныеСобытия.Href) Тогда
СтандартнаяОбработка = Ложь;
Если Найти(ДанныеСобытия.Href, "action:errors") > 0 Тогда
ОткрытьСписокОшибок();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В ситуациях, когда требуется простая связка текста и одной-двух ссылок, интеграция с HTML-полем может быть избыточной. Проанализируем более легкие пути, не требующие работы с веб-движком:
Нажатие. При изменении текста ширину первой надписи можно регулировать программно.ОбработкаРасшифровки, где параметр СтандартнаяОбработка устанавливается в значение Ложь. Это дает полный контроль над стилизацией текста и ссылок в рамках встроенных механизмов платформы.