gifts2017

Внешняя компонента для подсчета числа секунд простоя открытого сеанса 1с-Предприятия

Опубликовал bulpi bulpi (bulpi) в раздел Программирование - Внешние компоненты

Внешняя компонента для подсчета числа секунд простоя открытого сеанса 1с-Предприятия

Внешняя компонента NoSlip.dll предоставляет всего 1 метод -
GetLastInputInfo(), возвращающий число секунд простоя открытого сеанса
1с-Предприятия (т.е. время, в течении которого не было движений мышки и
нажатий клавиш клавиатуры не вобще в системе, а в окне этого экземпляра
окна 1с-Предприятия). Для чего нужно, надеюсь, понятно.
На сайте 1с-Профессионал есть аналогичная разработка Waiter
 
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=77&lid=2713
от Сергея Гурова http://1c.proclub.ru/userinfo.php?uid=9958
Я ее использовал раньше, но мне она не понравилась по 2 причинам :
1)Waiter - не внешняя компонента, а Com-объект, его нужно регестрить на каждой машине
2)Он глючит!

А моя внешняя компонента не требует регистрации и вроде пока :) не глючит.

И здесь я встречал похожую разработку, которая считала время простоя в системе Windows, но не внутри 1с.


Работает под Win98-2000-2003-XP, проверял.

Скачать файлы

Наименование Файл Версия Размер
- 166
.1245702769 24,05Kb
25.09.09
166
.1245702769 24,05Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Станислав Шепталов (sCHTASS) 23.06.09 07:46
Скажу про 1С77
Для расчета простоя, как вариант, можно работать с предопределенным процедурами FormEx ПриДвиженииМыши() и ПриНажатииКнопкиКлавиатуры() через обработчик ожидания.

Только сей алгоритм не работает, если 1С заблокирована или занята длительным процессом :((
2. Андрей Скляров (coder1cv8) 23.06.09 08:08
3. Артур Аюханов (artbear) 23.06.09 08:09
(2) В ВК 1С++ для 1С 77 эта проблему я давно решил, в ней есть метод, аналогичный сабжу.
4. bulpi bulpi (bulpi) 23.06.09 12:35
2 coder1cv8
Скачал, посмотрел. Действительно, все очень изящно. А для 7.7 как это применить?

2 artbear
1с++ - это здоровенный бронепоезд. А мне с него нужен один пулемет. Я не хочу ставить весь бронепоезд ради одного пулемета. Всем 1с плюс-плюсовцам - привет и мое уважение :) !!!
5. Артур Аюханов (artbear) 23.06.09 18:44
(4) А ты подумай над тем, что 1С++ дополнительно еще всякие полезные вещи делает :)

Например, простая загрузка ВК 1С++ позволяет довольно ускорить работу всей 1С :) и т.д. и т.п.
6. bulpi bulpi (bulpi) 23.06.09 20:30
2 coder1cv8
И , кстати, именно Вашу разработку я имел в виду , когда написал "И здесь я встречал похожую разработку, которая считала время простоя в системе Windows, но не внутри 1с"
7. Andrey (kentavr27) 24.06.09 15:00
(3) В 1с++ есть именно аналогичная, но не такая. Представленная компонента дает возможность отслеживания бездействия именно в открытм сеансе 1С. (если 1С-ка свернута и пользователь шарится по рабочему столу -- это бездействие. Только работа в 1С-ке сбрасывает счетчик). А в 1с++ счетчик сбрасывает ЛЮБОЕ действие в сеансе пользователя Win. Вот, собсвенно их отличие.
8. Артур Аюханов (artbear) 24.06.09 17:22
(7) Вот с чего ты это взял про 1С++ ? :(
Там как раз все реализовано через GetLastInputInfo() для текущего сеанса 1С.
9. Andrey (kentavr27) 24.06.09 21:59
(8) С чего взял? Просто сам этим пользуюсь :)
Не видел я в 1С++ GetLastInputInfo()
там есть следующее:

