(3) Да у меня нетривиальная задача. У меня в ЖР отключена детализация событий уровня "Информация", чтобы всякой чушью ЖР не засирало. Чего надо - я сам пишу по подпискам. Но вот с событием завершения сеанса нескладушечка вышла :)
У модуле управляемого приложения создается переменная, скажем МожноЗавершить.
В обработчике ПередЗавершениемРаботыСистемы проверяем переменную, если Истина, тогда возврат
Далее код, когда переменная не установлена:
Устанавливаем переменной = Истина, подключаем обработчик ожидания, и выставляем Отказ = Истина.
Уже в обработчике ожидания можно делать вызов сервера. Главное не забыть в нем снова вызвать завершение работы системы.
(7) Мелькнула мысль, но видать я ее недодумал. Ведь точно такой подход используется, если хочется задать асинхронный вопрос при записи объекта. Сейчас попробую.
Если параметру <Отказ> установлено значение Истина и <ТекстПредупреждения> содержит непустую строку, то окно сообщения с этой строкой будет выведено на экран и пользователю будет предложено на выбор - остаться или покинуть окно без сохранения данных.
Если параметру <Отказ> установлено значение Истина и <ТекстПредупреждения> содержит пустую строку, то пользователю будет отображено окно сообщения с общим текстом "Работа в данном окне не завершена" и предложено - остаться или покинуть окно без сохранения данных.
То есть диалог выхода выбрасывается в любом случае. И это происходит ДО срабатывания обработчика ожидания. В итоге получается два смешных сценария:
1) пользователь отказывается от выхода из программы, после этого срабатывает обработчик ожидания и происходит выход из программы :)
2) пользователь соглашается в выходом из программы и платформа уже не дает сработать обработчику ожидания :)
(15) Сделал через запись в текстовый файл в каталоге информационной базы. Работает только на файловых БД, но легко подправить под нужное:
Функция ЗаписатьИнформациюВКаталогеИнформационнойБазы(Информация, ИмяФайла = "info.txt") Экспорт
ПутьККаталогу = ПутьККаталогуФайловойИнформационнойБазы();
Если Не ЗначениеЗаполнено(ПутьККаталогу) Тогда
Возврат Ложь;
КонецЕсли;
ИмяФайла = СтрШаблон("%1\%2", ПутьККаталогу, ИмяФайла);
Файл = Новый ЗаписьТекста(ИмяФайла);
Файл.Записать(Информация);
Попытка
Файл.Закрыть();
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Функция ПолучитьИнформациюИзФайлаВКаталогеИнформационнойБазы(ИмяФайла = "info.txt") Экспорт
ПутьККаталогу = ПутьККаталогуФайловойИнформационнойБазы();
Если Не ЗначениеЗаполнено(ПутьККаталогу) Тогда
Возврат Ложь;
КонецЕсли;
ИмяФайла = СтрШаблон("%1\%2", ПутьККаталогу, ИмяФайла);
ТекстовыйФайл = Новый Файл(ИмяФайла);
Если ТекстовыйФайл.Существует() Тогда
Текст = Новый ЧтениеТекста(ИмяФайла);
Информация = Текст.Прочитать();
Возврат Информация;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ПутьККаталогуФайловойИнформационнойБазы() Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Если СтрНачинаетсяС(СтрокаСоединения, "File=") Тогда
Возврат Сред(СтрокаСоединения, 7, СтрДлина(СтрокаСоединения) - 8)
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
(1) почитай на сайте гилева как они формы переписывали.
У тебя ситуация такая же как допустим задать вопрос при закрытии 1С.
Т.е. если пользователь закрывает 1С, то вопрос не должен задаваться. Иначе будет ошибка пока он не сохранится и вопрос не будет задаваться.
(2) Слушай. А мне теперь вот интересно. Ок. Подстроились они под требования браузеров.
Но как-то же сама платформа пишет в ЖР событие завершения сеанса? Значит, как-то на сервере ловят это событие? Почему же тогда разрабов обделили, сволочи? :)
И в принципе, это логично. Браузер ведь по-идее не должен оставлять шансов страничке не подчиняться потугам пользователя ее закрыть :)
Остается вопрос, как все-таки платформа в этих условиях умудряется логировать завершение сеанса. Хотя вполне вероятно, что страничка перед смертью что-то такое асинхронно отсылает.
Может как-нибудь через объект HTTPСоединение отправить запрос/сообщение на веб-сервер, если он есть в рамках клиента. HTTPСоединение же живёт на клиенте.
Всем добрый вечер. Подскажите пожалуйста решение. Нужно чтобы при закрытии программы, выдавалось сообщение о том, действительно ли хочет выйти пользователь. Выдает ошибку данной темы. Ниже листинг обработки
Уважаемые товарищи! У меня идиотский вопрос от новичка!
Суть в том что хочется при закрытии формы или самой программы сохранять данные в регистр - вывод нам нужен Серверный вызов, а его нельзя. Нашел код, который призван решить проблему, я честно ничего не понял, как это работает.
В точках остановки система не срабатывает, не могу отладить/посмотреть чтобы понять.
Ну есть же Серверный вызов, а почему? Почему мы не останавливаемся на точках?
Ну т.е. реально ни вопроса ни сообщения - ничего не происходит, просто спокойно закрывается и всё.
&НаКлиенте
Перем ЕстьНесохраненныеДанные;
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
ЕстьНесохраненныеДанные = Ложь; //я задал значение просто ради интереса
Если ЕстьНесохраненныеДанные Тогда
Если Не ЗавершениеРаботы = Истина Тогда
СохранениеНесохраненныхДанныхНаСервере();
Иначе
Отказ = Истина;
ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!";
ПодключитьОбработчикОжидания("СохранениеНесохраненныхДанных", 1, Истина);
КонецЕсли
КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СохранениеНесохраненныхДанных() Экспорт
ЕстьНесохраненныеДанные = Ложь;
СохранениеНесохраненныхДанныхНаСервере();
КонецПроцедуры
&НаСервере
Процедура СохранениеНесохраненныхДанныхНаСервере()
Сообщить("Данные сохранены.");
КонецПроцедуры
(27) ну послушайте, какой-то код же исполняется? Что-то же происходит? В коде же написано:
Если Не ЗавершениеРаботы = Истина Тогда
СохранениеНесохраненныхДанныхНаСервере();
Иначе
Отказ = Истина;
ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!";
(29)Я сделаю вид что не читал "ответы", и попробую быть настойчивым.
&НаКлиенте
Перем ЕстьНесохраненныеДанные;
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
//ЕстьНесохраненныеДанные = ложь;
//Если ЕстьНесохраненныеДанные Тогда
Если Не ЗавершениеРаботы = Истина Тогда
СохранениеНесохраненныхДанныхНаСервере();
Иначе
Отказ = Истина;
ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!";
ПодключитьОбработчикОжидания("СохранениеНесохраненныхДанных", 1, Истина);
КонецЕсли
//КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СохранениеНесохраненныхДанных() Экспорт
ЕстьНесохраненныеДанные = Ложь;
СохранениеНесохраненныхДанныхНаСервере();
КонецПроцедуры
&НаСервере
Процедура СохранениеНесохраненныхДанныхНаСервере()
Сообщить("Данные сохранены.");
КонецПроцедуры
Показать
Вот теперь какие будут версии? Вопроса нет? А ну да ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!"; наверное же для красоты ? Или как?