gifts2017

Освобождение лицензий, отключение неактивных пользователей. Управляемые формы

Опубликовал Andrey Tey (Bitnikov) в раздел Администрирование - Журнал регистрации

Все та же проблема отсутствия свободных лицензий. Плюс освобождение базы для ночных регламентных работ (бэкап и т.п.).
Делюсь своим методом определения неактивности и описание решения.

Предпосылки:

*Для ворчунов: Не считаю, что открыл Америку. Посему и размещаю как статью, а не как обработку. Мне важны плюсы с рекомендациями, а не деньги.

*Выдирал процедуры "Как есть" для примера, сами поработайте над притиркой.

*Для своих "капиталистических" нужд (серверы за бугром), я также учитываю разницу времени между клиентом и сервером. Это оставил за кадром, чтобы не перегружать текстом.

 

ЗАЧЕМ и что это:

 Небольшие доработки в коде, чтобы каждая работающая клиентская машина САМОСТОЯТЕЛЬНО определяла время своей неактивности и самостоятельно (корректно) закрывала свою сессию. Тем самым освобождая лицензию.

 

Основа:

- Раз в 1100 секунд (время найдено эмпирическим путем как универсальное) отрабатывает регламентное задание, которое сохраняет ОПРЕДЕЛЕННЫЙ срез журнала регистрации в РегистрСведений (перетирая предыдущее сохранение).

- На каждый вход Админа проверяется "А не выключена ли регистрация событий в Журнале регистрации?".

- В настройках для Админа выведена настройка 3-х констант: Вкл/Выкл выбрасывалку; время простоя в минутах; и время начала выбрасывания (как часть даты - время).

- На запуске сеанса клиента стартуется процедура "УстановитьОжиданиеПростоя()", которая запускает обработчик ожидания начала времени выбрасывания.

- Обработчик ожидания начала времени выбрасывания каждые 10 минут проверяет не наступило ли "Константа время начала выбрасывания" (Это чтобы отошедшего покушать сотрудника не убило, у нас стоит на 18:00). И если уже да, запускает обработчик ожидания выбрасывания.

- Обработчик ожидания выбрасывания каждые "Константа времени простоя"/1.5 проверяет регистр сведений сохранения журнала регистрации и, если текущий пользователь за последние "Константа времени простоя" даже отчет не открывал, на пару минут выводит предупреждение и закрывает сеанс.

 

Постарался все процедуры выложить и как картинку и в тексте. Кому как удобнее

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

Наименование Файл Версия Размер
Процедуры в txt 127
.zip 2,67Kb
12.03.13
127
.zip 2,67Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Roman Biblbox (mr zafod) 22.09.12 13:36
а почему нельзя использовать блокировку соединений для запуска регламентных заданий?
ну а по теме:

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

Определяем, что неактивного пользователя нужно отключить через 30 минут простоя
При старте системы запускаем обработчик ожидания через каждые 5 минут
Если пользователь не работает, то обработчик до момента отключения должен стартануть ровно 6 раз ровно через 5 (+/- 10 секунд) минут. Нам остается только ждать этого момента. Заводим пару переменных, в одну копим количество стартов через 5 минут, в другую время последнего запуска. Если время последнего запуска - время текущего старта обработки ожидания больше 5 минут - значит пользователь какое-то время работал с программой - обнуляем переменные и ждем снова.

