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