Как программно отключить стандартную обработку при нажатии на гиперссылку в 1С?

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

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

Разберем суть проблемы

Проанализируем ситуацию: разработчик создает элемент формы (декорацию или поле), устанавливает ему свойство Гиперссылка и через метод УстановитьДействие привязывает процедуру-обработчик. Однако внутри обработчика попытка написать СтандартнаяОбработка = Ложь либо не приводит к результату, либо вызывает ошибку. Выясним причину этого поведения. Основная ошибка кроется не в логике работы платформы, а в описании сигнатуры (заголовка) процедуры, которая назначается обработчиком.

Проанализируем механизм работы метода УстановитьДействие

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

Пошаговое решение: программное создание и настройка

Рассмотрим по шагам процесс создания гиперссылки на примере Поля формы (вид — Поле надписи), так как именно программный вывод элементов этого типа чаще всего требует подавления стандартного открытия ссылки.

Шаг 1. Создание элемента и назначение действия

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


// На сервере
НовыйЭлемент = Элементы.Добавить("ГиперссылкаКонтрагент", Тип("ПолеФормы"), ЭтаФорма);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
НовыйЭлемент.ПутьКДанным = "Объект.Контрагент"; // Предположим, там ссылка
НовыйЭлемент.Гиперссылка = Истина;

// Устанавливаем действие для события "Открытие"
НовыйЭлемент.УстановитьДействие("Открытие", "Подключаемый_ГиперссылкаОткрытие");

Шаг 2. Правильное описание процедуры-обработчика

Выясним, как должен выглядеть обработчик на клиенте. Самая важная деталь — наличие параметра СтандартнаяОбработка в скобках. Если его не добавить, вы не сможете сообщить системе, что стандартное действие выполнять не нужно.


&НаКлиенте
Процедура Подключаемый_ГиперссылкаОткрытие(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие карточки объекта
    СтандартнаяОбработка = Ложь;
    
    // Здесь пишем свою логику
    ПоказатьОповещениеПользователя("Вы нажали на программную ссылку!");
    
    // Например, можно открыть свою форму или выполнить расчет
    // ...
    
КонецПроцедуры

Различие между Декорацией и Полем формы

Важно различать типы элементов, так как состав параметров у них разный. Проанализируем ситуацию с ДекорацияФормы типа Надпись. У декорации основным событием является Нажатие.

  1. Если вы используете Декорацию (Надпись): событие Нажатие часто имеет только один параметр — (Элемент). У декораций нет встроенного «стандартного действия» по открытию ссылки, если не заполнено свойство НавигационнаяСсылка. Если же ссылка заполнена, платформа откроет ее автоматически.
  2. Если вы используете Поле формы (вид Поле надписи): здесь используется событие Открытие, которое штатно содержит параметры (Элемент, СтандартнаяОбработка).

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

Рассмотрим пример с использованием декорации

Если нам нужно программно создать простую текстовую гиперссылку (например, когда требуется программная работа с формами истории данных), которая не привязана к данным объекта, проанализируем следующий пример:


// Создаем декорацию-надпись
НоваяДекорация = Элементы.Добавить("МояСвободнаяСсылка", Тип("ДекорацияФормы"), ГруппаЭлементов);
НоваяДекорация.Вид = ВидДекорацииФормы.Надпись;
НоваяДекорация.Заголовок = "Нажми меня";
НоваяДекорация.Гиперссылка = Истина;

// Для декорации используем событие "Нажатие"
НоваяДекорация.УстановитьДействие("Нажатие", "Подключаемый_ОбработкаНажатияДекорации");

// На клиенте
&НаКлиенте
Процедура Подключаемый_ОбработкаНажатияДекорации(Элемент)
    // У декорации-надписи обычно нет параметра СтандартнаяОбработка, 
    // так как она сама по себе ничего не открывает без НавигационнойСсылки.
    Сообщить("Действие выполнено программно");
КонецПроцедуры

Типичные ошибки, которых следует избегать

Посмотрим на список моментов, из-за которых код может работать некорректно, и как модификатор форм помогает их избежать:

Итоги

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

← На главную