Как открыть произвольную форму при нажатии на сообщение пользователю в 1С?

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

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

Почему стандартное СообщениеПользователю имеет ограничения?

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

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

Критическое ограничение: Если нам требуется открыть форму списка регистра сведений, в котором нужная запись еще не создана, свойство КлючДанных использовать невозможно, так как передавать нечего. Собственного клиентского события вроде "ПриНажатии" или "ПриАктивизацииСообщения" у объекта СообщениеПользователю во встроенном языке не существует. Перехватить сам клик по стандартному сообщению и запустить произвольный код встроенного языка напрямую нельзя.

Решение 1. Использование механизма оповещений и навигационных ссылок

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

Рассмотрим по шагам, как настроить открытие списка регистра сведений при нажатии на такое оповещение. Для этого мы сформируем стандартную навигационную ссылку на список регистра и передадим ее в параметры метода:


// Формируем навигационную ссылку на список нужного регистра сведений
НавигационнаяСсылка = "e1cib/list/РегистрСведений.ИмяВашегоРегистраСведений";

// Выводим оповещение пользователю
ПоказатьОповещениеПользователя(
    "Запись отсутствует", 
    НавигационнаяСсылка, 
    "Нажмите здесь, чтобы открыть список регистра и создать запись", 
    БиблиотекаКартинок.Информация, 
    СтатусОповещенияПользователя.Важное
);

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

Решение 2. Расширенная работа с навигационными ссылками и общими командами

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

Разберем этот процесс подробнее:

  1. Создадим в конфигураторе новую Общую команду (например, ОткрытьРегистрСОтбором).
  2. В модуле команды опишем клиентский обработчик, который будет принимать параметры перехода, анализировать их и программно открывать форму списка регистра с установленным отбором.
  3. Сформируем навигационную ссылку, указывающую на эту команду, и передадим параметры прямо в строке ссылки.

Пример формирования ссылки и вызова оповещения:


// Пример формирования ссылки на общую команду с параметрами
ПараметрыКоманды = "Номенклатура=" + СсылкаНаНоменклатуру.УникальныйИдентификатор();
НавигационнаяСсылка = "e1cib/command/ОбщаяКоманда.ОткрытьРегистрСОтбором?" + ПараметрыКоманды;

ПоказатьОповещениеПользователя(
    "Регистр не заполнен",
    НавигационнаяСсылка,
    "Кликните для настройки параметров",
    БиблиотекаКартинок.Важно
);

Решение 3. Глобальный перехват переходов в Библиотеке Стандартных Подсистем (БСП)

Если ваша конфигурация построена на базе БСП, у вас появляется еще более мощный инструмент — глобальный перехват любых переходов по навигационным ссылкам. Это позволяет выполнять абсолютно любой произвольный код на клиенте при клике на оповещение.

Для реализации этого подхода выполним следующие шаги:

  1. В общем модуле ОбщегоНазначенияКлиентПереопределяемый найдем процедуру ОбработкаПереходаПоНавигационнойСсылке.
  2. При вызове оповещения сформируем нестандартную (кастомную) навигационную ссылку, содержащую наш уникальный префикс, например: "my-app/open-register-filter?id=123".
  3. В процедуре-обработчике БСП напишем код перехвата этой ссылки. Разберем пример реализации:

Процедура ОбработкаПереходаПоНавигационнойСсылке(НавигационнаяСсылка, СтандартнаяОбработка) Экспорт
    
    // Проверяем, относится ли ссылка к нашему кастомному событию
    Если Найти(НавигационнаяСсылка, "my-app/open-register-filter") > 0 Тогда
        
        // Отменяем стандартную обработку платформы, чтобы избежать ошибки неверного формата ссылки
        СтандартнаяОбработка = Ложь;
        
        // Пишем произвольную логику: парсим параметры и открываем нужную форму
        ПараметрыФормы = Новый Структура;
        // Здесь может быть логика извлечения параметров из строки НавигационнаяСсылка
        
        ОткрытьФорму("РегистрСведений.ИмяВашегоРегистра.ФормаСписка", ПараметрыФормы);
        
    КонецЕсли;
    
КонецПроцедуры

Решение 4. Разработка собственной формы вывода уведомлений

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

Для реализации интерактивных кликов внутри такой формы эффективнее всего использовать элемент декорации с типом ФорматированнаяСтрока:

  1. Добавим на кастомную форму элемент декорации (вид — "Надпись").
  2. Свяжем ее с реквизитом типа ФорматированнаяСтрока. Это позволит нам форматировать текст и вставлять в него кликабельные гиперссылки.
  3. В событии декорации ОбработкаНавигационнойСсылки опишем код, который будет выполняться при нажатии пользователем на ссылку.

Посмотрим на пример заполнения форматированной строки на клиенте:


// Создаем текст сообщения с гиперссылкой
ЭлементыТекста = Новый Массив;
ЭлементыТекста.Добавить("Запись в регистре отсутствует. ");

// Добавляем кликабельную часть
ЭлементыТекста.Добавить(Новый ФорматированнаяСтрока("Открыть форму создания", , , , "action/open-register-form"));

// Присваиваем декорации на форме сформированную строку
Элементы.ДекорацияСообщение.Заголовок = Новый ФорматированнаяСтрока(ЭлементыТекста);

При клике на текст "Открыть форму создания" сработает следующее событие на форме:


&НаКлиенте
Процедура ДекорацияСообщениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
    
    Если НавигационнаяСсылка = "action/open-register-form" Тогда
        СтандартнаяОбработка = Ложь; // Отменяем стандартный переход в браузере
        
        // Выполняем произвольный код, открываем нужную форму
        ОткрытьФорму("РегистрСведений.ИмяВашегоРегистра.ФормаСписка");
    КонецЕсли;
    
КонецПроцедуры

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

← На главную