В процессе разработки в среде 1С:Предприятие часто возникает задача интерактивного взаимодействия с пользователем через систему уведомлений. Классический сценарий: система выводит сообщение о том, что некоторая запись в регистре сведений отсутствует, и пользователю необходимо сразу же открыть форму списка этого регистра для создания или анализа данных. Однако при использовании стандартного объекта СообщениеПользователю разработчики сталкиваются с жесткими платформенными ограничениями. В этой статье мы подробно разберем, почему стандартный механизм не всегда подходит, и рассмотрим эффективные альтернативные варианты решения этой задачи.
Объект СообщениеПользователю предназначен в первую очередь для связи выводимого диагностического сообщения с конкретным реквизитом формы или существующим объектом базы данных. Давайте проанализируем, как работает этот механизм на уровне платформы:
ПутьКДанным и Поле позволяют платформе определить, какой элемент на форме нужно активизировать (подсветить) при нажатии пользователем на сообщение в панели сообщений.КлючДанных принимает ссылку на существующий объект базы данных (например, документ или элемент справочника). При клике на сообщение система автоматически открывает основную форму этого объекта.Критическое ограничение: Если нам требуется открыть форму списка регистра сведений, в котором нужная запись еще не создана, свойство КлючДанных использовать невозможно, так как передавать нечего. Собственного клиентского события вроде "ПриНажатии" или "ПриАктивизацииСообщения" у объекта СообщениеПользователю во встроенном языке не существует. Перехватить сам клик по стандартному сообщению и запустить произвольный код встроенного языка напрямую нельзя.
Для реализации опционального открытия формы по клику пользователя отлично подходит метод ПоказатьОповещениеПользователя. Этот метод выводит всплывающее окно (слайд-оповещение) в правом нижнем углу экрана. В отличие от обычного сообщения, оно поддерживает работу с навигационными ссылками.
Рассмотрим по шагам, как настроить открытие списка регистра сведений при нажатии на такое оповещение. Для этого мы сформируем стандартную навигационную ссылку на список регистра и передадим ее в параметры метода:
// Формируем навигационную ссылку на список нужного регистра сведений
НавигационнаяСсылка = "e1cib/list/РегистрСведений.ИмяВашегоРегистраСведений";
// Выводим оповещение пользователю
ПоказатьОповещениеПользователя(
"Запись отсутствует",
НавигационнаяСсылка,
"Нажмите здесь, чтобы открыть список регистра и создать запись",
БиблиотекаКартинок.Информация,
СтатусОповещенияПользователя.Важное
);
При нажатии на такое оповещение платформа автоматически обработает навигационную ссылку и откроет форму списка указанного регистра. Этот способ является наиболее простым и не требует создания дополнительных форм.
Что делать, если простой переход к списку регистра не решает задачу полностью? Например, нам нужно не просто открыть список, а сразу передать туда параметры отбора (например, по номенклатуре или контрагенту), чтобы пользователь видел отфильтрованные данные. В таком случае мы можем использовать связку навигационной ссылки и общей команды.
Разберем этот процесс подробнее:
ОткрытьРегистрСОтбором).Пример формирования ссылки и вызова оповещения:
// Пример формирования ссылки на общую команду с параметрами
ПараметрыКоманды = "Номенклатура=" + СсылкаНаНоменклатуру.УникальныйИдентификатор();
НавигационнаяСсылка = "e1cib/command/ОбщаяКоманда.ОткрытьРегистрСОтбором?" + ПараметрыКоманды;
ПоказатьОповещениеПользователя(
"Регистр не заполнен",
НавигационнаяСсылка,
"Кликните для настройки параметров",
БиблиотекаКартинок.Важно
);
Если ваша конфигурация построена на базе БСП, у вас появляется еще более мощный инструмент — глобальный перехват любых переходов по навигационным ссылкам. Это позволяет выполнять абсолютно любой произвольный код на клиенте при клике на оповещение.
Для реализации этого подхода выполним следующие шаги:
ОбщегоНазначенияКлиентПереопределяемый найдем процедуру ОбработкаПереходаПоНавигационнойСсылке."my-app/open-register-filter?id=123".
Процедура ОбработкаПереходаПоНавигационнойСсылке(НавигационнаяСсылка, СтандартнаяОбработка) Экспорт
// Проверяем, относится ли ссылка к нашему кастомному событию
Если Найти(НавигационнаяСсылка, "my-app/open-register-filter") > 0 Тогда
// Отменяем стандартную обработку платформы, чтобы избежать ошибки неверного формата ссылки
СтандартнаяОбработка = Ложь;
// Пишем произвольную логику: парсим параметры и открываем нужную форму
ПараметрыФормы = Новый Структура;
// Здесь может быть логика извлечения параметров из строки НавигационнаяСсылка
ОткрытьФорму("РегистрСведений.ИмяВашегоРегистра.ФормаСписка", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Если вам требуется полный контроль над визуальным отображением и интерактивным поведением сообщений, правильным архитектурным решением будет отказ от стандартного вывода и создание собственной формы уведомлений. Этот подход позволяет выводить сообщения в виде удобной таблицы или панели внутри текущего рабочего места.
Для реализации интерактивных кликов внутри такой формы эффективнее всего использовать элемент декорации с типом ФорматированнаяСтрока:
ФорматированнаяСтрока. Это позволит нам форматировать текст и вставлять в него кликабельные гиперссылки.ОбработкаНавигационнойСсылки опишем код, который будет выполняться при нажатии пользователем на ссылку.Посмотрим на пример заполнения форматированной строки на клиенте:
// Создаем текст сообщения с гиперссылкой
ЭлементыТекста = Новый Массив;
ЭлементыТекста.Добавить("Запись в регистре отсутствует. ");
// Добавляем кликабельную часть
ЭлементыТекста.Добавить(Новый ФорматированнаяСтрока("Открыть форму создания", , , , "action/open-register-form"));
// Присваиваем декорации на форме сформированную строку
Элементы.ДекорацияСообщение.Заголовок = Новый ФорматированнаяСтрока(ЭлементыТекста);
При клике на текст "Открыть форму создания" сработает следующее событие на форме:
&НаКлиенте
Процедура ДекорацияСообщениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
Если НавигационнаяСсылка = "action/open-register-form" Тогда
СтандартнаяОбработка = Ложь; // Отменяем стандартный переход в браузере
// Выполняем произвольный код, открываем нужную форму
ОткрытьФорму("РегистрСведений.ИмяВашегоРегистра.ФормаСписка");
КонецЕсли;
КонецПроцедуры
Таким образом, комбинируя возможности платформы по работе с навигационными ссылками, общими командами и возможностями кастомизации форм, можно обойти любые ограничения стандартного объекта СообщениеПользователю и построить максимально удобный и отзывчивый интерфейс для конечных пользователей.