Информатор = СоздатьОбъект("Информатор");
Информатор.ПолучитьВремяПростояСистемы();

время простоя Win
10. Константин Комаров (monoteos) 26.06.09 12:23
Работает нормально, как раз недавно думал о такой компоненте. Автору респект
11. Константин Комаров (monoteos) 26.06.09 12:44
Вариант для вывода в удобном формате:

Перем Компонент;
Перем НачВремя;

Процедура Проверить()
ОбработкаПрерыванияПользователя();
ТекПростой = Компонент.GetLastInputInfo();

Если ТекПростой > 0 Тогда
НачВремя = НачВремя + 1;
Сообщить(Строка(ТекПростой) + " секунд, " + Формат(НачВремя,"ДФ=ЧЧ:мм:сс"));
КонецЕсли;

ПодключитьОбработчикОжидания("Проверить",1,Истина);
КонецПроцедуры

Процедура ПриОткрытии()
НачВремя = Дата("00010101000000");
ЗагрузитьВнешнююКомпоненту("NoSlip.dll");
Компонент = Новый("AddIn.NoSlipAddInExtension");
ПодключитьОбработчикОжидания("Проверить",1,Истина);
КонецПроцедуры
12. Сергей (skom) 11.08.09 12:07
Перем СтарыйПростой, НовыйПростой;
Перем Компонент;

Процедура Простой()

СтарыйПростой = НовыйПростой;
НовыйПростой = Компонент.GetLastInputInfo();

Сообщить(СтарыйПростой + " сек");
Сообщить(НовыйПростой + " сек. прост. новый");
Сообщить("====================");
КонецПроцедуры

Процедура ПриОткрытии()
ЗагрузитьВнешнююКомпоненту("NoSlip.dll");
Компонент = СоздатьОбъект("AddIn.NoSlipAddInExtension");
Форма.ОбработкаОжидания("Простой",10);
КонецПроцедуры


СтарыйПростой = 0;
НовыйПростой = 0;

вот такая обработка выдает вот такие результаты
АВТОР с чем это связано?
неужели так долго работает Сообщить()

//результат
1
2
====================
2
15
====================
15
27
====================
27
39
====================
39
51
====================
51
63
====================
63
76
====================
76
88
====================
88
100
13. Сергей (skom) 11.08.09 12:08
вызов через 10 сек
разницу выдает от 12 или 13 сек
14. bulpi bulpi (bulpi) 11.08.09 12:31
2 skom (12,13)
ИМХО, это так долго работает
Форма.ОбработкаОжидания("Простой",10);
Я думаю, 1с периодически опрашивает все открытые формы, не пора ли их обновить, с интервалом в несколько секунд. Именно тогда и проверяется, не пора ли запустить обработку ожидания. Поэтому она запускается не точно через 10 сек, а 10+ какой-то кусок интервала опроса. Возможно, на этот интервал можно повлиять через Сервис - Параметры - Период опроса изменений базы данных (сек).
Впрочем, интерес чисто теоретический. Понятно, что компонента предназначалась для отрубания наглых юзеров, которые запустят базу и уйдут на целый час. Тут уже неважно, 10 сек или 12.
15. Сергей (skom) 11.08.09 12:34
16. Сергей (skom) 11.08.09 12:36
Процедура глПроверкаПростоя()


СистемноеВремяПростоя = Константа.ВремяПростоя;

СтароеВремяПростоя = глВремяПростоя;
глВремяПростоя = ЗамерВремениПростоя.GetLastInputInfo();

Если глВремяПростоя-СтароеВремяПростоя < 30 Тогда
ТочноеВремяПростоя = глВремяПростоя;
Если ТочноеВремяПростоя/60 >= СистемноеВремяПростоя Тогда
Часов = Цел(ТочноеВремяПростоя/3600);
Минут = Цел(ТочноеВремяПростоя/60)-Часов*60;
Секунд = ТочноеВремяПростоя - Минут*60-Часов*3600;
ЗаписьЖурналаРегистрации("Простой системы составил "+Часов+" часов "+Минут+" мин. " +Секунд+" сек.",,"Простой системы");

