Серверные вызовы при завершении работы системы

1. herfis 499 14.06.19 16:31 Сейчас в теме
Это что же, с 8.3.8 сабж вообще никаким боком невозможно сделать? Даже если очень хочется? Не обойти никак?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. alex-l19041 8 14.06.19 16:35 Сейчас в теме
(1) а в чем возникла такая необходимость ?
6. herfis 499 14.06.19 16:48 Сейчас в теме
(3) Да у меня нетривиальная задача. У меня в ЖР отключена детализация событий уровня "Информация", чтобы всякой чушью ЖР не засирало. Чего надо - я сам пишу по подпискам. Но вот с событием завершения сеанса нескладушечка вышла :)
7. spacecraft 14.06.19 16:52 Сейчас в теме
(1) если очень хочется, то можно.

У модуле управляемого приложения создается переменная, скажем МожноЗавершить.

В обработчике ПередЗавершениемРаботыСистемы проверяем переменную, если Истина, тогда возврат
Далее код, когда переменная не установлена:
Устанавливаем переменной = Истина, подключаем обработчик ожидания, и выставляем Отказ = Истина.
Уже в обработчике ожидания можно делать вызов сервера. Главное не забыть в нем снова вызвать завершение работы системы.
8. herfis 499 14.06.19 16:54 Сейчас в теме
(7) Мелькнула мысль, но видать я ее недодумал. Ведь точно такой подход используется, если хочется задать асинхронный вопрос при записи объекта. Сейчас попробую.
9. spacecraft 14.06.19 16:55 Сейчас в теме
12. herfis 499 14.06.19 17:19 Сейчас в теме
(9) Хм... А ты пробовал? У меня не сростается.
Если параметру <Отказ> установлено значение Истина и <ТекстПредупреждения> содержит непустую строку, то окно сообщения с этой строкой будет выведено на экран и пользователю будет предложено на выбор - остаться или покинуть окно без сохранения данных.
Если параметру <Отказ> установлено значение Истина и <ТекстПредупреждения> содержит пустую строку, то пользователю будет отображено окно сообщения с общим текстом "Работа в данном окне не завершена" и предложено - остаться или покинуть окно без сохранения данных.

То есть диалог выхода выбрасывается в любом случае. И это происходит ДО срабатывания обработчика ожидания. В итоге получается два смешных сценария:
1) пользователь отказывается от выхода из программы, после этого срабатывает обработчик ожидания и происходит выход из программы :)
2) пользователь соглашается в выходом из программы и платформа уже не дает сработать обработчику ожидания :)
16. spacecraft 14.06.19 17:25 Сейчас в теме
(12) да, с вопросом засада. Но если продолжить работу... :)
10. SlavaKron 14.06.19 17:15 Сейчас в теме
(7) Это сработает только в том случае, если пользователь согласится продолжить работу
15. herfis 499 14.06.19 17:21 Сейчас в теме
(10) Именно. В общем, не выходит каменный цветок.
36. acces969 344 26.09.23 12:17 Сейчас в теме
(15) Сделал через запись в текстовый файл в каталоге информационной базы. Работает только на файловых БД, но легко подправить под нужное:

Функция ЗаписатьИнформациюВКаталогеИнформационнойБазы(Информация, ИмяФайла = "info.txt") Экспорт

	ПутьККаталогу = ПутьККаталогуФайловойИнформационнойБазы();	
	Если Не ЗначениеЗаполнено(ПутьККаталогу) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ИмяФайла = СтрШаблон("%1\%2", ПутьККаталогу, ИмяФайла);
	Файл = Новый ЗаписьТекста(ИмяФайла);
	Файл.Записать(Информация);
	
	Попытка	
		Файл.Закрыть();
		Возврат Истина;
	Исключение   
		Возврат Ложь;
	КонецПопытки;    
	
КонецФункции

Функция ПолучитьИнформациюИзФайлаВКаталогеИнформационнойБазы(ИмяФайла = "info.txt") Экспорт

	ПутьККаталогу = ПутьККаталогуФайловойИнформационнойБазы();	
	Если Не ЗначениеЗаполнено(ПутьККаталогу) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ИмяФайла = СтрШаблон("%1\%2", ПутьККаталогу, ИмяФайла);

	ТекстовыйФайл = Новый Файл(ИмяФайла);
	Если ТекстовыйФайл.Существует() Тогда 
		Текст = Новый ЧтениеТекста(ИмяФайла);
		Информация = Текст.Прочитать();
        Возврат Информация;
	Иначе
		Возврат Неопределено;
	КонецЕсли;    
	
КонецФункции

Функция ПутьККаталогуФайловойИнформационнойБазы() Экспорт
	
	СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
	Если СтрНачинаетсяС(СтрокаСоединения, "File=") Тогда
		Возврат Сред(СтрокаСоединения, 7, СтрДлина(СтрокаСоединения) - 8)	
	Иначе
		Возврат Неопределено;
	КонецЕсли;

КонецФункции
Показать
11. Xershi 1486 14.06.19 17:17 Сейчас в теме
(1) почитай на сайте гилева как они формы переписывали.
У тебя ситуация такая же как допустим задать вопрос при закрытии 1С.
Т.е. если пользователь закрывает 1С, то вопрос не должен задаваться. Иначе будет ошибка пока он не сохранится и вопрос не будет задаваться.
13. herfis 499 14.06.19 17:20 Сейчас в теме
(11) У меня другая ситуация. С вопросами все предельно ясно.
14. Xershi 1486 14.06.19 17:21 Сейчас в теме
(13) а это из той же песни.
2. VmvLer 14.06.19 16:34 Сейчас в теме
уже много лет это боль, такая боль...
5. herfis 499 14.06.19 16:41 Сейчас в теме
(2) Слушай. А мне теперь вот интересно. Ок. Подстроились они под требования браузеров.
Но как-то же сама платформа пишет в ЖР событие завершения сеанса? Значит, как-то на сервере ловят это событие? Почему же тогда разрабов обделили, сволочи? :)
4. rom2416 14.06.19 16:36 Сейчас в теме
увы, но никак(( Все типовые конфигурации были избавлены от серверных вызовов при завершении системы...
17. herfis 499 14.06.19 17:27 Сейчас в теме
Ну вот. А я уже почти обрадовался.
19. spacecraft 14.06.19 18:23 Сейчас в теме
22. herfis 499 18.06.19 08:59 Сейчас в теме
(19)(21) Спасибо. Как вариант. Если прижмет - воспользуюсь. Пока что овчинка выделки не стоит.
18. herfis 499 14.06.19 17:35 Сейчас в теме
И в принципе, это логично. Браузер ведь по-идее не должен оставлять шансов страничке не подчиняться потугам пользователя ее закрыть :)
Остается вопрос, как все-таки платформа в этих условиях умудряется логировать завершение сеанса. Хотя вполне вероятно, что страничка перед смертью что-то такое асинхронно отсылает.
20. SlavaKron 14.06.19 19:15 Сейчас в теме
Может как-нибудь через объект HTTPСоединение отправить запрос/сообщение на веб-сервер, если он есть в рамках клиента. HTTPСоединение же живёт на клиенте.
21. SlavaKron 15.06.19 16:23 Сейчас в теме
Вот такая конструкция работает у меня локально, если создать простой HTTP-сервис с POST методом:
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
	HTTP = Новый HTTPСоединение("localhost",80,,,,,,Ложь);	
	ЗапросHTTP = Новый HTTPЗапрос("Test/hs/OnClose/PostCloseInfo");
	ОтветHTTP = HTTP.ОтправитьДляОбработки(ЗапросHTTP);
КонецПроцедуры
Прикрепленные файлы:
lexiff; baklagun; starik-2005; user1069058; user797130; Andreyyy; +6 Ответить
23. user1299630 19.07.20 20:49 Сейчас в теме
Всем добрый вечер. Подскажите пожалуйста решение. Нужно чтобы при закрытии программы, выдавалось сообщение о том, действительно ли хочет выйти пользователь. Выдает ошибку данной темы. Ниже листинг обработки

Модуль приложения:
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Отказ = ОткрытьФорму("ОбщаяФорма.ДиалогЗакрытия");
КонецПроцедуры

Общая форма:
&НаКлиенте
Процедура Cancel(Команда)
ЭтотОбъект.Закрыть(истина);
КонецПроцедуры

&НаКлиенте
Процедура Ok(Команда)
ЭтотОбъект.Закрыть(ложь);
КонецПроцедуры
24. herfis 499 20.07.20 14:58 Сейчас в теме
(23)
Процедура ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
	
	Отказ = Истина;
	ТекстПредупреждения = "Вы уверены, что хотите завершить работу 1С?";

КонецПроцедуры
25. user1299630 20.07.20 17:44 Сейчас в теме
(24)
, ТекстПредупреждения


Большое спасибо, очень помогли.
26. Cheid 11.03.23 22:34 Сейчас в теме
Уважаемые товарищи! У меня идиотский вопрос от новичка!
Суть в том что хочется при закрытии формы или самой программы сохранять данные в регистр - вывод нам нужен Серверный вызов, а его нельзя. Нашел код, который призван решить проблему, я честно ничего не понял, как это работает.
В точках остановки система не срабатывает, не могу отладить/посмотреть чтобы понять.
Ну есть же Серверный вызов, а почему? Почему мы не останавливаемся на точках?
Ну т.е. реально ни вопроса ни сообщения - ничего не происходит, просто спокойно закрывается и всё.

&НаКлиенте
Перем ЕстьНесохраненныеДанные;

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	ЕстьНесохраненныеДанные = Ложь; //я задал значение просто ради интереса
	Если ЕстьНесохраненныеДанные Тогда
      Если Не ЗавершениеРаботы = Истина Тогда
          СохранениеНесохраненныхДанныхНаСервере();
      Иначе
           Отказ = Истина;
           ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!";
           ПодключитьОбработчикОжидания("СохранениеНесохраненныхДанных", 1, Истина);
       КонецЕсли
  КонецЕсли
КонецПроцедуры
 
&НаКлиенте
Процедура СохранениеНесохраненныхДанных() Экспорт
    ЕстьНесохраненныеДанные = Ложь;
    СохранениеНесохраненныхДанныхНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура СохранениеНесохраненныхДанныхНаСервере()
    Сообщить("Данные сохранены.");
КонецПроцедуры
Показать
27. пользователь 11.03.23 23:09
Сообщение было скрыто модератором.
...
28. Cheid 11.03.23 23:11 Сейчас в теме
(27) ну послушайте, какой-то код же исполняется? Что-то же происходит? В коде же написано:

Если Не ЗавершениеРаботы = Истина Тогда
          СохранениеНесохраненныхДанныхНаСервере();
      Иначе
           Отказ = Истина;
           ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!";


Где это всё?!?!?
29. пользователь 11.03.23 23:14
Сообщение было скрыто модератором.
...
30. Cheid 11.03.23 23:27 Сейчас в теме
(29) да господи, я их закомментирую и ничего не изменится, можно как-то по сути вопроса ответить?
П.С. я их закомментировал и знаю о чем говорю
31. пользователь 11.03.23 23:30
Сообщение было скрыто модератором.
...
32. Cheid 11.03.23 23:37 Сейчас в теме
(29)Я сделаю вид что не читал "ответы", и попробую быть настойчивым.
&НаКлиенте
Перем ЕстьНесохраненныеДанные;

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


Вот теперь какие будут версии? Вопроса нет? А ну да ТекстПредупреждения = "Закрытие формы приведёт к потере несохранённых данных!"; наверное же для красоты ? Или как?
33. пользователь 11.03.23 23:41
Сообщение было скрыто модератором.
...
34. Cheid 11.03.23 23:48 Сейчас в теме
(33)а можно конкретики добавить? Почему серверный вызов есть - ошибки нет? И почему мы в сам обработчик события "не попадаем"?
35. пользователь 11.03.23 23:49
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот