По теме из базы знаний
- Опыт лечения базы 1С в клиент-серверном режиме (PostgreSQL)
- Активные пользователи: посмотреть, оповестить, выгнать из базы (updated)
- Передача баз PostgreSQL на удалённый сервер резервных копий, удобное восстановление. Почасовой и ежесуточный вариант. В общем, ещё один скрипт
- Адекватность работодателя. Как её определить? Часть 2. Процесс работы, от испытательного срока до увольнения
- Завершение сеансов пользователей 1С по расписанию для SQL-варианта базы
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Как-то по-другому: код писать надо.
У меня в Бухгалтерии это сделано так (где-то когда-то подсмотрел)
1. В начале глобального модуля объявляем переменные:
2. В самом конце инициализируем их:
3. Добавляем числовую константу ДоЗавершенияРаботы.
4. Добавляем в глобальник процедуру:
5. В начало процедуры ПриНачалеРаботыСистемы дописываем код:
Имена пользователей можно задать свои.
6. В процедуре ПриЗавершенииРаботыСистемы() модифицируем одну строчку:
Вроде всё.
У меня в Бухгалтерии это сделано так (где-то когда-то подсмотрел)
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,ПустоеЗначение(ВосстановитьЗначение("НеЗапрашиватьПодтверждениеПриВыходе")));
Вроде всё.
(3)Хто такое сказал?
Учите матчасть.
ЗавершитьРаботуСистемы(<?>);
Синтаксис:
ЗавершитьРаботуСистемы(<ФлагСохранения>)
Назначение:
вызывает завершение рабоы системы.
Параметры:
<ФлагСохранения> - необязательный параметр. Флаг запроса сохранения открытых объектов. Если равен 0, то не запрашивается сохранение незаписанных документов, элементов справочников и т.п. Если 1, то сохранение запрашивается. Значение по умолчанию 1.
Учите матчасть.
ЗавершитьРаботуСистемы(<?>);
Синтаксис:
ЗавершитьРаботуСистемы(<ФлагСохранения>)
Назначение:
вызывает завершение рабоы системы.
Параметры:
<ФлагСохранения> - необязательный параметр. Флаг запроса сохранения открытых объектов. Если равен 0, то не запрашивается сохранение незаписанных документов, элементов справочников и т.п. Если 1, то сохранение запрашивается. Значение по умолчанию 1.
+(4) Вот если такой вопрос уже задан.
ТО тогда не даст.
Ну или у пользователя открыто модальное окно или выбор периода да и еще куча всяких системных окон.
Для этого есть такая библиотека wrap вроде.
С ее помощью можно грохнуть и при таких окнах.
ТО тогда не даст.
Ну или у пользователя открыто модальное окно или выбор периода да и еще куча всяких системных окон.
Для этого есть такая библиотека wrap вроде.
С ее помощью можно грохнуть и при таких окнах.
(8)
Т.е.надо войти в тот самый сеанс того пользователя? Или можно другой сеанс под тем же именем пользователя для этого запустить? В 1с8.2 можно запускать несколько сеансов от одного имени пользователя, а в 1с7.7 возможно?
# Ответить
запускать надо от имени каждого открытого пользователя, потому что под кем запущена - того пользователя и закроет.
Т.е.надо войти в тот самый сеанс того пользователя? Или можно другой сеанс под тем же именем пользователя для этого запустить? В 1с8.2 можно запускать несколько сеансов от одного имени пользователя, а в 1с7.7 возможно?
# Ответить
(9)
Конечно, у способа, предложенного в (2) есть ограничения с модальными окнами, но зато есть и преимущество: он завершает работу 1С штатно, причем сразу всех (кто не попал под ограничение), а не поодиночке.
То есть, выставляем константу в 1, ждем пару минут, проверяем список пользователей - если все отвалились, то дело сделано, можно заходить под Администратором и работать.
А если кто-то все-таки остался (завис) - тогда можно начинать силовые действия: убивать процессы, отбирать права, подключаться поочередно под каждым из плохишей и т.д.
В 1с8.2 можно запускать несколько сеансов от одного имени пользователя, а в 1с7.7 возможно?
Это зависит не от версии 1С, а от настроек серверной Винды - создаст ли она новый терминальный сеанс или подключит к существующему? Если настроить на единственный сеанс для пользователя, то можно подключаться под каждым зависшим поочередно и выходить из 1С. Вручную.
Конечно, у способа, предложенного в (2) есть ограничения с модальными окнами, но зато есть и преимущество: он завершает работу 1С штатно, причем сразу всех (кто не попал под ограничение), а не поодиночке.
То есть, выставляем константу в 1, ждем пару минут, проверяем список пользователей - если все отвалились, то дело сделано, можно заходить под Администратором и работать.
А если кто-то все-таки остался (завис) - тогда можно начинать силовые действия: убивать процессы, отбирать права, подключаться поочередно под каждым из плохишей и т.д.
(15)
Такого же нет, чтобы был второй одновременный сеанс rdp от того же пользователя. Винда или подключает к существующему или существующий обрывает и создает новый сеанс. А при обрыве существующего закрывает все программы.
Я имел ввиду, что в 1с8.2 есть в свойствах пользователя галочка о разрешении иметь ему несколько сеансов от своего имени(это очень удобно, чтоб отлаживать от пользователя с его настройками, если сам пользователь работает тоже, я сам часто использую), но есть ли такое в 1с7.7(??) не помню, отвык от него.
А ваш способ из (2) попробую, спасибо.
Я не знаю каким образом, но у меня появляются зависшие пользователи многодневной давности, причем терминальных сеансов их нет и процессов нет. При этом помогает перезагрузка сервера с базой.
Это зависит не от версии 1С, а от настроек серверной Винды - создаст ли она новый терминальный сеанс или подключит к существующему? Если настроить на единственный сеанс для пользователя
Такого же нет, чтобы был второй одновременный сеанс rdp от того же пользователя. Винда или подключает к существующему или существующий обрывает и создает новый сеанс. А при обрыве существующего закрывает все программы.
Я имел ввиду, что в 1с8.2 есть в свойствах пользователя галочка о разрешении иметь ему несколько сеансов от своего имени(это очень удобно, чтоб отлаживать от пользователя с его настройками, если сам пользователь работает тоже, я сам часто использую), но есть ли такое в 1с7.7(??) не помню, отвык от него.
А ваш способ из (2) попробую, спасибо.
А если кто-то все-таки остался (завис) - тогда можно начинать силовые действия: убивать процессы, отбирать права, подключаться поочередно под каждым из плохишей и т.д.
Я не знаю каким образом, но у меня появляются зависшие пользователи многодневной давности, причем терминальных сеансов их нет и процессов нет. При этом помогает перезагрузка сервера с базой.
Спасибо за обсуждение, но у меня несколько другая ситуация.
Пользователи не выходят из программы, уходят домой, такие неорганизованные.
Или может у них что-то там в комп-е зависает, я не вижу.
А мне надо ночью хотя бы переиндексацию сделать или какие-то изменения внести, а там в базе их заходы висят. Я не могу их обязывать выходить, они все большие начальники. Но документов больших несохраненных они не ведут. База файловая в рабочей группе, домена нет.
Можно ли запустить внешнюю обработку с одной строчкой ЗавершитьРаботуСистемы(0);
чтоб она и для меня и для всех пользователей завершилась без сохранения, а потом монопольно заходить?
Пользователи не выходят из программы, уходят домой, такие неорганизованные.
Или может у них что-то там в комп-е зависает, я не вижу.
А мне надо ночью хотя бы переиндексацию сделать или какие-то изменения внести, а там в базе их заходы висят. Я не могу их обязывать выходить, они все большие начальники. Но документов больших несохраненных они не ведут. База файловая в рабочей группе, домена нет.
Можно ли запустить внешнюю обработку с одной строчкой ЗавершитьРаботуСистемы(0);
чтоб она и для меня и для всех пользователей завершилась без сохранения, а потом монопольно заходить?
Можно точечно выяснить, какой процесс держит файл *.lck программой handle.exe от Марка Руссиновича, и так же точечно эти процессы поубивать. Несколько более кошерно, чем мочить шару каждый раз.
Повесить в глобальный модуль обработку ожидания, которая мониторит наличие некоего файла в директории базы, и если он появился - ЗавершитьРаботу()
Я решил проблему таким образом:
Этот код в глобальном модуле:
Суть работы:
константа AdПопыткаВыхода = 0, все работают.
константа AdПопыткаВыхода = 1, все получают сообщение, например "Просьба закрыть базу".
константа AdПопыткаВыхода = 2, принудительное закрытие базы по таймеру (это обработка).
Ну и в процедуру ПриНачалеРаботыСистемы() можно вставить проверку константы AdПопыткаВыхода, если не равно 0, тогда ЗавершитьРаботуСистемы().
Все работает на ура.
Если мне надо, через пять минут никого в базе нет.
Этот код в глобальном модуле:
//----------------------------------------------------------------
Процедура ОстановкаСистемы(режим, просьба) Экспорт
Если СокрЛП(ИмяПользователя()) = "Администратор" Тогда
Возврат;
КонецЕсли;
ОчиститьОкноСообщений();
Если режим = 1 Тогда
Предупреждение(просьба, 3);
Сообщить("Сообщение: " + просьба, "!!!");
Константа.AdПопыткаВыхода = 0;
ИначеЕсли Режим = 2 Тогда
ЗаписьЖурналаРегистрации("Сообщение: принудительное закрытие БД.",,,,4);
ОткрытьФорму("Обработка.Таймер");
ИначеЕсли Режим = 3 Тогда
ЗаписьЖурналаРегистрации("Сообщение: принудительное закрытие БД (без запроса).",,,,4);
ОткрытьФорму("Обработка.Таймер");
КонецЕсли;
КонецПроцедуры
//----------------------------------------------------------------
Процедура ПроверкаОстановки() Экспорт
режим = Константа.AdПопыткаВыхода;
Если режим = 0 Тогда
Возврат;
КонецЕсли;
Просьба = Константа.AdПросьба;
ОстановкаСистемы(режим, Просьба);
КонецПроцедуры
//----------------------------------------------------------------
ОбработкаОжидания("ПроверкаОстановки", 20);
глПросьба = "";
глПопыткаВыхода = 0;
ПоказатьСуть работы:
константа AdПопыткаВыхода = 0, все работают.
константа AdПопыткаВыхода = 1, все получают сообщение, например "Просьба закрыть базу".
константа AdПопыткаВыхода = 2, принудительное закрытие базы по таймеру (это обработка).
Ну и в процедуру ПриНачалеРаботыСистемы() можно вставить проверку константы AdПопыткаВыхода, если не равно 0, тогда ЗавершитьРаботуСистемы().
Все работает на ура.
Если мне надо, через пять минут никого в базе нет.
Прикрепленные файлы:
Таймер.ert
(23) повторяем:
(1)
(6)
Пользователи не выходят из программы, уходят домой, такие неорганизованные.
Или может у них что-то там в комп-е зависает, я не вижу.
А мне надо ночью хотя бы переиндексацию сделать или какие-то изменения внести, а там в базе их заходы висят.
(1)
В файловой базе ТиС зависли пользователи, которые не дают работать монопольно вечером.
(6)
Пользователи не выходят из программы, уходят домой, такие неорганизованные.
Или может у них что-то там в комп-е зависает, я не вижу.
А мне надо ночью хотя бы переиндексацию сделать или какие-то изменения внести, а там в базе их заходы висят.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот