Консультация № 138651
30.05.2008, 12:49
0.00 руб.
0 6 6
Здравствуйте.
Помогите, пожалуста розобраться с проблемой. Суть такая. Последнее время стало много ушлых работников, которые за 1,5-2 часа до конца рабочего дня уходят и для того, чтобы создавать видимость типа "я только отлучился на минутку по неотложным делам, оставляют включённым комп. с запущенной 1С.
Ходить за ними выключать компы - не ice.
Для выключения компов по расписанию поставил соответсвующую прогу, но хотелось бы предварительно - во избежании всяких эксцессов с базой - закрывать 1С.

В конце процедуры ПриНачалеРаботыСистемы объявил функцию ОбработкаОжидания("ЗавершениеПоВремени",60);

Затем прописал саму функцию след. обр.

Функция ЗавершениеПоВремени()
Перем __Ч;
Перем __М;
Перем __С;
ТекущееВремя(__Ч,__М,__С);
Если (__Ч=19) И (__М<3) Тогда
Сообщить("Выключаем 1С. Всем спасибо за работу. До завтра! ");
ЗавершитьРаботуСистемы();
КонецЕсли;
КонецФункции // Завершение по времени

Но она почему-то не срабатывает.
Что я сделал не так?

Обсуждение

Неизвестный
30.05.2008, 13:21
общий
это ответ
Здравствуйте, Барилов Д.!
Попробуйте разместить ОбработкаОжидания("ЗавершениеПоВремени",60); в конце глобального модуля т.е. не в процедуре при начале работы системы а в самом теле глобального модуля, в той части где идет установка глобальных переменных.
ЗавершениеПоВремени() - вызывайте как процедуру см. синтаксис
Процедура ЗавершениеПоВремени()
Перем __Ч;
Перем __М;
Перем __С;
ТекущееВремя(__Ч,__М,__С);
Если (__Ч=19) И (__М<3) Тогда
Сообщить("Выключаем 1С. Всем спасибо за работу. До завтра! ");
ЗавершитьРаботуСистемы();
КонецЕсли;
КонецПроцедуры // Завершение по времени

Приложение:
ОбработкаОжидания(<?>,)Синтаксис:ОбработкаОжидания(<ИмяПроцедуры>,<ИнтервалВызова>)Назначение:Инициирует периодический вызов процедуры глобального модуля с заданным интервалом времени.Возвращает имя процедуры глобального модуля, которая назначена для периодического запуска (на момент до исполнения процедуры).Параметры:<ИмяПроцедуры> - необязательный параметр. Строковое выражение - имя процедуры глобального модуля, которая будет вызываться периодически с временным интервалом <ИнтервалВызова>. Тело процедуры <ИмяПроцедуры> должно быть написано разработчиком конфигурации в глобальном программном модуле. Если в качестве параметра передается ‘пустая строка‘, то ранее запущенный процесс прекращается. <ИнтервалВызова> - необязательный параметр. Числовое выражение - интервал времени в секундах, с которым периодически будет вызываться процедура глобального модуля <ИмяПроцедуры>. Если в качестве параметра передается 0 (ноль), то ранее запущенный процесс прекращается.
Неизвестный
30.05.2008, 13:37
общий
это ответ
Здравствуйте, Барилов Д.!

скорее всего дело в вызове ЗавершитьРаботуСистемы() без параметра.
в этом случае идет запрос на сохранение документов.
Кроме того, в типовой ТиС есть реквизит справочника "Пользователи" "НеЗапрашиватьПодтверждениеПриВыходе" и в процедуре ПриЗавершенииРаботыСистемы() идет его проверка с повисанием вопроса "Завершить работу системы?". В кач-ве решения - объявить переменную "ОбязательноеЗавершениеРаботы" устанавливать в 1 при выполнении условия по времени, и не запрашивать подтверждение на выход при этом...

З.Ы. отлично работает такой вариант
Если текущееВремя()>"19:00:00" тогда
Неизвестный
30.05.2008, 13:41
общий
это ответ
Здравствуйте, Барилов Д.!
Вариантов много.
Расскажу как сам сделал.
1.Завел Константу "Отключить" Число 5
2.Обработка которая включает/отключает режим отключения пользователей. Доступна только админу.
Там на форме поле ввода "Пауза" Число 3 - где вводится пауза в минутах до выключения.
и 2 кнопки ВКЛ и ВЫКЛ - включить/выключить таймер.
После включения В течение заданного интервала минут система выдает каждую минуту предупреждение, что осталось столько-то минут и когда время иссякнет выключает комп.
Процедуры висящие на кнопках ВКЛ и ВЫКЛ (Вкл() и Откл()) в приложении
В процедуре ПриНачалеРаботыСистемы()

Процедура ПриНачалеРаботыСистемы()
...

ОбработкаОжидания("ПоказВремени",60);
...

Запускаем раз в минуту обработку "ПоказВремени" .
Сама обработка в приложении
Она проверяет раз в минуту состояние константы "Отключить". и если там число отличное от нуля, сравнивает текущее время и время в константе.
После того как всех отключит и вы зайдете монопольно не забудьте в обработке нажать кнопку ВЫКЛ иначе она Вас через минуту тоже отключит.

Программа срабатывает не всегда.
1) если пользователь открыл модальное окно, то программно его не закрыть
2) если пока идет отсчет паузы кто-то зашел и начинает работать, то их тоже не выгоняет. Вероятно, что у них Константа.Отключить=0 и не обрабатывается.

Ну это только идея - доработайте под свои нужды


Приложение:
Процедура Вкл() Перем _Ч,_М,_С; Если Пауза>0 Тогда ТекущееВремя(_Ч,_М,_С); Константа.Отключить=_Ч*3600+(_М+пауза)*60+_С; Предупреждение("Время пошло!!! "+РазделительСтрок +"Через: "+Строка(пауза)+" минут выключим! "+ИмяПользователя()+": Не забудьте потом вручную отключить!",10); КонецЕсли;КонецПроцедуры //Вкл//_____________________________________________________________________________Процедура Откл() Константа.Отключить=0; пауза=0;КонецПроцедуры //Откл//проц ПоказВремени должна быть в глобальном модуле//_____________________________________________________________________________Процедура ПоказВремени() Перем __Чччч; Перем __Мммм; Перем _Сек; ТекущееВремя(__Чччч,__Мммм,_Сек); Состояние("Текущее время: "+Формат(__Чччч,"Ч(0)2")+":"+Формат(__Мммм,"Ч(0)2")); Если Константа.Отключить>0 Тогда Осталось=Константа.Отключить-(__Чччч*3600)-(__Мммм*60)-_Сек; Если Осталось<=0 Тогда ЗавершитьРаботуСистемы(1); КонецЕсли; Если Осталось>0 Тогда Предупреждение("Внимание!!! Система завершит работу через "+Строка(Цел(Осталось/60))+" Минут "+Строка(Цел(Осталось%60))+" Секунд ",10); КонецЕсли; КонецЕсли;КонецПроцедуры //ПоказВремени//_____________________________________________________________________________
Неизвестный
30.05.2008, 14:23
общий
это ответ
Здравствуйте, Барилов Д.! Замениет условие на : Если (__Ч>=19) И (__М>3) Тогда.
Часы на разных компах идут по разному так что при вашем условии можно проскочить 3 минуты заветные и опять же время в обработке можно поставить больше 60 секунд т.е. меньше база будет нагружаться.
А вообще есть программы типа Remote Administrator(RAdmin), заходите на компьютер типа как в терминале только в сеанс пользователя и отключаете что вам нужно, и незачем бегать по кабинетам. А если вы это еще начальству поставите, чтоб оно начальство могло видеть чем сотрудники в рабочее время занимаются, то ваш рейтинг у руководства резко возрастет.
Неизвестный
30.05.2008, 19:06
общий
это ответ
Здравствуйте, Барилов Д.!

Есть внешняя компонентка waiter, которая как раз для подобных целей разрабатывалась: считать время бездействия пользователя.

Эта компонента выдаёт время бездействия пользователя 1С, а уж как использовать полученную информацию, зависит от фантазии.

В Приложении ссылка на архив (200 Кб), в нём описание и пример использования.

С уважением, Владимир.

Приложение:
waiter.zip 200.84 Kbhttp://ifolder.ru/5653241
Неизвестный
31.05.2008, 01:10
общий
это ответ
Здравствуйте, Барилов Д.!
Замените "ЗавершитьРаботуСистемы()" на "ПрекратитьРаботуСистемы()"
Форма ответа