Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как по таймауту закрыть сессию 1с корректно (число прочтений - 12993 )
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #15 - 05. Августа 2008 :: 13:53
Печать  
artbear писал(а) 05. Августа 2008 :: 11:08:
Цитата:
ev-kov писал(а) 05. Августа 2008 :: 04:51:
Цитата:
Ну, тут можно с помощью FormEx же поставить автотаймер на окна предупреждений и вопросов.


Это как делается?

Извиняюсь... Помню, что делал, а сейчас найти не могу Печаль

Алексей, мы вроде с тобой это только планировали, но так и не реализовали Печаль

Я помню, что что-то на эту тему копал. Был уверен, что в релизе это тоже было. Похоже, что накопанное мое просто затерялось в куче остального.
  

FormEx developer
Наверх
www  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #16 - 06. Августа 2008 :: 05:51
Печать  
Так вот уважаемые.
Я ж это уже проходил.
И вопрос:
Записать документ : Да+Нет+Отмена
Это тот что вываливает 1С сама фиг вы как закроете.
А типа окно Поик по номеру
или Изменить время документа?
или Выбор штатного периода журнала?
Так что не сильно надейтесь на DynamicWrapper.
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #17 - 06. Августа 2008 :: 06:16
Печать  
varelchik писал(а) 06. Августа 2008 :: 05:51:
Так вот уважаемые.
Я ж это уже проходил.
И вопрос:
Записать документ : Да+Нет+Отмена
Это тот что вываливает 1С сама фиг вы как закроете.
А типа окно Поик по номеру
или Изменить время документа?
или Выбор штатного периода журнала?
Так что не сильно надейтесь на DynamicWrapper.

Кстати, окна, который ты перечислил, это окна одного класса #32770.
Так что для Алексея я думаю не составит труда добавить в метод ЗакрытьВсеОкна проверку наличия и закрытие окна этого класса.
Просим? Улыбка
  
Наверх
ICQ  
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #18 - 06. Августа 2008 :: 15:17
Печать  
Плохо проходил. Так как я писал вначале по

Рез=Wrap.SendMessage(хэндл_вопроса,wm_EndSession,1,0);

Оно все закрывает и сразу попробуй. Только хендл главного окна правильно получи. И компонента тут не причем она только апи функции выполняет
  
Наверх
 
IP записан
 
RinGo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Местоположение: г.Уфа
Зарегистрирован: 18. Декабря 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #19 - 13. Августа 2008 :: 13:38
Печать  
     
"...ЗЫ: любят у нас кадровики задерживаться и забывают закрыть окошки в 1с  и саму 1с,
          без модальных окон всё закрывается нормально"

Так вот, если вернуться к вопросу, с которого началась сия дискуссия, то можно предположить, что вероятность того, что забывчивый юзверь не удосужился ответить на вопрос a la "Записать документ : Да+Нет+Отмена" и убежал по своим делам, очень мала, но все же есть!
У себя перед тем, как вызвать процедуру закрытия всех окон(см. сообщение от 04.08.2008) эмулирую нажатие клавиши Esc, которая закрывает все эти окна вопросов... Кстати и окна, о которых  писал Varelchik("...А типа окно Поик по номеру или Изменить время документа? или Выбор штатного периода журнала? ), тоже:
....
Сервис.ЭмулироватьКлавиатуру("{Esc}");
адм_закрытьВсеОкна();
....
И все!... Пока не было случая, чтобы не сработало! Хотя у себя логах вижу, что через день ночером хотя бы одного юзверя вот-так принудиьельно "закрываю"!


  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #20 - 14. Августа 2008 :: 03:38
Печать  
RinGo писал(а) 13. Августа 2008 :: 13:38:
     
Сервис.ЭмулироватьКлавиатуру("{Esc}");
адм_закрытьВсеОкна();
....
И все!... Пока не было случая, чтобы не сработало! Хотя у себя логах вижу, что через день ночером хотя бы одного юзверя вот-так принудиьельно "закрываю"!



Сервис.ЭмулироватьКлавиатуру("{Esc}");  по идее должно закрыть модальное окно с каким либо вопросом, нужно добавить в свой глобальник тоже.

Хотя по своим логам вижу что уже закрывает ночью периодически.

ЗЫ: У одного манагера время неправильно стояло(его выгоняло посреди рабочего дня) Улыбка
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
RinGo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Местоположение: г.Уфа
Зарегистрирован: 18. Декабря 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #21 - 14. Августа 2008 :: 04:53
Печать  
"...ЗЫ: У одного манагера время неправильно стояло(его выгоняло посреди рабочего дня)"

Была такая проблема... Я решил ее так:

если адм_синхроДатыВремени <> 0 тогда
  если лев(каталогИБ(),2)="\\" тогда
     // ИБ - на другом компе ==> cинхронизация даты и времени с сервером БД
     катИБ=прав(каталогИБ(),стрДлина(каталогИБ())-2);
     поз=найти(катИБ,"\");
     серверБД=лев(катИБ,поз-1);
     WshShell=создатьОбъект("WScript.Shell");
     WshShell.Run("net time \\"+серверБД+" /SET /y",0); // 0 - WindowStyle: активизирует, но не отображает окно
   конецЕсли;
конецЕсли;

адм_синхроДатыВремени - задается у меня в параметрах системы...
И все!...
  
Наверх
 
IP записан
 
unnamed
Full Member
***
Отсутствует


0x1c = 28

Сообщений: 166
Местоположение: Chelyabinsk
Зарегистрирован: 01. Ноября 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #22 - 15. Августа 2008 :: 01:34
Печать  
не так все просто... если у нас в фоне/не активном окне 1с работает какой-то отчет, а проверка на необходимость выхода происходит в переодической обработкеожидания, ни один из методов не поможет... закрытие окон от RinGo - падает 1с с виндовой ошибкой, ESC и прочее, если 1с свернута/не в фокусе, посылать бессмысленно - уйдет в другое окно. Помогает только terminate Печаль.
Делу бы помогло, если бы работала функция формекса Окна.НаПереднийПлан(); - но она в этом случае не действует (тут на эту тему уже была ветка). Впрочем, как не действует и AppActivate из WSH (по достоверно полученному PIDу). Там вообще странно все происходит...
  
Наверх
ICQ  
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #23 - 15. Августа 2008 :: 01:47
Печать  
RinGo писал(а) 14. Августа 2008 :: 04:53:
"...ЗЫ: У одного манагера время неправильно стояло(его выгоняло посреди рабочего дня)"

Была такая проблема... Я решил ее так:

если адм_синхроДатыВремени <> 0 тогда
  если лев(каталогИБ(),2)="\\" тогда
     // ИБ - на другом компе ==> cинхронизация даты и времени с сервером БД
     катИБ=прав(каталогИБ(),стрДлина(каталогИБ())-2);
     поз=найти(катИБ,"\");
     серверБД=лев(катИБ,поз-1);
     WshShell=создатьОбъект("WScript.Shell");
     WshShell.Run("net time \\"+серверБД+" /SET /y",0); // 0 - WindowStyle: активизирует, но не отображает окно
   конецЕсли;
конецЕсли;

адм_синхроДатыВремени - задается у меня в параметрах системы...
И все!...


Забавные вещи происходят, если на клиенте стоит неверный часовой пояс, устанавливается не то время которое нужно, и как итог у юзверей по тпростою начинают закрываться всякие там окошки.
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #24 - 15. Августа 2008 :: 02:43
Печать  
Мда, от Сервис.ОбработкаОжидания() пришлось отказаться, поскольку глюки выползли неожиданно, оставил только штатную обработку ожидания
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #25 - 15. Августа 2008 :: 03:18
Печать  
Ringo Откуда грузишь Сервис.ОбработкаОжидания()  из доп или основного глобальника, какая версия формекс ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
RinGo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 26
Местоположение: г.Уфа
Зарегистрирован: 18. Декабря 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #26 - 15. Августа 2008 :: 05:58
Печать  
ev-kov писал(а) 15. Августа 2008 :: 03:18:
Ringo Откуда грузишь Сервис.ОбработкаОжидания()  из доп или основного глобальника, какая версия формекс ?


Из доп... FormEx всегда подгружаю последнюю, сейчас - 92-я...
  
Наверх
 
IP записан
 
unnamed
Full Member
***
Отсутствует


0x1c = 28

Сообщений: 166
Местоположение: Chelyabinsk
Зарегистрирован: 01. Ноября 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #27 - 15. Августа 2008 :: 06:46
Печать  
с Формексовской обработкой ожидания у меня все в порядке.

Все-таки самый универсальный метод описан Сергеем:

Код
Выбрать все
Рез=Wrap.PostMessage(хэндл_вопроса,WM_CLOSE,0,0); // Должен быть обязательно либо WM_CLOSE либо  ЗавершитьРаботуСистемы
 



даже этого одного хватает - далее 1с'кой уже все можно сделать, этот пост уже прерывает выполнение отчета, если какой-то отчет формируется. никаких дальше sendkey и appactivate не надо.

единственно - для его использования из 1с прийдется dynwrap.dll регить ;-(. в принципе, это обходится через РегистрироватьКомпонентыВ_HKCU, но есть еще одно но - не хочется искать хэндл окна 1с по заголовку... вот как нибудь на использование PIDа бы переделать...

UPD. А, нет.
Валится, отчет не был завершен нормально. по Wrap.PostMessage(handl,&H16,1,0) 1с завершает работу, конечно, без проблем,
но это фактически тот же terminate, который и по PIDу можно легко выполнить через обычный WHS Печаль, насколько я понимаю.
  
Наверх
ICQ  
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #28 - 01. Сентября 2008 :: 15:26
Печать  
Рез=Wrap.SendMessage(хэндл_вопроса,wm_EndSession,1,0)

Отличается от terminate тем  что 1с не выдает потом запрос на переиндексацию. Обратите внимание wm_EndSession нужно а не что другое!!!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать