Как открыть форму 1С по гиперссылке из поля HTML-документа?

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

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

Почему прямая навигационная ссылка не срабатывает

Проанализируем типовую ошибку, с которой сталкиваются разработчики при первой реализации. Если указать стандартную навигационную ссылку платформы вида e1cib/list/Справочник.Валюты напрямую в атрибут ссылки, клик не приведет к желаемому результату:


<!-- Неправильно: браузер посчитает путь относительным -->
<a href="e1cib/list/Справочник.Валюты">Открыть список валют</a>

Встроенный браузер поля HTML-документа расценивает такое значение как относительный путь и пытается дополнить его базовым адресом текущей страницы (например, добавляя префикс about:blank или URL веб-сервера при работе в веб-клиенте). В итоге переход не происходит, либо отображается ошибка браузера.

Способ 1. Использование пользовательского протокола и навигационных ссылок

Разберем по шагам базовое решение. Чтобы платформа поняла, что ссылку необходимо перехватить и обработать внутри 1С, добавим к ссылке произвольный префикс протокола (например, v8doc:) и перехватим событие нажатия на стороне формы.

  1. Формируем HTML-код страницы. Указываем в параметре href навигационную ссылку с префиксом. Навигационную ссылку можно сформировать вручную по шаблону e1cib/list/... или получить программно через функцию ПолучитьНавигационнуюСсылку().

&НаСервере
Процедура ЗаполнитьHTML()
    ТекстHTML = "<html><body>"
        + "<p><a href=""v8doc:e1cib/list/РегистрСведений.Штрихкоды"">Регистр сведений: Штрихкоды</a></p>"
        + "<p><a href=""v8doc:e1cib/list/Справочник.Валюты"">Список валют</a></p>"
        + "</body></html>";
    
    // ПолеHTMLДокумента связано с реквизитом формы ТекстСтраницыHTML
    ТекстСтраницыHTML = ТекстHTML;
КонецПроцедуры
  1. Подключаем обработчик события элемента. В свойствах элемента формы ПолеHTMLДокумента находим событие ПриНажатии и создаем клиентскую процедуру.
  2. Обрабатываем нажатие ссылки. Извлекаем навигационную ссылку из свойства ДанныеСобытия.Href и открываем окно с помощью метода ПерейтиПоНавигационнойСсылке().

&НаКлиенте
Процедура СтраницаHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    // Проверяем, что клик совершен именно по ссылке
    Если ДанныеСобытия.Href = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПрефиксПротокола = "v8doc:";
    
    Если СтрНачинаетсяС(ДанныеСобытия.Href, ПрефиксПротокола) Тогда
        // Обязательно отменяем стандартное действие браузера
        СтандартнаяОбработка = Ложь;
        
        НавигационнаяСсылкаПоля = СтрЗаменить(ДанныеСобытия.Href, ПрефиксПротокола, "");
        
        // Декодируем строку, если браузер закодировал кириллические символы
        НавигационнаяСсылкаПоля = РаскодироватьСтроку(НавигационнаяСсылкаПоля, СпособКодированияСтроки.КодировкаURL);
        
        ПерейтиПоНавигационнойСсылке(НавигационнаяСсылкаПоля);
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: обратите внимание на строку СтандартнаяОбработка = Ложь;. Если не отключить стандартную обработку, движок браузера после завершения кода 1С выполнит переход по неизвестному протоколу v8doc:..., что приведет к показу страницы ошибки или пустого белого экрана внутри элемента управления.

Также важно учитывать, что браузер может выполнить URL-кодирование русских букв (процентирование). Применение функции РаскодироватьСтроку() исключает сбои при открытии метаданных с кириллическими именами.

Способ 2. Открытие форм через метод «ОткрытьФорму» по идентификатору ссылки

Метод ПерейтиПоНавигационнойСсылке() открывает объекты и списки только со стандартными параметрами. Если перед открытием формы требуется передать параметры (например, установить отбор, режим выбора или ключ уникальности), целесообразно использовать метод ОткрытьФорму().

Рассмотрим, как это реализовать, используя атрибуты тега ссылки:

  1. В HTML-коде указываем заглушку в качестве адреса ссылки (href="#"), а нужную команду или имя формы передаем в атрибуте id:

&НаСервере
Процедура СформироватьКомандныйHTML()
    ТекстСтраницыHTML = 
        "<html><body>"
        + "<p><a href=""#"" id=""ОткрытьВалюты"">Справочник ""Валюты""</a></p>"
        + "<p><a href=""#"" id=""ОткрытьПеремещения"">Журнал перемещений</a></p>"
        + "</body></html>";
КонецПроцедуры
  1. В обработчике ПриНажатии анализируем элемент, на который нажал пользователь:

&НаКлиенте
Процедура СтраницаHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    // Проверяем наличие элемента ссылки в событии
    Если ДанныеСобытия.Anchor = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ИдентификаторКоманды = ДанныеСобытия.Anchor.id;
    
    Если ИдентификаторКоманды = "ОткрытьВалюты" Тогда
        СтандартнаяОбработка = Ложь;
        
        ПараметрыФормы = Новый Структура;
        ОткрытьФорму("Справочник.Валюты.ФормаСписка", ПараметрыФормы, ЭтотОбъект);
        
    ИначеЕсли ИдентификаторКоманды = "ОткрытьПеремещения" Тогда
        СтандартнаяОбработка = Ложь;
        
        ОткрытьФорму("Документ.ПеремещениеТоваров.ФормаСписка", , ЭтотОбъект);
    КонецЕсли;
    
КонецПроцедуры

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

Ограничения и рекомендации по работе

При использовании поля HTML-документа необходимо помнить о нескольких платформенных особенностях:

  1. Клиентский контекст: команды открытия форм и навигации (ПерейтиПоНавигационнойСсылке, ОткрытьФорму) доступны только на клиенте директивой &НаКлиенте.
  2. Поведение в веб-клиенте: событие ПриНажатии гарантированно срабатывает при динамическом формировании текста документа внутри 1С. Если же в поле загружается внешний сайт со стороннего домена, политика безопасности браузера (Same-Origin Policy) заблокирует перехват событий клика платформенными средствами.
  3. Вложенные теги в ссылках: если внутри тега <a> присутствуют теги оформления (например, <b> или <span>), параметр ДанныеСобытия.Element будет указывать на внутренний тег, тогда как ДанныеСобытия.Anchor всегда возвращает родительский элемент ссылки, что делает обращение к Anchor более надежным.
← На главную