В управляемом интерфейсе платформы 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда после проведения документа из формы по кнопке «Провести и закрыть» информационное сообщение, сформированное с помощью метода Сообщить() или объекта СообщениеПользователю, мгновенно исчезает вместе с закрывающимся окном. Разберем причинно-следственные связи этого поведения платформы и проанализируем доступные способы решения задачи.
Проанализируем поведение платформы на уровне механизмов управляемого интерфейса. По умолчанию методы вывода сообщений привязывают сформированное уведомление к контексту той формы, в которой было инициировано действие.
Когда пользователь нажимает стандартную кнопку «Провести и закрыть», происходит следующая последовательность событий:
Отказ = Ложь), платформа незамедлительно закрывает окно формы.Рассмотрим наиболее простой и наглядный способ информирования пользователя, который не зависит от жизненного цикла конкретной формы документа. Метод ПоказатьОповещениеПользователя() выводит всплывающее окно в правом нижнем углу экрана. Это окно остается видимым даже после того, как форма документа полностью закрылась, а само сообщение сохраняется в истории оповещений сеанса.
Посмотрим на пример вызова данного метода на клиенте после завершения серверных процедур:
ПоказатьОповещениеПользователя(
"Успешное проведение",
,
"Документ успешно проведен и обработан!",
КартинкаОповещенияПользователя.Информация
);
Разберем вариант, при котором стандартная команда формы заменяется пользовательской обработкой. В этом случае мы можем четко разграничить момент записи объекта и момент закрытия окна, а также управлять порядком вывода сообщений.
Рассмотрим алгоритм действий по шагам:
Закрыть().Посмотрим, как может выглядеть код клиентского обработчика:
&НаКлиенте
Процедура КомандаПровестиИЗакрыть(Команда)
// Выполняем запись и проведение документа
ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);
Если Записать(ПараметрыЗаписи) Тогда
// Закрываем текущую форму
Закрыть();
// Сообщение выводится после закрытия и привязывается к активному окну
Сообщить("Документ успешно проведен и закрыт.");
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда документ открывается из формы списка. В таком случае целесообразно передать информацию о результатах обработки обратно в форму списка с помощью метода Оповестить().
Оповестить("ОбработкаДокументаЗавершена", "Данные документа обновлены успешно.", ЭтотОбъект);
ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбработкаДокументаЗавершена" Тогда
Сообщить(Параметр);
КонецЕсли;
КонецПроцедуры
Рассмотрим возможности объекта СообщениеПользователю. У данного объекта предусмотрено свойство ИдентификаторНазначения, которое определяет УникальныйИдентификатор формы, к которой должно быть прикреплено сообщение.
Если требуется привязать сообщение к конкретному окну (например, к форме списка или к главному окну приложения), разработчик может передать УникальныйИдентификатор нужной формы на сервер и установить его в свойство сообщения:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Операция выполнена успешно!";
Сообщение.ИдентификаторНазначения = ИдентификаторЦелевойФормы;
Сообщение.Сообщить();
Также на клиенте можно обратиться к главному окну клиентского приложения через вызов ПолучитьОкна()[0] для перенаправления вывода в контекст основного интерфейса.