Как управлять навигационными ссылками в формах 1С и перехватывать события перехода по ним?

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

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

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

Почему стандартные обработчики событий формы не работают?

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

Эти ссылки не являются элементами управления, которые инициируют события навигации в привычном понимании объектной модели формы. Это стандартные команды. Когда пользователь нажимает на такую ссылку, управление передается непосредственно ядру платформы, которое выполняет команду открытия формы списка связанного регистра с установленным отбором. Поскольку команда выполняется на уровне системы, она «пролетает» мимо обработчиков модуля текущей формы.

Проанализируем ситуацию: события ОбработкаНавигационнойСсылки предназначены для обработки переходов по URL-подобным ссылкам (например, в текстовых полях с типом «Форматированный документ»), а ОбработкаПерехода относится к навигации внутри вспомогательных окон или специфических механизмов, но не к командному интерфейсу формы.

Где настраивается видимость и состав ссылок?

Для управления составом ссылок в шапке формы нам необходимо обратиться к Командному интерфейсу. Рассмотрим процесс настройки по шагам:

  1. Откроем редактор формы нужного нам справочника или документа в конфигураторе.
  2. В нижней части окна редактора (под деревом элементов формы) перейдем на закладку «Командный интерфейс».
  3. В левой части окна мы увидим дерево доступных команд. Нас интересует раздел «Панель навигации». В нем выделены группы:
    • Важное (ссылки отображаются сразу после заголовка «Основное»).
    • Перейти (стандартные связи, включая те самые регистры с ведущими измерениями).
    • См. также (дополнительные ссылки, которые обычно скрыты под кнопкой «Еще» в панели навигации).
  4. В колонке «Видимость» мы можем включать или выключать отображение конкретных команд для различных ролей пользователей.

Если мы хотим полностью убрать автоматическую ссылку, достаточно снять флаг видимости в этом редакторе. Однако стоит помнить, что если в самом объекте (регистре) снята галочка «Использовать стандартные команды», ссылка пропадет из всех форм автоматически.

Как реализовать программную логику при нажатии на ссылку?

Поскольку перехватить нажатие на «родную» ссылку нельзя, мы применим обходной путь: заменим стандартную команду на пользовательскую. Проанализируем, как это сделать правильно.

Шаг 1. Отключение стандартной ссылки

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

Шаг 2. Создание собственной команды

Перейдем на закладку «Команды» в редакторе формы и создадим новую команду (например, ПереходКМоемуРегистру). Перетащим эту команду мышкой в раздел «Панель навигации» (в группу «Перейти») на той же закладке «Командный интерфейс».

Шаг 3. Написание обработчика

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

Рассмотрим пример кода для такого перехода:


&НаКлиенте
Процедура КомандаПереходКРегистру(Команда)
    
    // Выполняем произвольную логику перед переходом
    Если Объект.Модифицированность Тогда
        // Например, предупреждаем, что данные не сохранены
        ПоказатьВопрос(Новый ОписаниеОповещения("ЗавершитьПереход", ЭтотОбъект), 
            "Объект изменен. Сохранить изменения перед переходом?", РежимДиалогаВопрос.ДаНетОтмена);
        Возврат;
    КонецЕсли;
    
    ВыполнитьОткрытьФормуРегистра();
    
КонецПроцедуры

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

Альтернативный вариант: перехват в целевой форме

Если задача стоит не в том, чтобы остановить пользователя при нажатии на ссылку, а в том, чтобы выполнить код именно при открытии связанного списка (например, изменить заголовок или программно наложить дополнительные фильтры), то логику лучше перенести в форму списка регистра.

Когда платформа открывает форму по стандартной ссылке, она передает структуру Отбор в параметрах формы. Мы можем проанализировать эти параметры в обработчике ПриСозданииНаСервере формы списка регистра:


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

Особенности работы с расширениями конфигурации

Важно учитывать нюанс, связанный с расширениями. Если вы работаете в расширении и пытаетесь изменить командный интерфейс формы, которой нет в расширении (она заимствована без «тела»), вы не увидите настроек видимости команд. Чтобы управлять ссылками в расширении:

  1. Добавьте саму форму справочника в расширение.
  2. Добавьте объект-владелец и объект-регистр в расширение.
  3. Только после этого на закладке «Командный интерфейс» расширенной формы вам станут доступны настройки видимости стандартных команд.

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

← На главную