bdd2

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

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

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

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

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

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

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

 

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

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

 

Основа:

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

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

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

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

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

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

 

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

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

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

См. также

PowerTools от 1 000
Добавить вознаграждение
Комментарии
1. Roman Biblbox (mr zafod) 22 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) 10 22.09.12 16:35 Сейчас в теме
Все бы ничего, но в конфу из-за этого придется лезть а это делать нехочется. Покрайней мере подключать обработчик нужно в типовых процедурах при начале работы системы. Отсюда вопрос, возможно ли это сделать на уровне сервера 1с?
3. andrey dyak (dyak84) 23.09.12 09:16 Сейчас в теме
Вещь нужная и небходимая.Но подскажите будет ли нормально работать в кластерной много процесорной системе (имется ввиду клиент серверный SQL вариант работы. А то пока не нашел обработки которая завершала сеансы работы пользователей, всех без исключения. Зарание спасибо за ответ
5. Andrey Tey (Bitnikov) 276 24.09.12 10:30 Сейчас в теме
(1) mr zafod, Сорри... предыдущее письмо написал без ссылки.
Блокировку соединений использую, но для другого. В данном случае иные задачи.
Здесь фенечка в том, чтобы определять неработающих пользователей и ЗАКРЫВАТЬ совсем их сессии. Пусть завтра, если таки выйдут на работу, заново откроют.

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

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

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

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

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

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

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

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

...Показать Скрыть
22. Andrey Tey (Bitnikov) 276 24.10.12 11:45 Сейчас в теме
(21) Abadonna, спс за информацию, но для МОИХ нужд не пойдет:
1. Потому что за копейку
2. Потому что овчинка не стоит выделки. Что я получу, что пользователь кликает по мышке и пользуется интернетом? Но в системой он не пользуется, поэтому уж лучше ее закрыть.
23. Константин Попов (Konstatine) 8 10.12.12 15:40 Сейчас в теме
Здравствуйте, уважаемый автор!
Система 1С: Документооборот 8.2 КОРП
Вставил процедуры общего модуля сервера в модуль сеанса (запустил базу без ошибок), потом процедуры модуля приложения в модуль управляемого приложения и пошли ошибки: "Переменная не определена (РаботаСПараметрамиСеанса)", "Переменная не определена (глТекущийПользователь)".
Подскажите, что я делаю неправильно?
24. Andrey Tey (Bitnikov) 276 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) 276 19.02.13 16:57 Сейчас в теме
(25) redgoll, У нас под контроль лицензий попадает только наша братия на системах учета рабочего времени. Бизнес подразделения и файнанс неа
28. Andrey Tey (Bitnikov) 276 19.02.13 16:59 Сейчас в теме
(26) limpsobaka, ммм... Алексей, а обработки то и нет. Это все отдельные модули, которые нужно интегрировать в систему. И то, главное в них - понимание что и зачем делаецца, а не код!
29. Myst (Myst_) 62 27.02.13 11:16 Сейчас в теме
А почему нельзя было вложить cf файл для быстрого знакомства с кодом,а то фраза ".. Мне важны плюсы с рекомендациями, а не деньги" -- читается в ваше публикации по другому - Созданы Два файла (зачем то ?) чтобы за каждое скачивание файла вам капала вполне конкретная Виртуальная монета?
Cf будет хорошим дополнением статьи.
30. Andrey Tey (Bitnikov) 276 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) 276 16.09.14 10:30 Сейчас в теме
(31) serg1974, Все правильно, она и должна отрабатывать постоянно. И по журналу работы пользователя система понимает работает ли он или простаивает
33. XoloD (XoloD) 13 08.10.14 07:05 Сейчас в теме
При запуске регламентного задания регистр сведений ЖурналПоследнихДействий очищается и в него записываются новые записи из журнала регистрации. Как быть с такими моментами, когда регистр очистился и в этот момент идет проверка активности пользователя, соответственно фиксируется, что пользователь не активен ? Ситуация конечно редкая, но можно ли тут как то перестраховаться ?
34. Andrey Tey (Bitnikov) 276 08.10.14 14:25 Сейчас в теме
(33) XoloD, у нас подобного не встречалось, но идея хорошая.
Рекомендую сделать перед проверкой активности пользователя проверку, что ЖурналПоследнихДействий не пуст. И останавливать проверку, если не заполнен.
В этом случае журнал уже наполниться, при перезапуске проверки.
А если регламентное заполнения ЖурналаПоследнихДействий остановлено и он не заполниться никогда, то и проверке активности незачем отрабатывать.
36. Кирилл Варнаков (kuPyxa) 15.01.15 12:03 Сейчас в теме
А будет работать на файловой базе это все? И подскажите если да, то какой код куда пихать, если не трудно.
37. Andrey Tey (Bitnikov) 276 16.01.15 18:02 Сейчас в теме
На файловой частично будет работать. Т.е. выбрасывалка будет работать, но РЗ сохранения нужно перевести будет на ту же обработку ожидания.
Про код не отвечу. Писал эту разработку несколько лет назад, описал внедрение как мог подробно, время тратить открывать свой же код и смотреть как делал нет мотивации. Скучно.