Автоматическое отключение пользователя из системы 1С:Предприятие в случае, когда пользователь не работает в запущенном сеансе

Публикация № 911670

Администрирование - Системное

11
Доработка сделана через расширение, платформа 8.3.12.1529 (8.3.11.2867), работает на конфигурациях 1С: ЗУП, БП, КА, ERP и т.д. в общем на всех основных конфигурациях 1С: Предприятие. Часто бывает, что в организации пользователь с утра запускает 1С и уходит на весь день по своим делам, а лицензия израсходована. Для оптимизации использования лицензий на предприятии и сделана данная доработка. Доработка позволяет в автоматическом режиме выбрасывать пользователей из системы 1С если пользователь не работает в системе. По умолчанию проверка активности пользователя происходит через 2 часа после запуска системы, но данный параметр можно настраивать отдельно для каждого пользователя. Если пользователь не активен его сессия закрывается. Расширение работает как в клиент - серверном так и в файловом варианте работы 1С

Скачиваем расширение и проделываем следующие шаги. В приложенных файлах 2 расширения одно с режимом совместимости "Версия 8.3.10", второй файл без режима совместимости для самых "свежих" конфигураций.

Добавляем расширение в конфигурацию

По кнопке "Добавить" загружаем скаченное расширение

Отключаем "галочку" - "Безопасный режим, имя профиля"

Добавляем 2 новых значения в "Дополнительных сведениях"

Для справочника "Пользователи" добавляем 2 новых значения

ВАЖНО!!! Тип значения и имя свойство должно полностью соответствовать тому что указано на скринах

Далее, при необходимости если нужно для какого то из пользователей установить время работы в системе менее или более 2 часов. Заходим в справочник "Пользователя" и для необходимого пользователя устанавливаем значение "Время работы пользователя (минуты)".

Кстати, если у кого то нету доступа к консоли серверов, а пользователя нужно отключить. Можно у необходимого пользователя поменять время начала сеанса (сделать минус 2 часа) и в течении 15 минут пользователь будет отключен от системы. Проверка осуществляется каждые 15 минут.

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

P.S. коллеги если вам понравилась публикация, не забываем проставлять "звездочки" в рейтинге разработки.

11

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

Наименование Файл Версия Размер
Автоматическое отключение пользователя из системы 1С:Предприятие (Режим совместимости "Версия 8.3.10")
.cfe 9,01Kb
27.09.18
8
.cfe 9,01Kb 8 Скачать
Автоматическое отключение пользователя из системы 1С:Предприятие (Режим совместимости "Не использовать")
.cfe 8,96Kb
27.09.18
7
.cfe 8,96Kb 7 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Darklight 17 27.09.18 13:53 Сейчас в теме
"Грубое решение" на мой взгляд. С пользователями надо как-то по-деликатнее обходиться. Не многим понравится получать такой вопрос по среди экрана в запарке заполнения какого-то важного документа, со сбросом фокуса ввода, хоть и с периодичностью 2 часа. В управляемом приложении я бы ж/р сначала анализировал - если за последний час там есть события (как в конфигурациях на упр. прил. даже отчеты там оставляют следы), то ничего не спрашивал бы.

Ещё есть разные способы по отслеживанию открываемых окон - если открывались - то не спрашивал бы.

Ну и сам вопрос надо как-то аккуратнее выдавать. Может быть через оповещения пользователю (с версии 8.3.10 как раз можно фидбеки получать при нажатии).

А если уж задаёте вопрос - то пользователь случайно, в запарке, может нажать нет - и закрыть свою сессию с несохранёнными данными.
Зачем "вопрос" - вообще не ясно - пользователь либо реагирует, либо не реагирует - если его нет рядом. Достаточно было и простого предупреждения с таймаутом на закрытие (вопрос с одной кнопкой - т.к. предупреждение не умеет отслеживать событие таймаута).

Кстати, не видно на кнопке "Нет" таймаута - вопрос же будет висеть "вечно"!

Я вот так бы написал алгоритм вопроса (в самом простом виде - написано для контекста формы для простоты):


&НаКлиенте
Процедура ВопросПользователю()
	Кнопки = Новый СписокЗначений();
	Кнопки.Добавить(КодВозвратаДиалога.Да,"Да");
	оп = Новый ОписаниеОповещения("ОтветПользователя",ЭтаФорма);
	ПоказатьВопрос(оп,"Вы тут?",Кнопки,60,,"1С Предприятие ещё нужно?");
КонецПроцедуры

&НаКлиенте
Процедура ОтветПользователя(Результат, ДопПараметры) экспорт
	Если Результат = КодВозвратаДиалога.ТаймаутТогда
		ЗавершитьРаботуСистемы(Ложь); //Хотя, по-хорошему, пользователю нужно дать ещё один шанс подтвердить что он тут по-позже ещё вернётся и будет работать
	КонецЕсли;
        СбросТаймера();
КонецПроцедуры
Показать


Хотя странно - у меня в таком виде тоже не видно таймера отсчета таймаута на кнопке "Да" - хотя реально таймер срабатывает и возвращает результат "КодВозвратаДиалога.Таймаут". При этом, что ещё страннее, если написать так
"ПоказатьВопрос(оп,"Вы тут?",Кнопки,60,,,КодВозвратаДиалога.Да);"
т.е. задать результат для таймаута - всё равно возвращает по таймауту "КодВозвратаДиалога.Таймаут" (но при этом на кнопке возникает отсчет таймаута).

Хотя я бы, всё-таки, использовал оповещение, а не вопрос:

&НаКлиенте
Процедура Команда1(Команда)
	оп = Новый ОписаниеОповещения("ОтветПользователя",ЭтаФорма);
	ЗапускПоследнегоОтсчета();
	ПоказатьОповещениеПользователя("Нажмите, если Вы тут",оп,"Иначе закроем 1С: Предприятие",БиблиотекаКартинок.ТревожнаяКартинка,СтатусОповещенияПользователя.Важное,"Нажмите, если Вы тут");
КонецПроцедуры

&НаКлиенте
Процедура ОтветПользователя(ДопПараметры) экспорт
	СбросТаймера();
КонецПроцедуры
Показать


Но тут сложнее - нет события таймаута - его нужно отслеживать в овертайме счетчика основного таймера!

И пользователю нужно дать ещё 1-2 шанса ответить - а вдруг он в канун того самого момента таймера вышел.... ээээ.... срочно в туалет или его вызвал начальник - а у него важные дела открыты в 1С и не сохранены.... вот возвращается он - а тут .... всё пропало!



Но главное - такое решение, скорее всего, не решает проблему зависших сессий (там, скорее всего и код вопроса то не отработает) - их нужно отдельно на сервере отслеживать и закрывать.
Dream_kz; +1 Ответить
2. mityushov.vv 128 27.09.18 14:37 Сейчас в теме
(1) Много написали)))
Да вариантов реализации много, хотите допилите сами.
Но данное решение работает уже не в одной организации и ничего пользователи не возмущаются.
Наоборот это решение дисциплинирует пользователя при работе с системой. Не надо куда то убегать ничего не сохранив в 1С.
А если пользователь в запарке куда то там нажал, ну надо значит воспитывать таких пользователей что бы в запарке они никуда не нажимали.
Это из области "Я ехала на мерседесе и засмотрелась в телефон и врезалась" Кто в этом виноват производители Мерседеса?

Да вопрос зависших сеансов эта доработка не решает, зависшие сеансы иногда и через консоль серверов "убить" не получается, только помогает перезапуск агента сервера.

Зато эта доработка решает вопрос с нехваткой лицензий очень, очень хорошо, и экономит большие деньги для организации на покупку доп лицензий.

Представляете в той организации где я ранее работал было 800 пользователей, и если они откроют по одному разу 4-5 разных баз и убегут в туалет на 5 часов. Там вообще ни каких лицензий не хватит.
4. Darklight 17 27.09.18 14:52 Сейчас в теме
(2)Это будет больше похоже не на воспитание а на дрессировку. Ну, не мне Вас судить. Не жалуются - ну и хорошо. У меня бы вой был бы на всю компанию! Пользователи тут ого-го с каким норовом есть. Да и простой офисный планктон бы тоже ещё тот писк поднял бы!

А контроллировать многократно занятые лицензии - лучше через web-сервис, и механизм "Внешнее управление сеансами" - через обработку каждого нового сеанса. Там и число сеансов можно ограничить на пользователя (причем по своей логике и классификации пользователей). Вести учет числа занятых лицензий и заниматься поиском как зависших сеансов, так и сеансов с отлучившимися надолго, сотрудниками - когда лицензий станет не хватать.

ну а вообще-то, если пользователи часто открывают по куче баз - лучше использовать аппаратные ключи - экономически более выгодно - на крайняк - ставить лицензии на компьютеры (если, конечно, речь не идёт о работе в web, хотя на лицензии на копьютеры, кажется, и в терминальном сервере тоже нельзя использовать).
5. mityushov.vv 128 27.09.18 15:19 Сейчас в теме
(4) У нас как раз вся работа через терминальный сервер и планируется работа через web.
Тем более уже лицензии куплены и стоят на сервере, один ключ. На каждый компьютер покупать нет возможности и так далее.

Тем более эта разработка рассчитана как на работу в клиент-серверном так и в файловом режиме работы 1С. Кстати про это надо написать, забыл.

А тут просто скачивается расширение ставиться на базу 5 минут без каких либо доработок системы и снятия ее с поддержки.

А если у вас дерзкие пользователи, значит ИТ наверное всегда в запарке и всегда во всем виновато))) ну это уже как бы ваши проблемы и не мне вас судить.
6. Darklight 17 27.09.18 15:28 Сейчас в теме
(5)У нас как раз чем больше сеансов открыто - тем нам лучше - дочерним компаниям мы сдаём лицензии в аренду - и считаем макс число открытых сеансов в день по организациям - выставляем в конце месяца счет!
Пока лишь просто ограничились макс числом сеансов на пользователя, и ночью все (не находящиеся в исключении) сеансы закрываются.
3. mityushov.vv 128 27.09.18 14:40 Сейчас в теме
(1) Таймаут кстати у меня 5 минут, можно поменять при желании

&НаКлиенте
Процедура КлиентГлобальныйПриНачалеРаботыСистемы() Экспорт
	
	ПолныеПраваМодуль.УстановитьВремяНачалаСеанса();
	
	ПодключитьОбработчикОжидания("ПроверитьНеобходимостьДальнейшейРаботыПользователя", 900);

КонецПроцедуры

&НаКлиенте
Процедура ПроверитьНеобходимостьДальнейшейРаботыПользователя() Экспорт
	
	ВремяРаботыВБазе = 120;
	ВремяНачалаСеанса = ПолныеПраваМодуль.ПолучитьВремяНачалаСеанса();
	Если ЗначениеЗаполнено(ВремяНачалаСеанса) Тогда 
		ВремяРаботыПользователя = ПолныеПраваМодуль.ПолучитьВремяРаботыПользователяВСистеме();
		Если ВремяРаботыПользователя > 0 Тогда
			ВремяРаботыВБазе = ВремяРаботыПользователя;
		КонецЕсли;
		
		Если ТекущаяДата() - ВремяНачалаСеанса > ВремяРаботыВБазе * 60 Тогда
			ПоказатьОповещениеПользователя("! Завершение работы 1С !");
			
			Режим = РежимДиалогаВопрос.ДаНет;
			Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса",СтандартныеПодсистемыКлиент);
			ПоказатьВопрос(Оповещение, "Система запрашивает необходимость продолжения работы с информационной базой." + Символы.ПС + "Продолжить работу?", Режим, 300);
		КонецЕсли;	
	КонецЕсли;		
	
КонецПроцедуры
Показать
Оставьте свое сообщение