gifts2017

Выгонялка пользователей с визуальным таймером

Опубликовал Kavar (Kavar) в раздел Программирование - Практика программирования

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

К достоинствам данной реализации «выгонялки» стоит отнести:
- таймер обратного отчета предупреждающий о скором закрытии программы;
- работа как в файловом, так и в клиент-серверном варианте;
- выгоняет всех «без вопросов»(модальные окна не помеха);
- позволяет не только выгнать пользователей, но и заблокировать вход в систему;
- позволяет НЕ выгонять определенных пользователей (с определенной ролью, например), или же исключение можно сделать для одного конкретного пользователя;
Недостаток, пожалуй, только один – необходимо внесение небольших изменений в конфигурацию.

Приступим к реализации.

Перво-наперво необходимо подключить внешнюю компоненту(скачать последнюю версию можно на сайте (http://dev.1tsm.ru/project/110) автора).

Далее копируем  MiracleV8.dll в каталог программы 1С

Теперь вносим необходимые изменения в конфигурацию:

Если у вас нет, то необходимо создать новый модуль в «Общие модули». Назовем его СвойМодуль, там будут располагаться все новые процедуры и функции, дабы поменьше типовую конфигурацию изменять.

Добавим туда новую функцию:


Функция ЗагрузитьMiracleV8() Экспорт
   
Miracle=Неопределено;
   
ФайлВК=Новый Файл(КаталогПрограммы()+"MiracleV8.dll");
    Если НЕ
ФайлВК.Существует() Тогда
       
Miracle=Неопределено;
    Иначе
        Попытка
           
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"MiracleV8.dll");
           
Miracle=ПолучитьCOMОбъект("","AddIn.MiracleClass");
        Исключение
           
Miracle=Неопределено;
        КонецПопытки;
    КонецЕсли;
    Возврат
Miracle;
КонецФункции
//ЗагрузитьMiracleV8

 

 После этого в Модуль обычного приложения  в разделе переменных опишем новую глобальную переменную:


//Kavar
Перем L Экспорт;
///Kavar

 

Переменная необходима для обращения к методам внешней компоненты.

А  процедуру ПриНачалеРаботыСичтемы() этого же модуля добавим следующий код:


//Kavar
   
L=СвойМодуль.ЗагрузитьMiracleV8();
    Если
L=Неопределено Тогда
       
Сообщить("Не удалось подключить компоненту  MiracleV8",СтатусСообщения.Информация);
    Иначе
       
СвойМодуль.ПриНачалеРаботыСистемыKavar();
    КонецЕсли;
///Kavar

При успешной регистрации ВК вызывается процедура ПриНачалеРаботыСистемыKavar(), о которой мы поговорим ниже.

Для регистрации ВК необходимо первый раз запустить 1С:Предприятие с правами администратора.

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

Компоненту успешно подключили, теперь перейдем к основной задаче нашей статьи.

 

Создадим в конфигурации новую константу ЗавершениеРаботы

Типа Булево. Админам даем полные права, а остальным чтение и просмотр.

Это и будет главный инструмент по управлению выгонялкой.

Установка константы в Истина инициирует «выгонялку», а так же блокирует базу для входа новых пользователей.

Далее нужено создать обработчик ожидания, который будет проверять состояние константы.

В Глобальный модуль добавляем новый обработчик:


//Kavar
#Если Клиент Тогда
Процедура ПроверитьНеобходимостьЗавершенияРаботы() Экспорт
    
//Если ВРЕГ(ИмяПользователя())="АДМИНИСТРАТОР" Тогда //Тут можноконкретного пользователя прописать, на которого не будет действовать выгонялка.
    
Если РольДоступна("ПолныеПрава") Тогда // либо всех пользователей с определенной ролью
         
Возврат;
     КонецЕсли;
      Если
Константы.ЗавершитьРаботу.Получить()=Истина Тогда
         
СвойМодуль.ОбработатьОбработчикОжидания("ЗАВЕРШЕНИЕ");
     КонецЕсли;
КонецПроцедуры
//ПроверитьНеобходимостьЗавершенияРаботы()
#КонецЕсли
///Kavar

Теперь возвращаемя в СвойМодуль и добавляем туда две процедуры:


Процедура ОбработатьОбработчикОжидания(ВидОбработчика) Экспорт
     Если
ВидОбработчика="ЗАВЕРШЕНИЕ" Тогда
         
ОтключитьОбработчикОжидания("ПроверитьНеобходимостьЗавершенияРаботы");
         
L.CreateBackTimerWnd(180,"Сохраните открытые документы! Программа будет закрыта через, сек: ");
     КонецЕсли;
КонецПроцедуры
//ОбработатьОбработчикОжидания()

Метод CreateBackTimerWnd запускает визуальный таймер, первый параметр которого время обратного отчета, в секундах. В данном примере 180 (3 минуты). А второй сообщение, которое выводится пользователям.

Вторая процедура:

Процедура ПриНачалеРаботыСистемыKavar() Экспорт
//тут проверяем закрыта ли база.
     //Если ВРЕГ(ИмяПользователя())="АДМИНИСТРАТОР" Тогда
     
Если РольДоступна("ПолныеПрава") Тогда
          Если
Константы.ЗавершитьРаботу.Получить()=Истина Тогда
              
Режим = РежимДиалогаВопрос.ДаНет;
              
Текст = "Система закрыта! Открыть?";
              
Ответ = Вопрос(Текст, Режим, 0);
               Если
Ответ = КодВозвратаДиалога.Да Тогда
                   
Константы.ЗавершитьРаботу.Установить(Ложь);
               КонецЕсли;
          КонецЕсли;
          Возврат;
     КонецЕсли;
//Не пускаем простых пользователей в базу, если закрыта.
    
Если Константы.ЗавершитьРаботу.Получить()=Истина Тогда
         
Предупреждение("Работа с базой запрещена Администратором",5);
         
ЗавершитьРаботуСистемы(Ложь,Ложь);
     КонецЕсли;
    
ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗавершенияРаботы",60,Ложь);
КонецПроцедуры
//ПриНачалеРаботыСистемыKavar()

А теперь последний штрих: в Модуле обычного приложения, в предопределенную процедуру ОбработкаВнешнегоСобытия() добавляем следующий код(если этой процедуры нет в вашей конфигурации, создаём)


//Kavar
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
   
Источник=ВРЕГ(Источник);
   
Событие=ВРЕГ(Событие);
    Если
Источник="MIRACLEV8" Тогда
        Если
Событие="BACK_TIMER_WINDOW" Тогда
           
ЗавершитьРаботуСистемы(Ложь,Ложь);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
///Kavar

Данный код отлавливает завершение обратного отчета таймера и завершает работу системы.

Теперь осталось только прикрутить механизм по управлению константой. Кому лень – можно скачть готовую обработку. (см. Прикрепленный файл)

Хотелось бы выразить отдельную благодарность автору ВК Abadonnahttp://infostart.ru/profile/1329/ ) за предоставленную компоненту, а также консультации по работе с ней.(там еще много полезных возможностей – читайте описание). 

 

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

Наименование Файл Версия Размер
управление константой 189
.epf 5,76Kb
19.03.12
189
.epf 5,76Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Misha ⁠ (Magister) 19.03.12 22:24
А как же тонкий клиент? Веб-клиент?
2. Kavar (Kavar) 20.03.12 04:08
(1) Я с ними, на данный момент, не работаю. В статье подход описан. заточить под свои нужды, я думаю, не проблема.
3. Аркадий Кучер (Abadonna) 20.03.12 07:18
(1)
А как же тонкий клиент?

1. Миракл со всеми бантиками вполне благополучно работает в тонком клиенте (рис.)
2. Тонкий клиент 1С, по большому счету, - изврат, все нормальные люди в терминале работают, а он и есть тонкий клиент. Даже железо "тонкий клиент" уже есть.
Прикрепленные файлы:
4. SergioVB (SergioVB) 21.03.12 08:14
(3) Abadonna,
Изврат не изврат. Все равно к этому все идет. Посадят на управляемые формы, хочешь или нет.
5. Антон Антонов (Кафтан) 21.03.12 10:14
6. Аркадий Кучер (Abadonna) 21.03.12 13:26
Я что-то решил у своих сделать не через Загрузить...

Функция ЗагрузитьMiracleV8() Экспорт
Попытка
ПодключитьВнешнююКомпоненту("AddIn.MiracleV8");
Miracle=Новый COMОбъект("AddIn.MiracleClass");
Исключение
Miracle=Неопределено;
Сообщить("Не удалось подключить MiracleV8",СтатусСообщения.Информация);
КонецПопытки;
Возврат Miracle;
КонецФункции
7. Misha ⁠ (Magister) 21.03.12 23:26
(3) Хм... тогда может сможете подсказть, как решить такую проблему:
имеем 10 пользователей, у каждого сканер штрихкодов, принтер штрихкодов, и обычный принтер.
Как это всё дело заставить нормально работать в терминале, без головной боли для админа?
Сейчас все в толстом клиенте, без терминала - но хотелось бы больше нагрузки перенести на сервер.
Тонкий клиент это решит, а вот как сделать такую схему управляемой (и расширяемой до произвольного количества пользователей) при использовании терминала? Да, каждый СШК работает как виртуальный COM-порт.

Спрашиваю не из праздного любопытства, реально есть такая проблема.

P.S. А то, что Миракл работает и в тонком клиенте - не знал, спасибо за информацию.
8. Аркадий Кучер (Abadonna) 22.03.12 06:35
(7)
А то, что Миракл работает и в тонком клиенте - не знал, спасибо за информацию.

Вообще-то она открытым текстом лежит прям в кратком описании, где ей и положено
Сервис-М MiracleV8 ;)
имеем 10 пользователей, у каждого сканер штрихкодов, принтер штрихкодов, и обычный принтер.

Для сканеров ШК надо родную ПолучитьИмяКомпьютераТО() заменить на

// Функция возвращает строку c именем компьютера для нужд торгового оборудования.
//
// Возвращаемое значение:
// Строка - имя компьютера для торгового оборудования.
//

Функция ПолучитьИмяКомпьютераТО() Экспорт
WSS = Новый COMОбъект("WScript.Shell");
WSSE = WSS.Environment("Process");
мИмяКомпьютера = ВРег(WSSE.Item("ClientName"));
Если ПустаяСтрока(мИмяКомпьютера) Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
КонецЕсли;
Если мИмяКомпьютера = "CONSOLE" Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции // ПолучитьИмяКомпьютераТО()

Тогда вернется имя компа, с которого проброшен порт в терминал (их родной вернет имя самого терминала)
Могу сказать, что спокойненько тестировал новый СШК из нашего офиса, подключившись через VPN на терминал клиента.
Lapitskiy; Magister; cleaner_it; +3 Ответить 1
9. Misha ⁠ (Magister) 22.03.12 21:53
(8) Просто последний раз смотрел на Miracle давно-давно, как только она была выложена тут.
//
Спасибо, хороший вариант!
А номер порта какой получится? У каждого клиента будут свои COM1, COM2 и т.д., или нумерация сквозная?
10. Dimon (klel) 23.03.12 20:47
Спасибо огромное долго искал что то подобное :)
11. Владимир Лагутин (Lukich66) 26.03.12 09:55
Ничего не имею против данной реализации, но почему-то подумалось,а что в 1с не понимают,что подобный "сервис" необходим? А так "вламывать" в конфу черт-знает что- смысл? За что деньги плачены?
12. A A (veforg) 26.03.12 10:00
(11) Lukich66, 1с поступает правильно. Если бы они всякий функционал встраивали, то нам, программистам, нечего будет есть )
13. Аркадий Кучер (Abadonna) 26.03.12 12:46
(11) Lukich66,
но почему-то подумалось,а что в 1с не понимают,что подобный "сервис" необходим?

В свое время мне подумалось: а что им стоит сделать наипростейший индикатор прогресса на форме 7.7?
Это было еще на 13-ом релизе движка. Вышел и 27-й, а ведь так и не сделали!
Именно из-за этого прогресс-бара я и начал писать ВК ;)))
Или вот: что им стоит сделать в 8.2 индикатор раскладки клавиатуры? В Конфигураторе есть (на фиг там не нужен), а вот в самой проге - нет, хотя в терминальном режиме бывает нужен.
14. Владимир Лагутин (Lukich66) 26.03.12 15:52
Уровень активности сообщества 1с по 5-ти бальной шкале=1.5, думаю со временем мы сможем заставить "трудяг-производителей" сделать нам "красиво"- вроде все как бы к этому идет,ну с "отскоками" конечно, неоспоримо 8.2>8.1>8.0>7.7>6.0>2.0проф- явно прослеживаются парралели с MicroSoft Win- азарт и прыть оч.похожи. А нам "сообщникам" дел хватит и без "глобальных" замахов.
15. Andrey Dyak (electronik) 26.03.12 17:14
16. Jani V (jeniav) 27.03.12 08:16
Неплохая идея, надо попробовать, а то вечно пользователь ничего не видит и не читает
17. Иван Иванович (botcc) 27.03.12 12:40
Конечно круто, но у меня более 700 челов в 1ске регистрить dll каждому на компе... да меня свора наших сисадминов обгладает...
18. Игорь Беляев (bissov) 27.03.12 13:19
Не совсем понимаю, а чтобы с SQL выгоняло надо компоненту у каждого пользователя регестрировать или вообще всем админские права давать?
19. Pavel Y (Pashikuss) 27.03.12 14:16
20. Kavar (Kavar) 27.03.12 15:04
(17),(18), Если пользователи в терминале, то достаточно один раз на сервере(ах) 1С с админскими правами запустить.
А вот если по сети, тогда на каждом компе надо регить.
21. farg066 farg066 (farg066) 28.03.12 15:51
Помогите, пожалуйста
Все сделал, как написано автором, но при завершении работы возникает следующая ошибка

---------------------------

{Обработка.ТОСервер(3321)}: Ошибка при вызове метода контекста (Найти): Неверное имя колонки
ТО = Оборудование.Найти(Источник, "ИмяИсточникаВнешнегоСобытия");
по причине:
Неверное имя колонки

---------------------------

До возникновения ошибки в переменной источник содержится след инфа “ MiracleV8 ”
22. Kavar (Kavar) 28.03.12 18:16
(21) Добавь условие, что если Источник = “ MiracleV8 ”
не вызывался этот метод.
23. Аркадий Кучер (Abadonna) 30.03.12 03:23
(18) bissov,
надо компоненту у каждого пользователя регестрировать или вообще всем админские права давать?

Забавно, что новая генерация "чистых восьмерочников" задает вопросы, которые на сто рядов обсосаны семерочниками года эдак с 2000-го. Подключение ВК хоть к семерке, хоть к восьмерке а равно и проблема с правами по большому счету вообще к 1С отношения не имеют. Любой COM (ActiveX) обязан прописаться в реестре Windows, если у пользователя таких локальных прав нема - то и свободен он, как птица в полете;)
24. den kuklin (denj) 30.03.12 08:51
неплохая выгонялка! только вот окно маловатенькое библиотеки, пользователи поначалу не замечали ее
25. Kavar (Kavar) 30.03.12 09:26
(24) Окно таймера? Нормальное окно. в глаза сразу бросается. очень сложно его не заметить.
26. den kuklin (denj) 30.03.12 10:08
(25) Kavar, ну видимо пользователи слепые такие, им надо окно на полэкрана чтобы выскакивало наверное
27. Аркадий Кучер (Abadonna) 30.03.12 23:03
(24) denj,
только вот окно маловатенькое библиотеки, пользователи поначалу не замечали ее

А сделай его побольше, эти [цензура] сразу начнут жаловаться, что оно мешает.
Плавали - знаем!
28. Alexey Smirnov (Alex353) 03.04.12 08:26
При загрузке компоненты выскакивает сообщение об ошибке, что не найден файл bass.dll. Поиск что это за файл и в какой пакет входит результатов не принес. Что это за файл никто не в курсе?
29. Kavar (Kavar) 03.04.12 10:11
(28)Читайте последний комментарий на страничке ВК.
Короче, более старую версию надо загрузить.
30. Andre (vitn) 19.04.12 00:00
31. Shurix Noise (shurix) 02.06.12 22:47
Для 1С 7.7 работать не будет случаем?
32. 11 22 (eoego1) 02.06.12 22:50
Хороший которого не хватало. Спасибо!
33. Kavar (Kavar) 04.06.12 05:31
(31) Эта ВК поддерживает 1С 7.7 так, что работать будет. код только переделать нужно.
34. Alex Steiner (OrsoBear) 05.06.12 09:59
Идея хорошая, но мне к сожалению не помогла.
Сервер на линуксе. СОМ-объекты и регистрация dll не по адресу.
35. den kuklin (denj) 06.06.12 12:34
а на windows 7 не работает? почему то пишет что не подключена библиотека, хотя лежит в папке где полагается..
36. Kavar (Kavar) 06.06.12 12:37
(35) Для регистрации библиотеки первый раз нужно запустить 1С от имени Администратора.
37. den kuklin (denj) 06.06.12 12:37
(36) Kavar, ну я и есть администратор
38. Kavar (Kavar) 06.06.12 12:53
(37) В Win7 если ты работаешь под учеткой администратора, не значит, что ПО у тебя от имени администратора запускается. Либо ПКМ -> "Запуск от имени администратора", либо отключить UAC, что крайне не рекомендуется.
39. Алексей 1 (AlX0id) 10.07.12 08:31
Я правильно понимаю, что для работы этой вещи необходимо наличие оной компоненты на каждом компьютере каждого пользователя?
40. Kavar (Kavar) 10.07.12 13:46
(39) AlX0id, Если 1С сетевая и запускается у каждого пользователя локально - да. если работа идет в терминальном режиме - одна компонента на сервере.
41. Алексей 1 (AlX0id) 10.07.12 14:00
(40) Kavar,
тады не вариант.. эт за каждым компом следить надо будет.. перерегистрировать ее в случае чего..
42. Kavar (Kavar) 11.07.12 13:36
(41)Ну дык, платформу то так и так на всех обновляешь. при обновлении ее просто в новую папку перекинуть надо.
43. Алексей 1 (AlX0id) 11.07.12 14:20
(42) Kavar,
Ну дык, платформу то так и так на всех обновляешь

.. и еще десяток компонент обновишь - так что ли?
Я не в претензии, конечно - просто указываю недостатки подобного подхода.
44. Админ Одинэсов (4ittmk) 08.07.13 17:39
- выгоняет всех «без вопросов»(модальные окна не помеха);
У меня не выгоняет, например, если пользователь нажал перед этим Справка/О программе...
или
Просто запустил базу, вылетело окно "Итоги в информационной базе рассчитаны по..." и пользователь больше к базе не прикасался так и не закрыв окно.
45. Админ Одинэсов (4ittmk) 08.07.13 17:57
Не понравилось, что если начать выгонять пользователей, а потом отменить секунд через 30, то все равно выгонит, хотя константа уже обнулена.