Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как по таймауту закрыть сессию 1с корректно (число прочтений - 12979 )
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Как по таймауту закрыть сессию 1с корректно
01. Августа 2008 :: 03:16
Печать  
Вопрос избитый, но всё же. Таймаут  можно задать через Сервис.ОбработкаОжидания. Но как правильно закрыть такое (ВНИМАНИЕ ТЕСТОВЫЙ СЛУЧАЙ) например в комплексной открываем форму элемента справочника сотрудники из которой открыли модальное окно физлица(кнопочка O), а из которого делают подбор адреса (кнопочка ввод адреса регистрации) .

Пробовал делать двумя способами, ни один не работает Formex 91 билд

1 способ
Код
Выбрать все
//[+] ev-kov@2008.04.30 08:40
Процедура Таймер()
	Перем час,мин_,сек;
    
	ПрошлоВремени = Информатор.ПолучитьВремяПростояСистемы();


	Если ПрошлоВремени/1000 > 1 Тогда  // 1 час  = 360000

			//{ закроем все окна
			Окно = СоздатьОбъект("Окна");
			Окно.ЗакрытьВсеОкна();

			//}

			ЗавершитьРаботуСистемы(0);
	КонецЕсли  
КонецПроцедуры//[+]_ 



2 способ
Код
Выбрать все
//[+] ev-kov@2008.04.30 08:40
Процедура Таймер()
	Перем час,мин_,сек;
    
	ПрошлоВремени = Информатор.ПолучитьВремяПростояСистемы();


	Если ПрошлоВремени/1000 > 1 Тогда  // 1 час  = 360000

			//{ закроем все формы, в том числе модальные
			ОткрытыеОкна = _Сервис.СписокВсехОткрытыхОкон();
			Расш = СоздатьОбъект("РасширениеФормы");
			Для ъ=1 По ОткрытыеОкна.РазмерСписка() Цикл
				Расш.УстановитьФорму(ОткрытыеОкна.ПолучитьЗначение(ъ,).Форма);
				Расш.Закрыть();
			КонецЦикла;
			//}

			ЗавершитьРаботуСистемы(0);
	КонецЕсли  
КонецПроцедуры//[+]_ 




1 способ закрывает окно ввода адреса, далее 1с начинае "моргать в статус" типа что то усиленно делает и тормозит, итог закрытия сессии нет

2 способ закрывает окно элемента справочника сотрудники, но модальное окно и подбор не закрываются, итог закрытия сессии нет

Попробовал скомбинировать сначала отрабатывал 2-й способ потом 1-й, в итоге осталось не закрытым только модальное окно физлица, 1с зависла в бесконечном цикле в попытках его закрыть (белый экран 1с)

Посоветуйте как правильно закрыть в вышеуказанном тестовом случае набор этих окон

ЗЫ: любят у нас кадровики задерживаться и забывают закрыть окошки в 1с  и саму 1с,
без модальных окон всё закрывается нормально

  

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



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

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #2 - 01. Августа 2008 :: 06:39
Печать  
Попробуй так:
Код
Выбрать все
Для ъ=1 По ОткрытыеОкна.РазмерСписка() Цикл
	ОткрытыеОкна.ПолучитьЗначение(ъ,).Форма.Закрыть(0);
КонецЦикла;
 

  

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


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #3 - 03. Августа 2008 :: 21:35
Печать  
Код
Выбрать все
Функция Закрыть1С() Экспорт// Нужно выполнить действия при завершении работы системы
	Wrap = CreateObject("DynamicWrapper");
	Мат=СоздатьОбъект("Math");
	Wrap.Register("USER32.DLL", "PostMessage","i=llll", "f=s", "r=l");
	Wrap.Register("USER32.DLL", "FindWindow","i=ls", "f=s", "r=l");
	WM_CLOSE = Мат.Long("0x10");// Обычное закрытие со всеми вопросами
	wm_EndSession=Мат.Long("0x16");//Нужен Wparam Не выполняет ПриЗавершении работы системы Программу закрывает корректно
	Стр="1С:Предприятие - Управленческий учет: "+ЗаголовокСистемы();
	//Сообщить(Стр);
	хэндл_вопроса=Wrap.FindWindow(0,СТр);
	Рез=Wrap.PostMessage(хэндл_вопроса,WM_CLOSE,0,0); // Должен быть обязательно либо WM_CLOSE либо  ЗавершитьРаботуСистемы
	Рез=Wrap.PostMessage(хэндл_вопроса,wm_EndSession,1,0);//Нужен Wparam Не выполняет ПриЗавершении работы системы

КонецФункции 



Попробуй так . у меня работает .Нужен dynwrap.dll. Не выполняет ПриЗавершенииработысистемы. Подходит также если в ней вываливается вопрос "Хотите завершить работу?"
  
Наверх
 
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

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

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



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #5 - 04. Августа 2008 :: 03:42
Печать  
Цитата:
Попробуй так:
Код
Выбрать все
Для ъ=1 По ОткрытыеОкна.РазмерСписка() Цикл
	ОткрытыеОкна.ПолучитьЗначение(ъ,).Форма.Закрыть(0);
КонецЦикла;
 


Издеваешься, Форма.Закрыть(0) на модальные никак не действует, проверил на всякий пожарный, ни одно из трёх окон не закрыло
  

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


I Love YaBB 2!

Сообщений: 26
Местоположение: г.Уфа
Зарегистрирован: 18. Декабря 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #6 - 04. Августа 2008 :: 04:35
Печать  
Я делаю так:
//
//****************************
//
процедура адм_закрытьВсеОкна()
 //
 перем Конт;
 //
 // адд_ОФ.закрытьВсеОкна(0); - не срабатывает при открытом/тых модальном/ных окне/окнах==>такое решение
 // (единственное, что не смог пока побороть: если выполняется обработка, то 1С вываливается, что, в принципе,
 // устраивает - закончить сеанс 1С; другое дело, если обработка выполняется в форме, открытой модально:
 // форма закрывается, но обработка не прерывается...
 //
 аддСФ=создатьОбъект("Сервис");
 аддРФ=создатьОбъект("РасширениеФормы");
 аддОФ=создатьОбъект("Окна");
 //
 окнаСЗ=аддСФ.списокВсехОткрытыхОкон();
 если окнаСЗ.размерСписка() > 0 тогда
    Конт="";
    Окно=сокрЛП(окнаСЗ.получитьЗначение(1,Конт));
    если Окно="Таблица" тогда
       // Таблица не является контекстным окном, но и не модальное
       аддОФ.закрытьВсеОкна(0);
       возврат;
    конецЕсли;
 конецЕсли;
 //
 Конт="";
 пока 1=1 цикл
    если аддСФ.активныйКонтекст(Конт)=0 тогда
       прервать;
    конецЕсли;
    если Конт.Форма.модальныйРежим()=1 тогда
           попытка
         аддРФ.установитьФорму(Конт.Форма);
         аддРФ.Закрыть();
               исключение
                   аддРФ.Закрыть();
          конецПопытки;
       иначе
          аддОФ.закрытьВсеОкна(0);
          прервать;
    конецЕсли;
 конецЦикла;
 //
конецПроцедуры
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #7 - 04. Августа 2008 :: 08:41
Печать  
Sergey
dynwrap.dll надо регать на клиенте, не всегда он там зареган ...


RinGo
вроде нормально отработал на тестовом примере, интересно нет ли случаев где этот метод не пройдёт, а так  вариант вполне работоспособен?
  

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


I Love YaBB 2!

Сообщений: 26
Местоположение: г.Уфа
Зарегистрирован: 18. Декабря 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #8 - 04. Августа 2008 :: 09:12
Печать  
RinGo
вроде нормально отработал на тестовом примере, интересно нет ли случаев где этот метод не пройдёт, а так  вариант вполне работоспособен?
[/quote]

Вполне работоспособна!
Как и у всех была проблема с забывчивыми юзверями, из-за которых ночером не копировалась база... Или опять-таки предупредишь всех, чтобы, скажем, в обед все вышли из сессии 1С, но... Теперь мы просто прописываем перечень регламентных работ и время их проведения... При входе в систему этот перечень сканируется, выводится соотв-ее сообщение, типа: "Внимание! Сегодня с .. по .. будут проводиться такие-то регламентные работы!"... Включается ОбработкаОжидания() на проверку этого диапазона, за Х минут с переодичностью Y выводится напоминание, и, если все-таки забыли - сеанс автлматически закрывается... Как раз перед закрытием сеанса и отрабатывает эта процедурка - адм_закрытьВсеОкна()... А на ночное копирование мы еще и выключаем "забытый" комп (через ShutDown)! А при следующем входе в систему забывчивому пользователю - сообщение, типа - "Ай-яй-яй!,,,"
  
Наверх
 
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #9 - 04. Августа 2008 :: 17:51
Печать  
Пример не понял. А если будет окно сервис-параметры открыто. А если в ПриЗавершенииРаботыСистемы будет вопрос  Закрыть или нет
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #10 - 04. Августа 2008 :: 19:03
Печать  
Цитата:
Пример не понял. А если будет окно сервис-параметры открыто. А если в ПриЗавершенииРаботыСистемы будет вопрос  Закрыть или нет


Ну, тут можно с помощью FormEx же поставить автотаймер на окна предупреждений и вопросов.
  

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


I Love YaBB 2!

Сообщений: 26
Местоположение: г.Уфа
Зарегистрирован: 18. Декабря 2007
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #11 - 05. Августа 2008 :: 02:52
Печать  
Пример не понял. А если будет окно сервис-параметры открыто. А если в ПриЗавершенииРаботыСистемы будет вопрос  Закрыть или нет

Процедура ПриЗавершенииРаботыСистемы()
   если завершитьРаботуБезВопросов=0 тогда
       если вопрос("Завершить работу?","Да+Нет")="Нет" тогда
                  статусВозврата(0);
               иначе
         ....
       конецЕсли;
   конецЕсли;
КонецПроцедуры

А переменной завершитьРаботуБезВопросов рулишь сам!
А на открытых системных окнах, типа "Сервис-Параметры", отрабатывает - проверял...
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Как по таймауту закрыть сессию 1с корректно
Ответ #12 - 05. Августа 2008 :: 04:51
Печать  
Цитата:
Ну, тут можно с помощью FormEx же поставить автотаймер на окна предупреждений и вопросов.


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

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



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


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

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

FormEx developer
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

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


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

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

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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать