Правильный метод задать вопрос о закрытии формы
При закрытии формы обработки требуется задавать пользователю вопрос, действительно ли нужно закрыть форму. Сейчас это реализовано через обработчик события ПередЗакрытием() и реквизит формы типа Булево – пользователь пробует закрыть форму, обработчик смотрит в переменную, и если она Ложь – отменяет закрытие и задает пользователю вопрос. Если пользователь дает положительный ответ, реквизит формы устанавливается в Истина и форма принудительно закрывается через Закрыть(); в этот раз ПередЗакрытием() видит, что реквизит – Истина, и не блокирует закрытие.
Проблема в том, что эта схема мешает закрытию приложения, если пользователь закрывает не форму обработки отдельно, а все приложение целиком. При этом вызывается то же самое событие ПередЗакрытием(), которое, фактически, всегда отказывается закрывать форму. В итоге форма будет, конечно, закрыта, если пользователь положительно ответит на вопрос, но приложение уже не закроется, т.к. при первом прохождении через ПередЗакрытием() форма отказалась закрываться.
Стандартное поведение форм (например, при изменении данных справочника) более правильное – в них положительный ответ на вопрос о сохранении измененных данных приводит к закрытию приложения. Как добиться такого эффекта самостоятельно?
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Если Не ПодтвержденоЗакрытиеФормы Тогда
// Отменяем стандартное закрытие.
Отказ = Истина;
// Отображаем вопрос.
ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
ТекстВопроса = НСтр("ru = 'Закрыть рабочее место?'");
ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецЕсли;
КонецПроцедуры // ПередЗакрытием()
&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ПодтвержденоЗакрытиеФормы = Истина;
Закрыть();
КонецПроцедуры // ПередЗакрытиемЗавершение()
ПоказатьПроблема в том, что эта схема мешает закрытию приложения, если пользователь закрывает не форму обработки отдельно, а все приложение целиком. При этом вызывается то же самое событие ПередЗакрытием(), которое, фактически, всегда отказывается закрывать форму. В итоге форма будет, конечно, закрыта, если пользователь положительно ответит на вопрос, но приложение уже не закроется, т.к. при первом прохождении через ПередЗакрытием() форма отказалась закрываться.
Стандартное поведение форм (например, при изменении данных справочника) более правильное – в них положительный ответ на вопрос о сохранении измененных данных приводит к закрытию приложения. Как добиться такого эффекта самостоятельно?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) bytecoded, ну сделайте отдельно форму с вопросом и откройте ее модально
Нарисуйте 2 кнопки "Да" и "Нет":
для кнопки "Да" делаем обработчик
и для "Нет":
И дальше проверяете:
Если по крестику захочет закрыть, то что-то типа этого: создаем переменную и присваиваем ей Неопределено. Переводим ее в истину, если нажали "Да" и в ложь, если "Нет". Перед закрытием проверяем
ЗакрыватьРМ = МодальнаяФорма.Открыть();
Нарисуйте 2 кнопки "Да" и "Нет":
для кнопки "Да" делаем обработчик
ЭтаФорма.Закрыть(Истина);
и для "Нет":
ЭтаФорма.Закрыть(Ложь);
И дальше проверяете:
Если ЗакрыватьРМ = Неопределено Тогда //негодяй-пользователь закрыл форму крестиком, можете отдельно это обыграть
ИначеЕсли ЗакрыватьРМ Тогда
//пум-пурум-пу-пум
Иначе
//пам-парам-па-пам
КонецЕсли;
Если по крестику захочет закрыть, то что-то типа этого: создаем переменную и присваиваем ей Неопределено. Переводим ее в истину, если нажали "Да" и в ложь, если "Нет". Перед закрытием проверяем
Если НашаПеременная = Неопределено Тогда
Отказ = Истина;
Сообщить("Э-не, брат, меня не перехитришь!");
КонецЕсли;
По поводу модуля управляемого приложения нужно сделать ещё одно замечание. Возможно, вы захотите организовать немодальный диалог с пользователем в обработчике ПередНачаломРаботыСистемы. Так, чтобы до момента ответа пользователя не открывалось главное окно приложения. К сожалению, на момент написания статьи, такой возможности нет. И в этом случае вам придётся выбрать другую логику работы прикладного решения.
Другой сценарий, который является крайне нежелательным - это немодальный диалог в обработчике ПередЗавершениемРаботыСистемы. Во-первых потому, что в условиях веб-клиента браузеры очень негативно относятся к показу каких-либо сообщений при закрытии приложений и блокируют их. Во-вторых потому, что наличие такого диалога не позволит реализовать некоторые сценарии работы.
Например, в конфигурации есть форма, перед закрытием которой также задаётся вопрос пользователю в немодальном диалоге. Допустим, пользователь модифицировал данные в этой форме и, не сохраняя их, пытается закрыть всё приложение. В результате он ответит что-то в диалоге перед закрытием формы, форма закроется, но приложение останется открытым. Так происходит потому, что в немодальном диалоге перед закрытием формы сначала отменяется стандартная последовательность действий системы (см. пример). А это, в том числе, отменяет и закрытие самого приложения.
Получается, что пока никак не сделать. Хотя может я не в курсе.
Ошибка в ващем сообщеении:
ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
// Инициализируется "ОписаниеОповещения "
ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
// Потом используется"ОписаниеОповещенияОЗавершении"
ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект);
// Инициализируется "ОписаниеОповещения "
ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
// Потом используется"ОписаниеОповещенияОЗавершении"
Сейчас добавили параметр:
ПередЗакрытием(<Отказ>, <ЗавершениеРаботы>, <ТекстПредупреждения>, <СтандартнаяОбработка>)
<ЗавершениеРаботы>
Тип: Булево.
В данный параметр передается признак того, что форма закрывается в процессе завершения работы приложения:
Истина - если в процессе завершения приложения; Ложь - если закрывается только форма.
ПередЗакрытием(<Отказ>, <ЗавершениеРаботы>, <ТекстПредупреждения>, <СтандартнаяОбработка>)
<ЗавершениеРаботы>
Тип: Булево.
В данный параметр передается признак того, что форма закрывается в процессе завершения работы приложения:
Истина - если в процессе завершения приложения; Ложь - если закрывается только форма.
Попробовал аналогично ТС со всеми замечаниями, получилось вот так.
&НаКлиенте
Перем ПодтвержденоЗакрытиеФормы;
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Не ЗавершениеРаботы И Не ПодтвержденоЗакрытиеФормы И ЗначениеЗаполнено(Операция) Тогда
Отказ = Истина;
ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект),
СтрШаблон(НСтр("ru = 'Записан документ %1 Закрыть ?'"),Строка(Операция)),
РежимДиалогаВопрос.ДаНет,,,"Информация о создании документа");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЗавершение(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
ПодтвержденоЗакрытиеФормы = Истина;
Закрыть();
КонецЕсли;
КонецПроцедуры
ПодтвержденоЗакрытиеФормы = Ложь;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот