При разработке интерфейсов в 1С:Предприятии 8 часто возникает задача сделать текстовое поле интерактивным. Обычного текстового поля бывает недостаточно, и тогда на помощь приходит объект ФорматированныйДокумент. Однако программное управление его содержимым, особенно вставка «живых» гиперссылок, ведущих на карточки справочников или документов, имеет свои тонкости. В этой статье мы подробно разберем, как реализовать вставку ссылки в позицию курсора и обеспечим корректный переход по ней.
Рассмотрим ситуацию: у нас есть форма, на которой размещено поле типа ФорматированныйДокумент. Пользователь хочет нажать кнопку (например, «Добавить нормативный документ»), выбрать элемент из справочника, и чтобы в тексте документа в месте курсора появилась ссылка с названием этого элемента. При нажатии на эту ссылку должна открываться форма соответствующего объекта.
Для реализации этого функционала нам понадобятся следующие инструменты:
ФорматированныйДокумент и его коллекция элементов.ПолучитьГраницыВыделения() для определения позиции курсора.ПолучитьНавигационнуюСсылку() для создания внутреннего адреса объекта.НавигационнаяСсылка элемента текста.Прежде чем вставить текст, нам нужно получить уникальный адрес объекта в базе данных. 1С использует специальный формат ссылок вида e1cib/data/.... Чтобы сформировать такую строку правильно, мы должны выполнить код на стороне сервера.
Проанализируем пример функции, которая возвращает навигационную ссылку для конкретного объекта:
&НаСервере
Функция ПолучитьНавигационнуюСсылкуНаСервере(СсылкаНаОбъект)
// Возвращаем внутренний адрес объекта в формате 1С
Возврат ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);
КонецФункции
Важный момент: Если вы просто напишете текстовое представление ссылки, платформа может не распознать её как команду к открытию объекта и попытается открыть её через внешний браузер. Использование ПолучитьНавигационнуюСсылку() гарантирует корректность формата.
Теперь перейдем к клиентской части. Нам нужно определить, где в данный момент находится курсор пользователя, и вставить туда новый фрагмент текста, обладающий свойствами гиперссылки. Рассмотрим пошагово, как это сделать с помощью обращения к элементам управления формы.
&НаКлиенте
Процедура ДобавитьСсылкуВДокумент(ВыбранныйЭлемент)
// 1. Определяем границы выделения или позицию курсора
ПозицияНачала = 0;
ПозицияКонец = 0;
Элементы.ТекстДокумента.ПолучитьГраницыВыделения(ПозицияНачала, ПозицияКонец);
// 2. Получаем навигационную ссылку (адрес объекта) через сервер
АдресОбъекта = ПолучитьНавигационнуюСсылкуНаСервере(ВыбранныйЭлемент);
// 3. Вставляем новый текстовый элемент в документ
// Используем метод Вставить, указывая позицию, текст и тип элемента
НовыйФрагмент = Объект.ТекстДокумента.Вставить(ПозицияКонец,
ВыбранныйЭлемент.Наименование,
ТипЭлементаФорматированногоДокумента.Текст);
// 4. Назначаем свойство навигационной ссылки созданному объекту
НовыйФрагмент.НавигационнаяСсылка = АдресОбъекта;
// Опционально: можно задать цвет, чтобы ссылка выделялась визуально
// НовыйФрагмент.ЦветТекста = ЦветаСтиля.Гиперссылка;
КонецПроцедуры
В данном коде ТекстДокумента — это реквизит с типом ФорматированныйДокумент. Обратите внимание, что метод Вставить() возвращает объект типа ТекстФорматированногоДокумента, у которого мы и заполняем свойство НавигационнаяСсылка.
Выясним причину, по которой ссылки иногда могут «не срабатывать». В среде 1С:Предприятие ФорматированныйДокумент ведет себя иначе, чем обычная веб-страница. Рассмотрим основные нюансы:
Поле форматированного документа нет стандартного события, которое позволяло бы перехватить клик. Это ограничивает возможности кастомизации поведения ссылок.ТекстФорматированногоДокумента.Если стандартное поведение ФорматированногоДокумента (необходимость зажимать Ctrl, отсутствие обработки клика) не подходит для вашей задачи, разберем более продвинутый способ. Мы можем использовать связку ФорматированныйДокумент для хранения данных и Поле HTML-документа для их отображения.
Алгоритм действий будет следующим:
ФорматированныйДокумент, как было описано выше.ПолучитьHTML().Полем HTML-документа.ПриНажатии поля HTML-документа анализируем URL.Посмотрим на пример перехвата ссылки в HTML-поле:
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
URL = ДанныеСобытия.Href; // Получаем адрес ссылки
Если Найти(URL, "e1cib/data/") > 0 Тогда
СтандартнаяОбработка = Ложь; // Отменяем стандартный переход браузера
ПерейтиПоНавигационнойСсылке(URL); // Открываем карточку объекта 1С
КонецЕсли;
КонецПроцедуры
Этот метод позволяет создавать максимально дружелюбный интерфейс, где ссылки открываются обычным одиночным кликом без дополнительных клавиш.
Мы проанализировали ситуацию программного добавления ссылок и пришли к выводу, что наиболее простым и быстрым способом является использование метода Вставить() с заполнением свойства НавигационнаяСсылка. Однако для полноценных интерактивных систем лучше рассмотреть вариант с трансляцией содержимого в HTML, что даст полный контроль над событиями нажатия. При использовании любого из методов критически важно использовать функцию ПолучитьНавигационнуюСсылку() на сервере, чтобы ссылки соответствовали внутреннему стандарту платформы 1С.