0. mityushov.vv 130 27.09.18 10:23 Сейчас в теме

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

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

Перейти к публикации

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

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

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

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

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

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


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

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


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

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

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

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


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

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



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

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

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

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

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

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

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

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

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

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

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

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

Вакансии

Программист 1С
Нижневартовск
зарплата от 60 000 руб.
Полный день

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день