Ваш метод тоже хорош, но как-то "дорого" делать срез регламентным заданием и лазить в регистр. Тем более пользователь может работать в течении часа-двух без необходимости производить действия, отражающиеся в журнале регистрации.
Anna_A; AllexSoft; Stalker27; EmpireSer; kuza_87; CratosX; i_lo; Bitnikov; +8 Ответить 2
2. al petrov (petrov_al) 22.09.12 16:35
Все бы ничего, но в конфу из-за этого придется лезть а это делать нехочется. Покрайней мере подключать обработчик нужно в типовых процедурах при начале работы системы. Отсюда вопрос, возможно ли это сделать на уровне сервера 1с?
3. andrey dyak (dyak84) 23.09.12 09:16
Вещь нужная и небходимая.Но подскажите будет ли нормально работать в кластерной много процесорной системе (имется ввиду клиент серверный SQL вариант работы. А то пока не нашел обработки которая завершала сеансы работы пользователей, всех без исключения. Зарание спасибо за ответ
5. Andrey Tey (Bitnikov) 24.09.12 10:30
(1) mr zafod, Сорри... предыдущее письмо написал без ссылки.
Блокировку соединений использую, но для другого. В данном случае иные задачи.
Здесь фенечка в том, чтобы определять неработающих пользователей и ЗАКРЫВАТЬ совсем их сессии. Пусть завтра, если таки выйдут на работу, заново откроют.

В "Нашем" ДАННОМ варианте базы, работать без отражения в журнале регистрации (или в аудит логе, дублирующем журнал) невозможно. Если нет записей - пользователь не работает.
Конфа самописная для управления работой IT подразделения, с назначением работы, с передачей задач, отражения поэтапного выполнения, планирования через мс прожект и т.п.
К тому же, включается выбрасывалка ПОСЛЕ работы.

Ваш вариант основан на заторможенности клиента в случае работы пользователя? Если да, то лично "Нам" на подойдет. Таки работаеют ВСЕ в прозрачном(облачной) Васькином решении))) (WYSE) Аналог удаленки. При загрузке сервера Васькиного, торможение будет У ВСЕХ. Независимо от ранга и регалий.
Но как идея - неплохо.

А регистр последних действий я использую еще и для своих целей. Чтобы всегда наскоро посмотреть кто что делал, не открывая журнала регистрации. Например, кто влез в конфигуратор без санкции на то и разослать нотификацию.
6. Andrey Tey (Bitnikov) 24.09.12 10:35
(2) petrov_al, Без конфигурирования можно внешней библиотекой. Которая проверит время простоя всей системы или аппликейшна или чего другого. Я этим не занимался - не интересно. Нам итак для этой базы в случае миграции поднимать приходиться кучу запросов глобальным командам на установку Прожекта, IIS и т.п. Добавлять еще какую-то библиотеку не интересно, а у самих нас ПРАВ НЕТ.
Лучше уж сообразить своими внутренностями.
А где-то на инфостарте лежит решение через ком соединение. Поиск рулит
7. Andrey Tey (Bitnikov) 24.09.12 10:39
(3) dyak84, ))) Да, будет. настройке монопенисуально на чем двигаться)))
У нас работает на серверном варианте (точнее, на кластере серверов).
"Наш" вариант основан на том, что каждый клиент уничтожает себя самостоятельно))) Суицидально настроенная работа)))

Но! Если нужна обработка, которая завершит на время все соединения, это стандартная "блокировка соединений с информационной базой". Опять же, в поиск.
8. Roman Biblbox (mr zafod) 24.09.12 13:06
(5) Bitnikov, Я не имел ввиду торможения и зависания. Я о том что есть у меня такие финансовые директора, которые бахают отчет о продажах за год по категориям и потом с экрана на собрании его мусолят в течении часа, при этом не обращаясь к базе (т.е. запись в журнал регистрации не производится), однако активно скролят и копипастят отчет. Именно для этого мне пришлось обратиться к обработке ожидания, т.к. любые интерактивные действия пользователя отсрочат выполнение такой обработки, что является показателем активности пользователя.
9. Roman Biblbox (mr zafod) 24.09.12 13:11
(2) petrov_al, ну как вариант выполнения чего-то по расписанию в типовых конфигурациях без изменения давно существует костыль - например, Вам нужно запускать внешнюю обработку из справочника по расписанию. Делаете правила обмена, в параметрах заводите ссылочку на справочник внешних обработок. В правилах ПередВыгрузкой по ссылочке получаете обработку, сохраняете на диск и запускаете (для всего есть штатные средства в типовых).
10. Roman Biblbox (mr zafod) 24.09.12 13:13
(2) petrov_al, Уровень сервера не может знать активен ли пользователь в своем клиентском приложении пока тот не обращается к серверу, об этом знает только клиент, поэтому в конфу лезть приходится
11. Andrey Tey (Bitnikov) 24.09.12 13:51
(8) mr zafod, Да, я это и назвал заторможенностью клиента в случае работы пользователя)) Идея хорошая.
12. Наталия Мастербатова (zzz_natali) 26.09.12 11:04
Что будет, предположим, с открытым документом каким-нить а-ля Требование-накладная-перемещение-списание, который "марьиванна" стряпала пол-дня, остановилась на 324й строке, не сохранилась и срочняком свалила с работы в 18:01, чтобы успеть в садик за ребёнком?
13. Andrey Tey (Bitnikov) 26.09.12 13:00
(12) zzz_natali, отличный вопрос!
В моем исполнении документ деспотично закрывается без сохранение (специфика работы).

А в Вашем случае...
Каждый клиент закрывает себя сам. Пишите в процедуре ПроверитьВремяПростояПользователя() перебор всех открытых форм с записью каждого объекта
14. Доржи Балбаров (Angeros) 27.09.12 07:14
Что-то прочитал тему и не смог понять как-же все таки освободить лицензии. У меня проблема бывает что задание отработало, отвалилось, но при этом ключ удерживает за собой. сама программа уже не живая.
15. Доржи Балбаров (Angeros) 27.09.12 07:18
(12) zzz_natali, думаю логично будет приучить пользователя так не делать. Пару таких уроков и пользователь узнает где на форме есть кнопка записать, а вообще даже без этих технологий бывает свет маргнет комп зависнет - потому на практике то о чем вы говорите маловерятно. Все и так знают что важную работу надо записывать.
16. Andrey Tey (Bitnikov) 27.09.12 10:35
(14) Angeros, в теме описал способ определения неактивности. Освобождение лицензий в названии - лишь последствие удаление неактивных сеансов.

Про удержание лицензий.
Тоже так частенько происходит.

ОПИСАНИЕ
Работаем в серверном варианте. Ключи распределены по трем серверам. nethasp.ini на каждой машине настроили смотреть только два сервера и у узкого круга клиентов смотреть на все три.
Отключаемые машины остаются висеть трупами сеансов с отсчетом времени. При этом в случае повторного соединения, клиент не восстанавливает свою сессию ключа на этом сервере, а может занинять лицензию на другом ключе!

ПОПЫТКА НОМЕР РАЗ
Решения пока нет. Неспешно ищем, лицензий достаточно.
Поначалу покурили описания 1С, погуглили и решили поэкспериментировать с настройками баз на аппликейшне. Установили на всех базах "Разрешить выдачу лицензий сервером 1С:Предприятия" на Нет.

Как только закончим эксперимент и будет решение - напишу статью на Инфостарт.
17. Доржи Балбаров (Angeros) 27.09.12 11:19
(16) Bitnikov, Спасибо за исчерпывающее пояснение, мы также столкнулись с этой проблемой когда клиент открывает новые сессии при этом хавает еще лицензии с другого сервера не учитывая что он уже используется выходит что вместо одного выбирает 2 лицензии... Мы плюнули решать эту проблему и заменили 2 ключа 50+20 на 1. сейчас 100 юзеров. и такой трудности нет. Увы нет возм. заниматься латанием дыр 1с.
18. andrey dyak (dyak84) 03.10.12 13:51
Здраствуйте уважаемый автор. Подскажите как правильно применить вашу идею в 1С 8.2 УТ обычное приложение, Подскажите а сесии которые будут завершатся без подтверждения не будуть висеть на сервере. Зарание спасибо за ответ
19. Andrey Tey (Bitnikov) 03.10.12 15:54
(18) dyak84, добрый день.
Под обычным приложением всего лишь не используйте команды процедур "НаКлиенте" и "НаСервере". Вроде бы не использовал более ничего особенного, т.е. процесс притирки:
1. Создать константы
2. Создать регистр сведений
3. Вставить и подретушировать процедурки (убрать запуск ненужных процедур и функций (такие как проверка полные ли права у пользователя) или дописать нужные функции)

Сессии не будут висеть на КАКОМ сервере? Вы имеете в виду сеанс/соединение на аппликейшне? Или запись об использовании лицензии на хасп лиценз мененджере?

По порядку, если первое, то не будут. Потому что закрывает каждый клиент СЕБЯ САМ. Я не выкидываю его, его клиент 1С сам себя закрывает КОРРЕКТНО.

ЗЫ. Не забывайте ставить ПЛЮСИКИ! Не нравиться статья, то хотя бы за ответы плюсики
20. andrey dyak (dyak84) 03.10.12 18:03
(19) Спасибо за исчерпывающий ответ. Вроде все ясно. Будуть вопросы буду писать. ПЛЮСЫ ПОСТАВИЛ
21. Аркадий Кучер (Abadonna) 24.10.12 00:54
Если уж менять конфу, то и получить от этого желательно по максимуму.
MiracleNative
Метод УстановитьКонтрольАктивности();

Пример обработчика
Функция ПроверитьНеактивность() Экспорт
	ВремяРаботыWindows=Система.ВремяРаботыWindows();
	ИнтервалНеактивности=ПроцедурыСервера.ПолучитьЗначениеКонстанты("ИнтервалНеактивности");
	Если  ИнтервалНеактивности>0 Тогда // контролируется
		Если (ВремяРаботыWindows-ПоследнийКлик)>=ИнтервалНеактивности Тогда
			Неактивность=Истина;
			Система.УдалитьТаймер(60000); // чтобы больше не напоминала
		Иначе
			Неактивность=Ложь; // юзверь таки работает (кликает), блин ;)
		КонецЕсли;
	Иначе
		Неактивность=Ложь; // не контролируется
	КонецЕсли;
	Возврат Неактивность;
КонецФункции

...Показать Скрыть
22. Andrey Tey (Bitnikov) 24.10.12 11:45
(21) Abadonna, спс за информацию, но для МОИХ нужд не пойдет:
1. Потому что за копейку
2. Потому что овчинка не стоит выделки. Что я получу, что пользователь кликает по мышке и пользуется интернетом? Но в системой он не пользуется, поэтому уж лучше ее закрыть.
23. Константин Попов (Konstatine) 10.12.12 15:40
Здравствуйте, уважаемый автор!
Система 1С: Документооборот 8.2 КОРП
Вставил процедуры общего модуля сервера в модуль сеанса (запустил базу без ошибок), потом процедуры модуля приложения в модуль управляемого приложения и пошли ошибки: "Переменная не определена (РаботаСПараметрамиСеанса)", "Переменная не определена (глТекущийПользователь)".
Подскажите, что я делаю неправильно?
24. Andrey Tey (Bitnikov) 09.01.13 16:33
(23) Konstatine, Прошу прощения за молчание. Декабрь выдался тяжелым.
глТекущийПользователь это экспортная переменная, объявленная у меня в модуле управляемого приложения. Если простое объявление не поможет, я покопаюсь в вырезанных модулях и скажу где поправить.
РаботаСПараметрамиСеанса - это серверный модуль, в котором инициируются переменные в том числе. Обратите внимание, что процедуры "для запуска из модуля приложения" НЕ должны иметь команды препроцессора &НаСервере
25. Сергей Шепелев (redgoll) 22.01.13 07:51
Спасибо за идею. Тоже бьюсь с нехваткой лицензий. Народ любит понаоткрывать сеансов. Только боюсь, если я это реализую на практике, пользователи взвоют, как это так 1С-ка сама закрылась, а я хотела поработать. У вас как, нормально к этому отнеслись?
26. Алексей Смирнов (limpsobaka) 19.02.13 11:04
Просьба скинуть на почту обработку limpusoid@yandex.ru.

Заранее спасибо.
27. Andrey Tey (Bitnikov) 19.02.13 16:57
(25) redgoll, У нас под контроль лицензий попадает только наша братия на системах учета рабочего времени. Бизнес подразделения и файнанс неа
28. Andrey Tey (Bitnikov) 19.02.13 16:59
(26) limpsobaka, ммм... Алексей, а обработки то и нет. Это все отдельные модули, которые нужно интегрировать в систему. И то, главное в них - понимание что и зачем делаецца, а не код!
29. Myst (Myst_) 27.02.13 11:16
А почему нельзя было вложить cf файл для быстрого знакомства с кодом,а то фраза ".. Мне важны плюсы с рекомендациями, а не деньги" -- читается в ваше публикации по другому - Созданы Два файла (зачем то ?) чтобы за каждое скачивание файла вам капала вполне конкретная Виртуальная монета?
Cf будет хорошим дополнением статьи.
30. Andrey Tey (Bitnikov) 12.03.13 09:56
(29) Myst_, а почему бы и нет? Но сделаю это как освобожусь. А пока же, уже месяц висит очередная статья, которую все никак не допишу. Времени нет.

В статье я описал СПОСОБ. Для неленивых, чтобы было бесплатно, приложил скрины необходимых модулей.
И цеэфник и тексты модулей (два их, чтобы не отвечать на вопросы куда что помещать) все равно нужно скачивать.
Ну и сходу Ваше пожелание получить конфигурацию выглядит нагло. Я поделился идеей, выложил скрины для бесплатности, а мне предлагаете еще и к Вам приехать, настроить все на месте...

Но, как написал выше, закончу статью (другую) и сделаю CF с голой конфигурацией с примером.
Или... я в статью вложу модули! ИМХО, так будет даже доступнее.
31. Сергей Аблаев (serg1974) 04.09.14 09:32
(1) mr zafod, идея понравилась - но что-то не работает!
команда: ПодключитьОбработчикОжидания("ПроверитьНапоминания", 60);
включает обработку - которая выполняется ровно через 60 секунд - даже если я за 1 мин. успел создать и сохранитть документ!!
версия платформы: 1С:Предприятие 8.2 (8.2.19.83)
книги по 1с8 есть но не смог найти описание этой команды :(
32. Andrey Tey (Bitnikov) 16.09.14 10:30
(31) serg1974, Все правильно, она и должна отрабатывать постоянно. И по журналу работы пользователя система понимает работает ли он или простаивает
33. XoloD (XoloD) 08.10.14 07:05
При запуске регламентного задания регистр сведений ЖурналПоследнихДействий очищается и в него записываются новые записи из журнала регистрации. Как быть с такими моментами, когда регистр очистился и в этот момент идет проверка активности пользователя, соответственно фиксируется, что пользователь не активен ? Ситуация конечно редкая, но можно ли тут как то перестраховаться ?
34. Andrey Tey (Bitnikov) 08.10.14 14:25
(33) XoloD, у нас подобного не встречалось, но идея хорошая.
Рекомендую сделать перед проверкой активности пользователя проверку, что ЖурналПоследнихДействий не пуст. И останавливать проверку, если не заполнен.
В этом случае журнал уже наполниться, при перезапуске проверки.
А если регламентное заполнения ЖурналаПоследнихДействий остановлено и он не заполниться никогда, то и проверке активности незачем отрабатывать.
36. Кирилл Варнаков (kuPyxa) 15.01.15 12:03
А будет работать на файловой базе это все? И подскажите если да, то какой код куда пихать, если не трудно.
37. Andrey Tey (Bitnikov) 16.01.15 18:02
На файловой частично будет работать. Т.е. выбрасывалка будет работать, но РЗ сохранения нужно перевести будет на ту же обработку ожидания.
Про код не отвечу. Писал эту разработку несколько лет назад, описал внедрение как мог подробно, время тратить открывать свой же код и смотреть как делал нет мотивации. Скучно.