В карточках задач предусмотрена специальная область, в которой выводится описание задачи (информация, необходимая для выполнения задачи).
Потребовалось отображать внешние ссылки на форме в описании задачи, как обычные гиперссылки html в браузере, с блэкджеком и подсветкой при наведении и возможностью перехода по адресам ссылок. Решения тестировались на 1С:Предприятие 8.3 (8.3.23.1865) Документооборот 8 КОРП, редакция 2.1 (2.1.19.22)
На форумах нашёл много вопросов на эту тему, и два решения (далее - решения 1 и 2), опишу их ниже. Я их не стал использовать, т.к. в результате пришло «решение 3», которое показалось более изящным (опишу его ниже).
Решение 1: добавить форму задачи в расширение, добавить для отображения описания поле вида Поле HTML-документа (в оригинальной конфигурации описание выводится в виде Поле ввода, ПутьКДанным – Объект.Описание с типом Строка). Для отображения ссылок добавить тег <a href=http_адрес>текст ссылки</a>
Решение 2: Добавить на форму новый реквизит с типом ФорматированнаяСтрока, вывести его на форму (ей по умолчанию присвоится вид Поле надписи) и уже дальше поместить значение в этот реквизит.
Переход по ссылкам при этом выполняется прямо на форме задачи в нативном web-браузере, в котором навигация оставляет желать лучшего, например, переход назад или открыть в новом окне – неочевидны. Также не открываются ссылки на видео или на (например) внешние pdf документы.
Решение 3. Переопределение стандартных процедур формирования и вывода HTML в описании задач.
В строчное поле Объект.Описание можно добавлять теги для задания гиперссылок (как в варианте 1) в нотации HTML вида
<a href=https://мойсайт.ru>кликабельный текст</a>
Проблема в том, что при выводе этого поля 1С функцией ЗаменитьСпецСимволыHTML (из общего модуля РаботаС_HTML) подменяет спецсимволы «<» на < и т.д. Это позволяет избежать выполнения случайных директив, в т.ч. вредоносных, сохраненных в текстовом поле. В результате метатеги для гиперссылок воспринимаются при выводе формы как обычный текст и так и выводятся:
<a href=https:// мойсайт.ru>кликабельный текст</a>
За компоновку HTML-кода в описании задач отвечают два общих модуля:
- ОбзорЗадачВызовСервера (для формирования текста HTML)
- ОбзорЗадачВызовСервераПереопределяемый (для формирования текста HTML способом, отличающимся от стандартного)
Для того, чтобы теги ссылок не конвертировались в мнемокод, можно сделать следующее:
1. Добавляем в расширение из модуля ОбзорЗадачВызовСервера функции ПолучитьОбзорЗадачи и ПолучитьОбзорЗадачиДляСпискаЗадачиМне с директивой &Вместо
2. Копируем в эти функции код из одноименных функций общего модуля
3. Там, где нужны метатеги <a> меняем в тексте функции ПолучитьОбзорЗадачи строку
ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ОписаниеЗадачиHTML, "", Задача.Описание);
на
ОписаниеЗадачиHTML = Задача.Описание;
В тексте функции ПолучитьОбзорЗадачиДляСпискаЗадачиМне меняем строку
ОбзорОбъектовКлиентСервер.ДобавитьРеквизит(ПолноеОписаниеЗадачиHTML, "", СтрокаПолноеОписаниеЗадачи);
на
ПолноеОписаниеЗадачиHTML= СтрокаПолноеОписаниеЗадачи;
Другой способ:
- Снимаем с поддержки модули ОбзорЗадачВызовСервера и ОбзорЗадачВызовСервераПереопределяемый.
- Как в п. 2 предыдущего способа.
- Как в п. 3 предыдущего способа. Не забываем убрать в расширении из текста функций начальные строки. Из функции ПолучитьОбзорЗадачи убираем
HTMLТекст = ОбзорЗадачВызовСервераПереопределяемый.ПолучитьОбзорЗадачи(Задача);
Если ЗначениеЗаполнено(HTMLТекст) Тогда
Возврат HTMLТекст;
КонецЕсли;
Из функции ПолучитьОбзорЗадачиДляСпискаЗадачиМне убираем
HTMLТекст = ОбзорЗадачВызовСервераПереопределяемый.ПолучитьОбзорЗадачиДляСпискаЗадачиМне(РеквизитыЗадачи);
Если ЗначениеЗаполнено(HTMLТекст) Тогда
Возврат HTMLТекст;
КонецЕсли;
Запускаем сеанс и открываем форму. Видим в ней ссылочки, они подсвечиваются и меняется курсор при наведении. Но ссылки не кликабельные. А хочется, чтобы они открывались в приложении по умолчанию (в Хроме или в плеере, если это видео).
За поведение HTML-кода при нажатии гиперссылок в описании задач отвечают два общих модуля:
- ОбзорЗадачКлиент (процедуры обработки событий нажатия в поле формы)
- ОбзорЗадачКлиентПереопределяемый (соответственно, для обработки способом, отличающимся от стандартного)
Например, используем команду ПерейтиПоНавигационнойСсылке для обработки клика по ссылке
Если Лев(ДанныеСобытия.Href, 4) = "http" Тогда
НавигационнаяСсылкаПоля = ДанныеСобытия.Href;
#Если Клиент Тогда
ПерейтиПоНавигационнойСсылке(НавигационнаяСсылкаПоля);
#КонецЕсли
КонецЕсли;
Не забываем, что в ОбзорЗадачВызовСервераПереопределяемый функции должны возвращать Истина.
Вызов процедур на клиенте происходит при открытии карточки задачи или при перемещении по задачам в списке Задачи мне.
При выводе полей с текстовой информацией (без тегов ссылок или картинок) текст имеет смысл предварительно обработать при помощи функции РаботаС_HTML.ЗаменитьСпецСимволыHTML. Эта функция поможет избежать выполнения вредоносного кода, сохраненного в текстовом поле.