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

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

При разработке интерфейсов в 1С:Предприятии 8 часто возникает задача сделать текстовое поле интерактивным. Обычного текстового поля бывает недостаточно, и тогда на помощь приходит объект ФорматированныйДокумент. Однако программное управление его содержимым, особенно вставка «живых» гиперссылок, ведущих на карточки справочников или документов, имеет свои тонкости. В этой статье мы подробно разберем, как реализовать вставку ссылки в позицию курсора и обеспечим корректный переход по ней.

Постановка задачи и выбор инструментов

Рассмотрим ситуацию: у нас есть форма, на которой размещено поле типа ФорматированныйДокумент. Пользователь хочет нажать кнопку (например, «Добавить нормативный документ»), выбрать элемент из справочника, и чтобы в тексте документа в месте курсора появилась ссылка с названием этого элемента. При нажатии на эту ссылку должна открываться форма соответствующего объекта.

Для реализации этого функционала нам понадобятся следующие инструменты:

  1. Объект ФорматированныйДокумент и его коллекция элементов.
  2. Метод ПолучитьГраницыВыделения() для определения позиции курсора.
  3. Функция ПолучитьНавигационнуюСсылку() для создания внутреннего адреса объекта.
  4. Свойство НавигационнаяСсылка элемента текста.

Шаг 1: Получение внутренней навигационной ссылки

Прежде чем вставить текст, нам нужно получить уникальный адрес объекта в базе данных. 1С использует специальный формат ссылок вида e1cib/data/.... Чтобы сформировать такую строку правильно, мы должны выполнить код на стороне сервера.

Проанализируем пример функции, которая возвращает навигационную ссылку для конкретного объекта:


&НаСервере
Функция ПолучитьНавигационнуюСсылкуНаСервере(СсылкаНаОбъект)
    // Возвращаем внутренний адрес объекта в формате 1С
    Возврат ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);
КонецФункции

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

Шаг 2: Программная вставка ссылки в текст

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


&НаКлиенте
Процедура ДобавитьСсылкуВДокумент(ВыбранныйЭлемент)
    
    // 1. Определяем границы выделения или позицию курсора
    ПозицияНачала = 0;
    ПозицияКонец = 0;
    Элементы.ТекстДокумента.ПолучитьГраницыВыделения(ПозицияНачала, ПозицияКонец);
    
    // 2. Получаем навигационную ссылку (адрес объекта) через сервер
    АдресОбъекта = ПолучитьНавигационнуюСсылкуНаСервере(ВыбранныйЭлемент);
    
    // 3. Вставляем новый текстовый элемент в документ
    // Используем метод Вставить, указывая позицию, текст и тип элемента
    НовыйФрагмент = Объект.ТекстДокумента.Вставить(ПозицияКонец, 
                                                ВыбранныйЭлемент.Наименование, 
                                                ТипЭлементаФорматированногоДокумента.Текст);
    
    // 4. Назначаем свойство навигационной ссылки созданному объекту
    НовыйФрагмент.НавигационнаяСсылка = АдресОбъекта;
    
    // Опционально: можно задать цвет, чтобы ссылка выделялась визуально
    // НовыйФрагмент.ЦветТекста = ЦветаСтиля.Гиперссылка;
    
КонецПроцедуры

В данном коде ТекстДокумента — это реквизит с типом ФорматированныйДокумент. Обратите внимание, что метод Вставить() возвращает объект типа ТекстФорматированногоДокумента, у которого мы и заполняем свойство НавигационнаяСсылка.

Анализ проблем и особенностей работы

Выясним причину, по которой ссылки иногда могут «не срабатывать». В среде 1С:Предприятие ФорматированныйДокумент ведет себя иначе, чем обычная веб-страница. Рассмотрим основные нюансы:

  1. Режим редактирования: Если поле доступно для редактирования, платформа блокирует случайные переходы по ссылкам. Чтобы ссылка «сработала» и открыла объект, пользователю необходимо удерживать клавишу Ctrl при клике мышью.
  2. Отсутствие события "ПриНажатии": У элемента формы Поле форматированного документа нет стандартного события, которое позволяло бы перехватить клик. Это ограничивает возможности кастомизации поведения ссылок.
  3. Визуальное оформление: Платформа не всегда автоматически подсвечивает программно вставленную ссылку синим цветом и подчеркиванием. Чтобы пользователь понял, что перед ним гиперссылка, рекомендуется явно устанавливать цвет текста через свойства возвращаемого объекта ТекстФорматированногоДокумента.

Альтернативный метод: Использование Поля HTML-документа

Если стандартное поведение ФорматированногоДокумента (необходимость зажимать Ctrl, отсутствие обработки клика) не подходит для вашей задачи, разберем более продвинутый способ. Мы можем использовать связку ФорматированныйДокумент для хранения данных и Поле HTML-документа для их отображения.

Алгоритм действий будет следующим:

Посмотрим на пример перехвата ссылки в HTML-поле:


&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    URL = ДанныеСобытия.Href; // Получаем адрес ссылки
    
    Если Найти(URL, "e1cib/data/") > 0 Тогда
        СтандартнаяОбработка = Ложь; // Отменяем стандартный переход браузера
        ПерейтиПоНавигационнойСсылке(URL); // Открываем карточку объекта 1С
    КонецЕсли;
    
КонецПроцедуры

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

Резюме

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

← На главную