Как выгнать из базы

1. pavel06 2 03.11.16 21:38 Сейчас в теме
В файловой базе ТиС зависли пользователи, которые не дают работать монопольно вечером.
Как их грамотно отключить? Удалить файлы *.LCK из личных папок или как-то по-другому?
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Cooler 22 03.11.16 22:18 Сейчас в теме
(1) Как-то по-другому: код писать надо.

У меня в Бухгалтерии это сделано так (где-то когда-то подсмотрел)

1. В начале глобального модуля объявляем переменные:
Перем ПериодОпроса, ОсталосьДоЗавершенияРаботы;


2. В самом конце инициализируем их:
ПериодОпроса=30; // секунд
ОсталосьДоЗавершенияРаботы=0;


3. Добавляем числовую константу ДоЗавершенияРаботы.

4. Добавляем в глобальник процедуру:
Процедура ОпросСостоянияСистемы()
	Если Константа.ДоЗавершенияРаботы>0 Тогда
		Если ОсталосьДоЗавершенияРаботы=0 Тогда
			ОсталосьДоЗавершенияРаботы=Константа.ДоЗавершенияРаботы*60;
			Предупреждение("Через "+СокрЛП(Константа.ДоЗавершенияРаботы)+" мин программа автоматически завершит работу!"+
					РазделительСтрок+"Просьба сохранить данные и закрыть все открытые окна.",10);
		Иначе
			ОсталосьДоЗавершенияРаботы=ОсталосьДоЗавершенияРаботы-ПериодОпроса;
			Если ОсталосьДоЗавершенияРаботы<=0 Тогда
				ЗавершитьРаботуСистемы(0);
			ИначеЕсли ОсталосьДоЗавершенияРаботы<=60 Тогда
				Предупреждение("До завершения работы осталось "+СокрЛП(ОсталосьДоЗавершенияРаботы)+" сек",5);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать


5. В начало процедуры ПриНачалеРаботыСистемы дописываем код:
	Если Константа.ДоЗавершенияРаботы>0 Тогда
		Если ВРег(ИмяПользователя())="АВТОВЫХОД" Тогда
			СтатусВозврата(0);
			Возврат;
		ИначеЕсли ВРег(ИмяПользователя())="АДМИНИСТРАТОР" Тогда
			Константа.ДоЗавершенияРаботы=0;
		Иначе
			Предупреждение("Установлен режим автоматического завершения работы через "+СокрЛП(Константа.ДоЗавершенияРаботы)+" мин!"+
					РазделительСтрок+"Вход в программу невозможен.",10);
			СтатусВозврата(0);
			Возврат;
		КонецЕсли;
	ИначеЕсли ВРег(ИмяПользователя())="АВТОВЫХОД" Тогда
		Константа.ДоЗавершенияРаботы=2;
		СтатусВозврата(0);
		Возврат;
	КонецЕсли;
	ОбработкаОжидания("ОпросСостоянияСистемы",ПериодОпроса);
Показать

Имена пользователей можно задать свои.

6. В процедуре ПриЗавершенииРаботыСистемы() модифицируем одну строчку:
//	ЗапрашиватьПодтверждениеПриВыходе = ПустоеЗначение(ВосстановитьЗначение("НеЗапрашиватьПодтверждениеПриВыходе"));
	ЗапрашиватьПодтверждениеПриВыходе=?(Константа.ДоЗавершенияРаботы>0,0,ПустоеЗначение(ВосстановитьЗначение("НеЗапрашиватьПодтверждениеПриВыходе")));

Вроде всё.
pavel06; +1
3. alxarz 31 04.11.16 13:16 Сейчас в теме
(2) если правильно помню, недостаток описанного решения - если у пользователя висит не сохраненный документ, то у него повиснет запрос на сохранение и соответственно программа не выйдет...
+
4. varelchik 04.11.16 16:11 Сейчас в теме
(3)Хто такое сказал?
Учите матчасть.
ЗавершитьРаботуСистемы(<?>);
Синтаксис:
ЗавершитьРаботуСистемы(<ФлагСохранения>)
Назначение:
вызывает завершение рабоы системы.
Параметры:
<ФлагСохранения> - необязательный параметр. Флаг запроса сохранения открытых объектов. Если равен 0, то не запрашивается сохранение незаписанных документов, элементов справочников и т.п. Если 1, то сохранение запрашивается. Значение по умолчанию 1.
+
5. varelchik 04.11.16 16:14 Сейчас в теме
+(4) Вот если такой вопрос уже задан.
ТО тогда не даст.
Ну или у пользователя открыто модальное окно или выбор периода да и еще куча всяких системных окон.
Для этого есть такая библиотека wrap вроде.
С ее помощью можно грохнуть и при таких окнах.
+
8. alxarz 31 04.11.16 20:41 Сейчас в теме
(5) всё верно, если висит не сохраненный документ с модальным вопросом - сохранить или нет :)
(6)
Можно ли запустить внешнюю обработку с одной строчкой ЗавершитьРаботуСистемы(0);
запускать надо от имени каждого открытого пользователя, потому что под кем запущена - того пользователя и закроет.
+
9. pavel06 2 05.11.16 01:01 Сейчас в теме
(8)
запускать надо от имени каждого открытого пользователя, потому что под кем запущена - того пользователя и закроет.



Т.е.надо войти в тот самый сеанс того пользователя? Или можно другой сеанс под тем же именем пользователя для этого запустить? В 1с8.2 можно запускать несколько сеансов от одного имени пользователя, а в 1с7.7 возможно?





# Ответить
+
15. Cooler 22 05.11.16 11:51 Сейчас в теме
(9)
В 1с8.2 можно запускать несколько сеансов от одного имени пользователя, а в 1с7.7 возможно?
Это зависит не от версии 1С, а от настроек серверной Винды - создаст ли она новый терминальный сеанс или подключит к существующему? Если настроить на единственный сеанс для пользователя, то можно подключаться под каждым зависшим поочередно и выходить из 1С. Вручную.

Конечно, у способа, предложенного в (2) есть ограничения с модальными окнами, но зато есть и преимущество: он завершает работу 1С штатно, причем сразу всех (кто не попал под ограничение), а не поодиночке.

То есть, выставляем константу в 1, ждем пару минут, проверяем список пользователей - если все отвалились, то дело сделано, можно заходить под Администратором и работать.

А если кто-то все-таки остался (завис) - тогда можно начинать силовые действия: убивать процессы, отбирать права, подключаться поочередно под каждым из плохишей и т.д.
pavel06; +1
16. pavel06 2 06.11.16 00:15 Сейчас в теме
(15)

Это зависит не от версии 1С, а от настроек серверной Винды - создаст ли она новый терминальный сеанс или подключит к существующему? Если настроить на единственный сеанс для пользователя


Такого же нет, чтобы был второй одновременный сеанс rdp от того же пользователя. Винда или подключает к существующему или существующий обрывает и создает новый сеанс. А при обрыве существующего закрывает все программы.

Я имел ввиду, что в 1с8.2 есть в свойствах пользователя галочка о разрешении иметь ему несколько сеансов от своего имени(это очень удобно, чтоб отлаживать от пользователя с его настройками, если сам пользователь работает тоже, я сам часто использую), но есть ли такое в 1с7.7(??) не помню, отвык от него.

А ваш способ из (2) попробую, спасибо.


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


Я не знаю каким образом, но у меня появляются зависшие пользователи многодневной давности, причем терминальных сеансов их нет и процессов нет. При этом помогает перезагрузка сервера с базой.
+
6. pavel06 2 04.11.16 17:01 Сейчас в теме
Спасибо за обсуждение, но у меня несколько другая ситуация.
Пользователи не выходят из программы, уходят домой, такие неорганизованные.
Или может у них что-то там в комп-е зависает, я не вижу.
А мне надо ночью хотя бы переиндексацию сделать или какие-то изменения внести, а там в базе их заходы висят. Я не могу их обязывать выходить, они все большие начальники. Но документов больших несохраненных они не ведут. База файловая в рабочей группе, домена нет.

Можно ли запустить внешнюю обработку с одной строчкой ЗавершитьРаботуСистемы(0);
чтоб она и для меня и для всех пользователей завершилась без сохранения, а потом монопольно заходить?
+
7. alex-l19041 8 04.11.16 18:54 Сейчас в теме
если работают по rdp, то можно убивать процессы
+
10. DenisCh 05.11.16 08:03 Сейчас в теме
в 1с7.7 возможно?

Да.

(0) Проще всего отключить шару (если по сети работают) или (если терминал) - отнять права на каталог, а потом вернуть.
корум; +1
11. alxarz 31 05.11.16 08:29 Сейчас в теме
(10) после отнятия шары надо lck файлы подчищать...
+
12. DenisCh 05.11.16 08:33 Сейчас в теме
(11) Если шара отнята, локи превращаются в тыкв^W обычные файлы, которые прекрасно перезаписываются при новом сеансе.
+
13. igel9780 171 05.11.16 09:41 Сейчас в теме
Можно точечно выяснить, какой процесс держит файл *.lck программой handle.exe от Марка Руссиновича, и так же точечно эти процессы поубивать. Несколько более кошерно, чем мочить шару каждый раз.
+
14. DenisCh 05.11.16 11:21 Сейчас в теме
(13) Кошерней кликать мышой 100500 раз вместо одного?
Какой-то кашрут у вас неправильный...

Если уж зашла речь о Руссиновиче, то тогда лучше анлок взять
+
18. igel9780 171 07.11.16 07:28 Сейчас в теме
(14) А зачем мышкой кликать, когда батник в три строки пишется?

HANDLE.EXE %1 > %2
FOR /F "skip=5 tokens=2,3" %%i in (%2) do TASKKILL /PID %%j /T /F >> %3
DEL /Q %2
+
17. imax26 91 07.11.16 02:36 Сейчас в теме
Повесить в глобальный модуль обработку ожидания, которая мониторит наличие некоего файла в директории базы, и если он появился - ЗавершитьРаботу()
+
19. an2007 16.11.16 13:10 Сейчас в теме
Я решил проблему таким образом:
Этот код в глобальном модуле:
//----------------------------------------------------------------
Процедура ОстановкаСистемы(режим, просьба) Экспорт
	
	Если СокрЛП(ИмяПользователя()) = "Администратор" Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьОкноСообщений(); 
	Если режим = 1 Тогда
		Предупреждение(просьба, 3);
		Сообщить("Сообщение: " + просьба, "!!!");
		Константа.AdПопыткаВыхода = 0;
	ИначеЕсли Режим = 2 Тогда
		ЗаписьЖурналаРегистрации("Сообщение: принудительное закрытие БД.",,,,4);
		ОткрытьФорму("Обработка.Таймер");
	ИначеЕсли Режим = 3 Тогда
		ЗаписьЖурналаРегистрации("Сообщение: принудительное закрытие БД (без запроса).",,,,4);
		ОткрытьФорму("Обработка.Таймер");
	КонецЕсли;
	
КонецПроцедуры

//----------------------------------------------------------------
Процедура ПроверкаОстановки() Экспорт
	
	режим = Константа.AdПопыткаВыхода;
	Если режим = 0 Тогда
		Возврат;
	КонецЕсли;
	Просьба = Константа.AdПросьба;
	ОстановкаСистемы(режим, Просьба);
	
КонецПроцедуры

//----------------------------------------------------------------
ОбработкаОжидания("ПроверкаОстановки", 20);
глПросьба = "";
глПопыткаВыхода = 0;
Показать

Суть работы:
константа AdПопыткаВыхода = 0, все работают.
константа AdПопыткаВыхода = 1, все получают сообщение, например "Просьба закрыть базу".
константа AdПопыткаВыхода = 2, принудительное закрытие базы по таймеру (это обработка).
Ну и в процедуру ПриНачалеРаботыСистемы() можно вставить проверку константы AdПопыткаВыхода, если не равно 0, тогда ЗавершитьРаботуСистемы().
Все работает на ура.
Если мне надо, через пять минут никого в базе нет.
Прикрепленные файлы:
Таймер.ert
+
20. корум 287 16.11.16 13:49 Сейчас в теме
(19) это частичное решение проблемы.
Если кто-то забил и ушёл домой, оставив модальное системное окно, обработкаОжидания ему по барабану.

(0) тебе один чёрт нужен монопольный доступ, реиндексация минимальное из зол.
Используй метод в (10) и будь счастлив.
+
21. пользователь 17.11.16 13:55
Сообщение было скрыто модератором.
...
22. корум 287 17.11.16 14:08 Сейчас в теме
(21) отрубание шары скидывает сразу всех
+
23. Shreki2015 2 17.11.16 14:52 Сейчас в теме
(22) но влечет за собой переиндексацию если DBF и маты пользователей если делали мега пупер документ и не сохранили.
+
24. корум 287 17.11.16 15:00 Сейчас в теме
(23) повторяем:
(1)
В файловой базе ТиС зависли пользователи, которые не дают работать монопольно вечером.

(6)

Пользователи не выходят из программы, уходят домой, такие неорганизованные.
Или может у них что-то там в комп-е зависает, я не вижу.
А мне надо ночью хотя бы переиндексацию сделать или какие-то изменения внести, а там в базе их заходы висят.

+
25. Shreki2015 2 17.11.16 15:53 Сейчас в теме
(24) сори. пропустил.
тогда как вариант.
+
26. imax26 91 25.04.17 06:04 Сейчас в теме
Ну можно просто по ночам сервер перегружать перед регламентыми действиями.

Shutdown -r -t 1 -f поможет
ну или sudo shutdown -r now
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот