Имя: Пароль:
1C
1С v8
выгонялка пользователей из 1с
0 dron4ikkk
 
17.09.14
10:17
Всем привет! Кто что может посоветовать по поводу выгонялки пользователей из базы? нашел код, но он не срабатывает:

в процедуре ПриНачалеРаботыСистемы

Если Справочники.ПользователиАктивные.НайтиПоНаименованию(ИмяПользователя())=Справочники.ПользователиАктивные.ПустаяСсылка() Тогда
        ПолН= Справочники.ПользователиАктивные.СоздатьЭлемент();
        ПолН.ОтВремя = Дата(1, 1, 1, 10, 13, 0);
        ПолН.ДоВремя = Дата(1, 1, 1, 10, 14, 0);
        
        ПолН.Допуск = Истина;
        ПолН.Наименование = ИмяПользователя();
        ПолН.Счетчик = 0;
        ПолН.Записать();
    Иначе
        Вр = Дата(1, 1, 1, Час(ТекущаяДата()), Минута(ТекущаяДата()), Секунда(ТекущаяДата()));
        //Формат(ТекущаяДата(),"ДФ=ЧЧммсс");
        Пол= Справочники.ПользователиАктивные.НайтиПоНаименованию(ИмяПользователя()).ПолучитьОбъект();
        Если ((Пол.ДоВремя>=Вр) и (Пол.ОтВремя<=Вр)) или (Пол.Допуск = ложь) тогда
            Предупреждение("Резервное копирование. Работу можно будет возобновить в " + пол.ДоВремя,5);
            ЗавершитьРаботуСистемы(Ложь);
        КонецЕсли;
    КонецЕсли;
     ПодключитьОбработчикОжидания("Выход",60,Ложь);



Процедура Выход()  Экспорт
Вр = Дата(1, 1, 1, Час(ТекущаяДата()), Минута(ТекущаяДата()), Секунда(ТекущаяДата()));
Пол= Справочники.ПользователиАктивные.НайтиПоНаименованию(ИмяПользователя()).ПолучитьОбъект();
  Если  ((Пол.ДоВремя>=Вр) и (Пол.ОтВремя<=Вр)) Или (Пол.Допуск = ложь)  Тогда
    Если Пол.Счетчик = 0 Тогда
        Пол.Счетчик = 0;
        Пол.Записать();
        Предупреждение("Завершение работы системы через 5 минут", 5);
    Иначе
        ТСчетчик = Счетчик;
        ТСчетчик = ТСчетчик-60;
        Пол.Счетчик = ТСчетчик;
        Пол.Записать();
        Если ТСчетчик=0 Тогда
            Предупреждение("Резервное копирование. Работу можно будет возобновить в " + пол.ДоВремя,5);
            ЗавершитьРаботуСистемы(Ложь)
        КонецЕсли;
    КонецЕсли;
   КонецЕсли;
        
КонецПроцедуры
1 ДенисЧ
 
17.09.14
10:20
Перезапускаем службу сервера и вуаля.
Пользователей нет.
2 dron4ikkk
 
17.09.14
10:22
(1) жестко, текущие работы в документах не сохранятся
3 ДенисЧ
 
17.09.14
10:22
(2) тогда сначала позвони.
4 dron4ikkk
 
17.09.14
10:23
(3) вообще классно, каждый день звонить предлагаешь
?
5 Любопытная
 
17.09.14
10:25
У Раруса в Альфа-Авто клевая выгонялка - выгоняет всех безотказно. подсмотри там
6 kosts
 
17.09.14
10:26
(4) В типовых есть. Можно глядеть.

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

Предупреждение("Завершение работы системы через 5 минут", 5);
7 dron4ikkk
 
17.09.14
10:26
(5) ок спасибо!
8 ДенисЧ
 
17.09.14
10:27
(4) Предлагаю назначить время для обновлений и в это время выгонять всех без вопросов.
А если что-то суперэекстренное, то и позвонить можно.
9 бомболюк
 
17.09.14
10:37
а сейчас штатными средствами гарантированно выгоняются все или нет? не приходится так сказать выживших добивать через консоль сервера?
10 dron4ikkk
 
17.09.14
10:48
(9) насчет этого не знаю)
11 dron4ikkk
 
17.09.14
10:48
(6) почему?
12 dron4ikkk
 
17.09.14
10:49
(6) Если ТСчетчик=0 Тогда
            Предупреждение("Резервное копирование. Работу можно будет возобновить в " + пол.ДоВремя,5);
            ЗавершитьРаботуСистемы(Ложь)
        КонецЕсли;



по сути должно автоматом выгонять
13 kosts
 
17.09.14
11:33
(11) Все нормально, туплю
14 John83
 
17.09.14
14:51
УПП открой
PS а кто-нить знает выгонялку для файловой?
15 DasTPID
 
17.09.14
15:09
(14)
Процедура ПриНачалеРаботыСистемы()
...
    
    //TPID+
    ПодключитьОбработчикОжидания("АНеПораЛиОтдохнуть",600, Ложь);



Процедура АНеПораЛиОтдохнуть() Экспорт
    Если Час(ТекущаяДата()) = 2 Тогда
        ЗавершитьРаботуСистемы(ложь);
    КонецЕсли    
КонецПроцедуры



Не срабатывает, если бухи делают перепроведение документов или если оставить на ночь конфигуратор
16 shuhard
 
17.09.14
15:13
(15) дык конекты на сервере режуться
вот рабочий код, параметры через строку запуска
// до тех пор, пока соединений много, надо убивать всех, кроме себя
    // когда останется одно соединение закроем приложение и подождем внешним wait-ом
    // получим всё необходимое через строку запуска
    // адрес сервера;база;логин;пароль
    Сообщить("-->"+ПараметрЗапуска);
    ПараметрыЗапуска = РазложитьСтрокуВМассивПодстрок(ПараметрЗапуска,";");   // вернётся массив
    //Сообщить(ПараметрыЗапуска[0]);
    //Сообщить(ПараметрыЗапуска[1]);
    //Сообщить(ПараметрыЗапуска[2]);
    //Сообщить(ПараметрыЗапуска[3]);
    Если  ПараметрыЗапуска.ВГраница()<>3 Тогда
        ЗавершитьРаботуСистемы(Ложь);
        Возврат;
    КонецЕсли;
    НомерСоединения=0;
    Пользователь=ПараметрыЗапуска[2];
    Пароль=ПараметрыЗапуска[3];
    Попытка
        СтрокаСоединения=СтрокаСоединенияИнформационнойБазы();
        ЭтоСоединение=НомерСоединенияИнформационнойБазы();
        База=ПараметрыЗапуска[1];
        КОМ=Новый COMОбъект("V82.COMConnector");
        Сервер=ПараметрыЗапуска[0];
        Агент=КОМ.ConnectAgent(Сервер);
        Кластеры=Агент.GetClusters();
        Кластер=Кластеры.GetValue(0);
        Агент.Authenticate(Кластер,"","");        
        РабочиеПроцессы=Агент.GetWorkingProcesses(Кластер);
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        Для Каждого Процесс Из РабочиеПроцессы Цикл
            СтрокаСоединенияРП=Процесс.HostName+":"+Формат(Процесс.MainPort,"ЧГ=");
            СоединениеРП=КОМ.ConnectWorkingProcess(СтрокаСоединенияРП);
            СоединениеРП.AddAuthentication(Пользователь,Пароль);
            ОписаниеИБ=СоединениеРП.CreateInfoBaseInfo();
            ОписаниеИБ.Name=База;
            Соединения=СоединениеРП.GetInfoBaseConnections(ОписаниеИБ);
            Для Каждого Соединение Из Соединения Цикл
                Если Соединение.AppID="COMConsole" Тогда
                    Продолжить;
                КонецЕсли;
                Если Соединение.ConnID<>ЭтоСоединение Тогда
                    СоединениеРП.Disconnect(Соединение);  // всех кроме себя
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
        КОМ=Неопределено;
        ЗавершитьРаботуСистемы(Ложь);
    Исключение
        //Сообщить(ОписаниеОшибки());
    КонецПопытки;

Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
    
    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока Истина Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = СокрЛ(Сред(Стр,Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока Истина Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = Сред(Стр,Поз+ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;
    
КонецФункции // глРазложить
17 КонецЦикла
 
17.09.14
15:17
"...\bin\1cv8.exe" ENTERPRISE /F"КаталогИБ" /NИмя /PПароль /WA- /AU- /DisableStartupMessages /CЗавершитьРаботуПользователей
18 break
 
17.09.14
15:19
желательно еще перед выгоном блокировку ставить
19 shuhard
 
17.09.14
15:19
(17) не а, не работает для зависших сеансов, а за день таких туча набегает
20 КонецЦикла
 
17.09.14
15:19
(19) У меня вроде работает
21 КонецЦикла
 
17.09.14
15:19
Хотя я один обычно дома... хз... :)
22 КонецЦикла
 
17.09.14
15:23
Это к вопросу о файловой. Помогало когда говорили "да вася же вышел!"
23 shuhard
 
17.09.14
15:44
(21) а те 1с.exe сруби на клиенте дома, ты же не на файловой это проверяешь ?