Запрос=СоздатьОбъект("ODBCRecordSet");
//-----------------А теперь добавляем-------------------------------------
ДатаТек=Формат(ТекущаяДата(), "ДГГГГММДД");

ТекстЗапроса = "ins ert into SleepTime values('"+ИмяПользователя()+"', "+ТочноеВремяПростоя+", "+ДатаТек+", "+ТекущееВремя()+")";
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить(Запрос.ПолучитьОписаниеОшибки());
Конецесли;
//обнулим счетчик простоя
глВремяПростоя = 0;
КонецЕсли;
КонецЕсли;

КонецПроцедуры // глПроверкаПростоя

эта процедура запускается раз в 30 сек
для теста стоит 2 минуты
но не срабатывает
17. Сергей (skom) 11.08.09 12:50
у меня все в глобальнике открывается
процедура в глобальнике
и обработка ожидания из формекса. которой пофигу на модальные окна
18. bulpi bulpi (bulpi) 11.08.09 12:57
(16)
Аськи у меня нет, я ее не люблю.

Не срабатывает, имхо, из-за странного условия

Если глВремяПростоя-СтароеВремяПростоя < 30 Тогда

Что ты этим хотел добиться?
Убери его , и заработает.



Не в тему : а что это такое странное ты делаешь с помощью объекта ODBCRecordSet ?
19. Сергей (skom) 11.08.09 14:31
ODBCRecordSet - это в скульную таблицу записываю инфу о простое системы

глВремяПростоя-СтароеВремяПростоя < 30
это условие надо для того что бы не каждый например час записывать инфу о бездействии пользователя
а например если он 2 часа и 30 сек не действует то по после того как он задействовал записалось что бы

так вот
обработка ожидания в рабочей базе у меня запускается с интервалом в 30 сек
сначала запоминается предыдущее значение простоя
например 100 сек. потом вычисляется последнее значение простоя
например если бездействие тогда оно составит 30 сек и тогда получим
130-100 < 30
тогда в данном случае не пишем в лог так как бездействие ПРОДОЛЖАЕТСЯ

а если в течении этих 30 сек пользователь что то сделает тогда получим

120-100< 30
тогда получается что пользователь прервал бездействие
и вот тут и надо записать в лог сколько он бездействовал
20. bulpi bulpi (bulpi) 11.08.09 17:22
Я проверил. Алгоритм правильный, у меня работает. А что именно не работает? В отладчике посмотри.
21. Сергей (skom) 12.08.09 04:34
самое прикольное что до этого была написана процедура, но в ней изначально неправильный алгоритм был...но самое интересное что она работала правильно...в локальной версии
а на боевой рабочей базе получаются глюки.
чел работает. а система пишет простой работы
а в этой верный алгоритм но не работает)) вот так.
22. Сергей (skom) 12.08.09 10:27
кстати код не совсем верный
надо дополнять
ибо если например человек пришел утром запустил систему
и ушел
а в обед сессию рубанули
то в системе не запишется простой системы.
23. bulpi bulpi (bulpi) 12.08.09 12:47
(22)
Возможно, стоит записывать 2 события - начало простоя (если простой превышает N минут) и конец простоя. А если конец не записан, значит концом простоя является выход из системы.
24. Алексей Миронов (a_mironov) 11.12.11 04:16
Процедура глПроверкаПростоя()


СистемноеВремяПростоя = Константа.ВремяПростоя;

СтароеВремяПростоя = глВремяПростоя;
глВремяПростоя = ЗамерВремениПростоя.GetLastInputInfo();

Если глВремяПростоя-СтароеВремяПростоя < 30 Тогда
ТочноеВремяПростоя = глВремяПростоя;
Если ТочноеВремяПростоя/60 >= СистемноеВремяПростоя Тогда
Часов = Цел(ТочноеВремяПростоя/3600);
Минут = Цел(ТочноеВремяПростоя/60)-Часов*60;
Секунд = ТочноеВремяПростоя - Минут*60-Часов*3600;
ЗаписьЖурналаРегистрации("Простой системы составил "+Часов+" часов "+Минут+" мин. " +Секунд+" сек.",,"Простой системы");

Запрос=СоздатьОбъект("ODBCRecordSet");
//-----------------А теперь добавляем-------------------------------------
ДатаТек=Формат(ТекущаяДата(), "ДГГГГММДД");

ТекстЗапроса = "ins ert into SleepTime values('"+ИмяПользователя()+"', "+ТочноеВремяПростоя+", "+ДатаТек+", "+ТекущееВремя()+")";
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить(Запрос.ПолучитьОписаниеОшибки());
Конецесли;
//обнулим счетчик простоя
глВремяПростоя = 0;
КонецЕсли;
КонецЕсли;

КонецПроцедуры // глПроверкаПростоя

эта процедура запускается раз в 30 сек
для теста стоит 2 минуты
но не срабатывает
25. andrey dyak (dyak84) 20.03.13 19:14
Автор а как он работает как он определяет вернее сказать по какому принципу время простоя.
26. bulpi bulpi (bulpi) 20.03.13 20:07
(25)
От последнего движения мышкой или нажатия клавиши в тот момент, когда активным окном была именно 1с, эта база. Т.е. если пользователь шарится в других приложениях, то эти движения не считаются, и простой продолжает нарастать.
27. smaharbA (smaharbA) 20.03.13 20:11
ОбработкаОжидания("ОпределениеПростоя",1);

как использовать обработку ожидания не для одного действия все знают
28. Никитин Д.В. (DeniNikitin) 12.12.13 12:27
А можно тоже самое только чтобы считал не для окна 1С а для системы?
29. bulpi bulpi (bulpi) 12.12.13 15:37
Вот здесь было : http://infostart.ru/projects/2591/
А мне это не интересно, я хотел именно в 1с считать секунды.
30. Никитин Д.В. (DeniNikitin) 13.12.13 04:52
Платформа: 8.2.19.76
Конфигурация:Управление производственным предприятием, редакция 1.3 (1.3.36.1)

При открытии вашей обработки:
{Форма.Форма.Форма(20)}: Ошибка при вызове метода контекста (ЗагрузитьВнешнююКомпоненту)
ЗагрузитьВнешнююКомпоненту("NoSlip.dll");
по причине:
Ошибка при загрузке внешней компоненты
Пробовал и через подключитьвнешнююкомпоненту тоже не получилось!
31. bulpi bulpi (bulpi) 13.12.13 14:07
(30)
Это проблема с правами в системе. Нужно 1 раз войти как админ, выполнить метод ЗагрузитьВнешнююКомпоненту, чтобы в реестре прописались ключи, а затем ее смогут использовать и пользователи без прав админа. Подробно написано здесь http://kb.mista.ru/article.php?id=419
32. Олег Шалимов (CaSH_2004) 29.10.14 01:15
(0)Автор уточни плиз как понимать то что в статье указано
...моя внешняя компонента не требует регистрации...

а потом ты в (31) пишеш:
Нужно 1 раз войти как админ, выполнить метод ЗагрузитьВнешнююКомпоненту, чтобы в реестре прописались ключи


я уж подумал что у вас ВК по технологии Native API написана, а теперь сомневаюсь вот...

Не подскажите направление куда копать чтобы добится эффекта работы только в окне 1С? я АПИ не силен. но наваял аналог в 1С напрямую используя DynamicWrapperX
33. bulpi bulpi (bulpi) 29.10.14 11:26
(32)
Не требует регистрации в том смысле, что не нужно писать regsvr32 NoSlip.dll

Когда я это делал, в 1с технологии Native API не существовало.

"куда копать чтобы добится эффекта работы только в окне 1С?"

Исходники могу выслать.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа