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

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

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

Причина исчезновения сообщений при закрытии формы

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

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

  1. На сервере выполняется процедура проведения объекта. В процессе ее выполнения формируются сообщения для пользователя.
  2. Сервер передает результат проведения и сформированный массив сообщений на клиент.
  3. Если проведение завершилось без ошибок (параметр Отказ = Ложь), платформа незамедлительно закрывает окно формы.
  4. Вместе с уничтожением окна формы автоматически удаляются все привязанные к нему неблокирующие сообщения, из-за чего пользователь просто не успевает их прочитать.

Вариант 1. Использование системных оповещений (ПоказатьОповещениеПользователя)

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

Посмотрим на пример вызова данного метода на клиенте после завершения серверных процедур:


ПоказатьОповещениеПользователя(
	"Успешное проведение", 
	, 
	"Документ успешно проведен и обработан!", 
	КартинкаОповещенияПользователя.Информация
);

Вариант 2. Переопределение кнопки «Провести и закрыть»

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

Рассмотрим алгоритм действий по шагам:

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

Посмотрим, как может выглядеть код клиентского обработчика:


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

Вариант 3. Использование механизма оповещений (Оповестить)

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

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

Вариант 4. Привязка к основному окну или привязка через ИдентификаторНазначения

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

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


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Операция выполнена успешно!";
Сообщение.ИдентификаторНазначения = ИдентификаторЦелевойФормы;
Сообщение.Сообщить();

Также на клиенте можно обратиться к главному окну клиентского приложения через вызов ПолучитьОкна()[0] для перенаправления вывода в контекст основного интерфейса.

← На главную