Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Отключить сеанс

Отключить сеанс
Я
   Mikhail Volkov
 
02.02.21 - 15:28
Смотрю тему Отключение зависших сеансов  на сервере., у меня выдает: Метод объекта не обнаружен (ОтключитьСеанс)!? Как исправить?
   Kigo_Kigo
 
1 - 02.02.21 - 15:35
а режим совместимости какой?
   fisher
 
2 - 02.02.21 - 15:37
(1) Это ты так издалека к версии БСП подбираешься? :)
   Kigo_Kigo
 
3 - 02.02.21 - 15:38
(2) ога, сам сталкивался с подобным
   Mikhail Volkov
 
4 - 02.02.21 - 15:58
(1) Версия 8.2.16, платформа 8.3.10.2466, обычное приложение (не УФ) Альфа-Авто.
   ДенисЧ
 
5 - 02.02.21 - 16:39
(4) У тебя там БСП (если она вообще есть) древней египетских пирамид...
   Deal with it
 
6 - 02.02.21 - 16:54
Пользуюсь таким примером:
Если Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr") > 0 Тогда
        // серверный вариант

        Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr=");
        ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 6);
        ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
        // теперь ищем имя базы

        Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Ref=");
        ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 5);
        ИмяБазы = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
    Иначе
        // для других способов подключения алгоритм не актуален

        Возврат;
    КонецЕсли;
    
    МассивИсключений = Новый Массив;
    МассивИнденксов = Новый Массив;
    
    Для Каждого Стр Из Исключения Цикл 
        МассивИсключений.Добавить(Стр.Значение.Наименование);
    КонецЦикла;
    
    Коннектор = Новый COMОбъект("v83.COMConnector.1"); 
    //Сообщить("СОМ объект успешно получен");//////////////////

    Агент = Коннектор.ConnectAgent(ИмяСервера);
    //Сообщить("Агент сервера успешно получен"); ////////////////////

    Кластеры = Агент.GetClusters();
    Для каждого Кластер из Кластеры Цикл
        АдминистраторКластера = "admins";
        ПарольКластера = "E8vbteud";
        Агент.Authenticate(Кластер, АдминистраторКластера, ПарольКластера);
        //Сообщить("Утентификация сервера успешно получена"); ////////////////////

        Процессы = Агент.GetWorkingProcesses(Кластер);
        Для каждого Процесс из Процессы Цикл
            Порт = Процесс.MainPort;
            // теперь есть адрес и порт для подключения к рабочему процессу

            РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
            РабПроц.AddAuthentication("Admin", "4615426");
            
            //Сообщить("Утентификация рабочего процесса успешно выполнена"); ////////////////////

            
            ИнформационнаяБаза = "";
            
            Базы = Агент.GetInfoBases(Кластер);
            Для каждого База из Базы Цикл
                Если База.Name = ИмяБазы Тогда
                    ИнформационнаяБаза = База;  
                    //Сообщить(ИнформационнаяБаза);/////////////

                    Прервать;
                КонецЕсли;
            КонецЦикла;
            Если ИнформационнаяБаза = "" Тогда
                // база не найдена

            КонецЕсли;
            
            Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
            Для каждого Сеанс из Сеансы Цикл
                
                Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" Или  нРег(Сеанс.AppID) = "SrvrConsole"Тогда
                    // если это сеансы конфигуратора или фонового задания, то не отключаем

                    Продолжить;
                КонецЕсли;
                Если Сеанс.UserName = ИмяПользователя() Тогда
                    // это текущий пользователь

                    Продолжить;
                КонецЕсли;
                Если МассивИсключений.Найти(Сеанс.UserName) = Неопределено Тогда  
                    а=0;        
                    //Сообщить(Сеанс.UserName);/////////////

                    Агент.TerminateSession(Кластер, Сеанс);
                КонецЕсли;
                
            КонецЦикла;
            
            ИнформационнаяБаза2 = РабПроц.CreateInfoBaseInfo();
            ИнформационнаяБаза2.Name = ИмяБазы;
            СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза2);
            
            //СоединенияБазы = Агент.GetInfoBaseConnections(Кластер, ИнформационнаяБаза);

            // Разорвать соединения клиентских приложений.

            Для Каждого Соединение Из СоединенияБазы Цикл
                
                Если нРег(Соединение.AppID) = "backgroundjob" 
                    Или  нРег(Соединение.AppID) = "designer" 
                    Или нРег(Соединение.AppID) = "SrvrConsole"
                    Или нРег(Соединение.AppID) = "COMConsole" 
                    Или  нРег(Соединение.AppID) = "SystemBackgroundJob" Тогда
                    
                    // если это соединение конфигуратора или фонового задания, то не отключаем

                    Продолжить;
                КонецЕсли;
                
                Если Соединение.UserName = ИмяПользователя() Тогда
                    // это текущий пользователь

                    Продолжить;
                КонецЕсли;
                
                Если МассивИсключений.Найти(Соединение.UserName) = Неопределено Тогда
                    // это текущий пользователь

                    а=0;
                    //Сообщить(Соединение.UserName);/////////////

                    РабПроц.Disconnect(Соединение);
                КонецЕсли;                
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
   Deal with it
 
7 - 02.02.21 - 16:55
+(6) плюс на форме обработки у меня список значений, куда добавляю пользователей, которых не завершать, т.е. исключения.
   Mikhail Volkov
 
8 - 02.02.21 - 17:18
(6) Вообще-то мне надо закрыть конфигуратор (и желательно фоновые задания) по завершению работы последнего пользователя в базе...
   Deal with it
 
9 - 02.02.21 - 17:21
(8) ну так уберите из кода эти условия, и завершать будет вообще все сеансы и подключения к базе.

Типа такие условия: нРег(Сеанс.AppID) = "backgroundjob".
   Deal with it
 
10 - 02.02.21 - 17:23
+(9) код рабочий, если ком обьект v83.COMConnector.1 (или как он у вас назван в службе компонентов) зарегистрирован в системе, это важно.
   Deal with it
 
11 - 02.02.21 - 17:24
Разумеется в исключение надо поставить текущий сеанс, под которым вы запускаете обработку))) ну, на всякий случай уточняю
   Mikhail Volkov
 
12 - 02.02.21 - 17:55
(10) Мне бы попроще, без "ком обьект v83.COMConnector.1 (или как он у вас назван в службе компонентов)"
Есть у меня функция для предупреждения пользователя, если кассовая смена не закрыта:
Функция ПоследнийПользовательБазы(КопияИБ = Истина) Экспорт

    Если КопияИБ И КопияИнформационнойБазы() Тогда
        Возврат Ложь;
    КонецЕсли;
    СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
    Если СоединенияИнформационнойБазы.Количество() = 1 Тогда
        Возврат Истина;
    КонецЕсли;
    Количество = 0;
    Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл
        Если ПредставлениеПриложения(Соединение.ИмяПриложения) = "Конфигуратор" Тогда
            Продолжить;
        КонецЕсли;
        Количество = Количество + 1;
    КонецЦикла;
    Возврат Количество = 1;

КонецФункции// ПоследнийПользовательБазы()


Как отключить сеанс, если ПредставлениеПриложения(Соединение.ИмяПриложения) = "Конфигуратор"?
   Deal with it
 
13 - 02.02.21 - 18:32
(12) не вижу как она предупреждает, и зачем строка "Количество = Количество + 1;" если вы все равно возвращаете "Количество = 1;"?
   Kesim
 
14 - 02.02.21 - 18:46
(13) Возврат Количество = 1; - возвращает булево (типа: это последний пользователь вне конфигуратора? истина/ложь)
   Mikhail Volkov
 
15 - 02.02.21 - 18:51
(13) Функцию (12) лишь привел для того, что могу получить все СоединенияИнформационнойБазы, найти нужное, его НомерСеанса. А как правильно его ОтключитьСеанс - не знаю?
   Mikhail Volkov
 
16 - 03.02.21 - 07:26
(14) > типа: это последний пользователь вне конфигуратора?
Да, не учел, что могут быть зависшие и фоновые задания... желательно доработать функцию. Но сейчас вопрос не в этом.
(13) А для чего этот пример, по отключению зависших сеансов? Непосредственное отключение: РабПроц.Disconnect(Соединение);? Долгий путь к РабПроц, через Коннектор = Новый COMОбъект("v83.COMConnector.1");
Смотрю обработку Поиск и отключение зависших сеансов на сервере 1С (http://catalog.mista.ru/public/548893/), в ней тоже подобное, через СоединениеСАгентом.TerminateSession(РабочийКластер,ТекСеанс); Попроще нельзя?
   Mikhail Volkov
 
17 - 03.02.21 - 08:15
(13) Нашел откуда пример (6), из Программное отключение сеансов 1С 8.2 (http://catalog.mista.ru/1c/articles/77671/). Только не понял: РабПроц.Disconnect(Соединение); делать обязательно, не достаточно Агент.TerminateSession(Кластер, Сеанс);? (в обработке http://catalog.mista.ru/public/548893/ нет Disconnect(Соединение))
   John83
 
18 - 03.02.21 - 08:45
(0) это из УПП 1.3
   Mikhail Volkov
 
19 - 03.02.21 - 10:38
(18) Ага, обработка АктивныеПользователи процедура ЗавершитьСеанс(Команда), но там откуда?
   Deal with it
 
20 - 03.02.21 - 10:53
(17) завершить сеанс не равно отключить соединение. Есть ситуации, когда сеанс завершен некорректно и подключение зависает или дублируется. Агент сервера вроде как должен сам завершать зависшие подключения, но лишь по истечению какого-то времени, мы же говорим о сиюминутном завершении всех сеансов и подключений.
Вы можете пробовать разные варианты, данный пример гибок и универсален, потому как работает непосредственно с агентом сервера 1с, т.е. перманентно.
   Mikhail Volkov
 
21 - 03.02.21 - 12:01
(18)+ Запустил УПП в режиме отладки, посмотреть как выполняется процедура ЗавершитьСеанс(Команда), открыл обработку АктивныеПользователи. В ней даже кнопки нет Завершить сеанс!?
(20) В твоем примере (6):
        АдминистраторКластера = "admins";
        ПарольКластера = "E8vbteud";
У меня: Ошибка при вызове метода контекста (Authenticate): Произошла исключительная ситуация: Ошибка операции администрирования. Администратор кластера не аутентифицирован. Где их брать, в консоле администрирования? АдминистраторКластера взял, а пароль не помню, пустой не подходит. Как посмотреть пароль?
   Deal with it
 
22 - 03.02.21 - 12:55
(21) ну так пропишите своего админа кластера и пароль.
Я вам дал инструмент, ваше дело как им распоряжаться. Гугл вам в помошь
   Mikhail Volkov
 
23 - 03.02.21 - 13:50
(22) Галочка стояла Аутентификация ОС - поэтому не помню, поставил новый пароль 1С - заработало. За основу взял , тоже громоздко, но не так (6):
Процедура ОтключениеКонфигуратора(Отказ) Экспорт
    Соединитель = Новый COMОбъект("V83.COMConnector");
    Кластер = Сред(СтрокаСоединенияИнформационнойБазы(), 7, Найти(СтрокаСоединенияИнформационнойБазы(), ";Ref=") - 8);    // "andromeda:1641";

    ИмяБазы = Сред(СтрокаСоединенияИнформационнойБазы(), Найти(СтрокаСоединенияИнформационнойБазы(), ";Ref=") + 6, СтрДлина(СтрокаСоединенияИнформационнойБазы()) - Найти(СтрокаСоединенияИнформационнойБазы(), ";Ref=") - 7);    // "PatrERP";

    ПериодичностьПроверки = 8;
    СтрокаСоединения = "TCP://" + Кластер;
    АдминистраторКластера = "";
    ПарольАдминистратора  = СвязьКА.ПарольКонсольАдминистратор(АдминистраторКластера);
    Попытка
        // попытка соединения с центральным сервером

        СоединениеСАгентом = Соединитель.ConnectAgent(СтрокаСоединения);
        РабочийКластер = СоединениеСАгентом.GetClusters().GetValue(0);
        СоединениеСАгентом.Authenticate(РабочийКластер, АдминистраторКластера, ПарольАдминистратора);
        ИБ = СоединениеСАгентом.GetInfoBases(РабочийКластер);
        Для Каждого СтрИБ Из ИБ Цикл 
            Если СтрИБ.Name = ИмяБазы Тогда 
                ТекущаяИБ = СтрИБ;
                СеансыИБ  = СоединениеСАгентом.GetInfoBaseSessions(РабочийКластер,ТекущаяИБ);
                
                //Проверяем наличие сеанса пользователя, кроме 1CV8 - толстого клиента

                Для Каждого ТекСеанс Из СеансыИБ Цикл
                    Если ТекСеанс.AppID = "1CV8" Тогда 
                        Продолжить;
                    КонецЕсли;
                    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ТекСеанс.userName);
                    СоединениеСАгентом.TerminateSession(РабочийКластер, ТекСеанс);
                //    Если ТекСеанс.dbProcTook > Цел(ПериодичностьПроверки*60*1000) Тогда //в мс. 

                //        Сообщить("Зависший сеанс у пользователя: " + ТекСеанс.userName + ", компьютер: " + ТекСеанс.Host);

                //    КонецЕсли;    

                //    Если ТекСеанс.connection = Неопределено Тогда 

                //        Сообщить("Пользователь: " + ТекСеанс.userName + ", компьютер: " + ТекСеанс.Host + ", аварийно завершил сеанс");

                //    КонецЕсли;

                //    Сообщить(" ->>> Сеанс пользователя: " + ТекСеанс.userName + ", приложение: " + ТекСеанс.AppID + ", компьютер: " + ТекСеанс.Host + ", отключен " + ТекущаяДата());    

                КонецЦикла;    
                Прервать;    // Только для указанной информационной базы

            КонецЕсли;
        КонецЦикла;
    Исключение
        Отказ = Истина;
        Сообщить("Не удалось завершить сеанс конфигуратора " + ТекущаяДата() + "; " + ОписаниеОшибки(), СтатусСообщения.Внимание);    
    КонецПопытки;
КонецПроцедуры// ОтключениеКонфигуратора()


Правда по завершению выскакивает предупреждение, что сеанс завершен администратором с вопросом: Перезапустить или Завершить работу. Как бы его убрать? Интересно, это мешает?
   Mikhail Volkov
 
24 - 03.02.21 - 14:37
+ Вроде не мешает, dt-выгрузка делается запущенным из 1С bat-файлом.
   Mikhail Volkov
 
25 - 03.02.21 - 14:57
(19)+ СоединенияИБКлиентСервер - это общий модуль, еще используется общий модуль СоединенияИБ и другие для ОтключитьСеанс(). В Альфа-Авто их нет, не стал разбираться...
   Mikhail Volkov
 
26 - 03.02.21 - 15:26
Вопрос не по теме, в bat-файле имя файла dt-выгрузки формируется: set "BakName=f:\workspace\1C\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt". Но работа 1С может задержаться, завершиться после полуночи. Как бы мне BakName сформировать по вчерашней дате? Ведь в месяцах разное число дней.
   Mikhail Volkov
 
27 - 09.02.21 - 06:21
(6) Этот алгоритм может определить какой сеанс из 1CV8 (толстого клиента) является зависшим? Или другой метод по СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();?
Свойства:
ИмяКомпьютера (ComputerName)
ИмяПриложения (ApplicationName)
НачалоСоединения (ConnectionStarted)
НомерСеанса (SessionNumber)
НомерСоединения (ConnectionNumber)
Пользователь (User)
   SiAl-chel
 
28 - 09.02.21 - 06:27
(26)
1. Выгружать базу в файл с произвольным именем.
2. После пакетного запуска в скрипте ожидать появления этого ненулевого файла.
3. После выгрузки формировать имя файла по дате и времени.
4. Переименовать файл с произвольным именем в файл с нужным именем из шага 3.
   Mikhail Volkov
 
29 - 09.02.21 - 07:11
(28) Наверное не точно задал вопрос (26), поясняю: обычно ночная выгрузки делается после 21 часа, когда все пользователи вышли из базы. Но бывает срочная работа, или пользователь неправильно вышел (только из терминала, но не из базы), или просто забыл выйти. С 21 часа включается принудительный мягкий выход, задается вопрос пользователю, но пользователь может отказаться выйти. Тогда принудительный мягкий выход откладывается на час. Через час ситуация может повториться... и через 2, 3, сейчас этот алгоритм работает до полуночи (пока более длительных задержек не было). Хотелось бы, чтобы этот алгоритм мог работать до утра (начала следующего рабочего дня). Но имя файла dt-выгрузки после полуночи сформировалось по вчерашней дате!?
   Mikhail Volkov
 
30 - 09.02.21 - 12:48
(27)+ Наверное нет. Тогда тот же алгоритм (23) по условию: Если ТекСеанс.dbProcTook > Цел(ПериодичностьПроверки*60*1000) Тогда //в мс.
 
 
   SiAl-chel
 
31 - 09.02.21 - 12:54
(29) Ваще плевать с каким именем он сформировался. Делай выгрузки с рандомным именем, а потом другим заданием с нужной тебе регулярностью проверяй, чтобы имя файла соответствовало дате и времени изменения (или создания) файла, если нет, то тогда переименовывай файл.
   Mikhail Volkov
 
32 - 09.02.21 - 13:05
(31) По существованию файла с именем по дате как раз принимается решение: делать ли завершение сеансов и dt-выгрузку, или нет.
   Mikhail Volkov
 
33 - 09.02.21 - 15:05
Вроде нашел https://www.sql.ru/forum/445183/kak-poluchit-vcherashnee-chislo-v-bat-fayle ужас какой!? Неужели у bat-файлов нет функции вчерашний даты? Если текущий час больше 6 часов, то имя файла BakName формируется по сегодняшней дате (26). Если нет (после полуночи), то по вчерашней.
   SiAl-chel
 
34 - 09.02.21 - 21:10
(33) Бат-файлы это - не язык программирования, это скриптовый язык. В нем есть ровно то, что могут консольные команды ОС и стороннего софта.

Определение вчерашних дат взято вот отсюда https://www.sql.ru/forum/445183/kak-poluchit-vcherashnee-chislo-v-bat-fayle

set /A CalculatePreviousDay=1%Day%-1
set Yesterday=%CalculatePreviousDay:~1,2%
set PreviousDate=%Year%%Month%%Yesterday%
   Mikhail Volkov
 
35 - 10.02.21 - 06:48
(34) Это лишь фрагмент замены: "иначе будут проблемы на числах 08 и 09...", а сам код еще строк 60... советуют получать вчерашнюю дату через PowerShell (здесь вряд ли помогут). Спс всем.
   Mikhail Volkov
 
36 - 10.02.21 - 15:21
   Mikhail Volkov
 
37 - 13.03.21 - 08:12
А как создать некое событие для Windows, в 1С это возможно?
Бат-файл запущенный из 1С не всегда выполняется до конца, иногда его выполнение прерывается (ход выполнения пишется в лог-файл). Потому, что он запущен под конкретным пользователем 1С. А этот пользователь (подозреваю) завершил работу, и вышел из терминала. Решил выполнять bat-файл под системной учетной записью: СИСТЕМА или USR1CV8. Для этого в планировщике заданий создал свое с моим bat-файлом. Из 1С это задание запускаю ЗапуститьПриложение("schtasks /run /tn имя_задачи_в_планировщике"); Справка SchTasks /? дает описание:
Позволяет администратору создавать, удалять, изменять и опрашивать запланированные задачи в локальной или удаленной системе.
Примеры:
    SCHTASKS /Run /?
    SCHTASKS /Run /TN "\Архивация\Начать архивацию"
    SCHTASKS /Run /S <система> /U <пользователь> /P <пароль> /I
         /TN "\Архивация\Архивация и восстановление"
Подомною все прекрасно сработало, а под рядовым пользователем - ничего!? Выходит выполнять задачу (в справке прямо ни сказано) можно только администратору? Поэтому решил в 1С создать некое событие для Windows, а которое реагировало бы мое задание в планировщике. Возможно? (никогда не делал)
   Mikhail Volkov
 
38 - 13.03.21 - 13:47
Вроде нашел, но: Команда eventcreate позволяет администратору создать запись об особом событии в указанном журнале событий
т.е. не рядовому пользователю, а только администратору.
Смотрю журнал событий Windows Безопасность, в нем такие события: Вход с учетной записью выполнен успешно, Выполнен выход учетной записи из системы... А вход/выход пользователей из базы 1С, или что другое связанное 1С пишется в журнал событий Windows? Или можно настроить чтоб писалось?
   Mikhail Volkov
 
39 - 16.03.21 - 13:14
1С что-то пишет в журнал событий Windows? Или можно настроить чтоб писалось?
   Mikhail Volkov
 
40 - 16.03.21 - 16:14
А можно ли заставить 1С сделать что-то "нехорошее" (обычно не делается, но без последствий), что обязательно запишется в журнал событий Windows?
   Kassern
 
41 - 16.03.21 - 16:21
(40) а накой лезти в журнал событий винды? Чем тебя не устравивает писать какой нить файл - флаг для этих нужд?
   Mikhail Volkov
 
42 - 16.03.21 - 17:10
(41) Есть такой флаг: при завершении сеанса последнего пользователя очищается лог-файл Как создать пустой текстовый файл из 1С Потом еще: при завершении сеанса последнего пользователя запускается нужный bat-файл, который выполняет все что нужно. Но не всегда: bat-файл запускается под учетной записью последнего пользователя. Если он завершает свой терминальный сеанс, то выполнение bat-файла прерывается. А запустить bat-файл планировщиком заданий командой: ЗапуститьПриложение("schtasks /run /tn имя_задачи_в_планировщике"); не доступно рядовому пользователю, только администраторам. Запуск задания по расписанию сейчас делается в конце ночи (в 6 утра) в случае его не выполнения, но хотелось бы чтобы сразу выполнялось.
   Kassern
 
43 - 16.03.21 - 17:26
(42) каша какая то получается...Зачем запускать бат файл под учеткой последнего пользователя? Все пользователи вышли, создаешь флаг, что можно делать выгрузку. в шедулере можешь хоть каждые 5 минут проверять наличие файла флага, если он существует то запускать выгрузку чего тебе там надо, после выгрузки этот файл флаг удаляется.
   Mikhail Volkov
 
44 - 16.03.21 - 17:34
(43) Это 1-й вариант, а 2-й (39)?
   Mikhail Volkov
 
45 - 17.03.21 - 06:47
Нашел ответ на 1-й вопрос (39), настроил фильтр журнала событий Windows, отбирающего строки с ошибками и зависаниями, вызванными программой 1С по статье: https://infostart.ru/1c/articles/190790/. В отборе есть события, например, Программа 1cv8.exe версии 8.3.10.2466 прекратила взаимодействие с Windows и была закрыта - это событие Ошибка. Интересно, есть ли в журнале события о нормальном завершении 1С. Наверное нет... а как сделать чтобы были?
   Mikhail Volkov
 
46 - 17.03.21 - 12:00
Вроде убрал все лишнее из фильтра, оставил:
<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">
    *[EventData[(Data='1cv8.exe')]]
    </Select>
  </Query>
</QueryList>
Теперь в журнале событий вижу не только Ошибки от источников Application Error и Application Hang, но и Сведения от Windows Error Reporting. А события запуска/остановки 1С не вижу!? Фильтр неправильно настроен, или события запуска/остановки 1С в журнале не фиксируются?
   Kassern
 
47 - 17.03.21 - 12:07
(46) У тебя все пользователи терминально работают?
   Mikhail Volkov
 
48 - 17.03.21 - 13:32
(47) Да, завершение терминального сеанса фиксируется в журнале событий. Но не всегда пользователи сами его завершают. Иногда просто "выпадают" из терминала.
   Mikhail Volkov
 
49 - 18.03.21 - 10:11
> А можно ли заставить 1С сделать что-то "нехорошее" (обычно не делается, но без последствий), что обязательно запишется в журнал событий Windows? (40)
Послал сообщение командой MSG, и оно зафиксировалось в журнале событий Windows! Имя журнала: Система, Источник: Application Popup, Уровень: Сведения, Код события: 26, Ключевые слова: Классический. По нему можно запускать свое задание под системой учетной записью. Вот только бы не перепутать его с другими событиями... На вкладке Триггеры по кнопке Изменить фильтр событий... создал фильтр XML:
<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Application Popup'] and (Computer='PERSEUS.corp.akit') and (Level=4 or Level=0) and (band(Keywords,36028797018963968)) and (EventID=26)]]</Select>
  </Query>
</QueryList>
Как в него вставить текст сообщения? https://ibb.co/N1D7tzN (Если получится, текст сообщения будет другой).
   Mikhail Volkov
 
50 - 19.03.21 - 07:13
Может Использовать другую крайне редко используемую команду (какую?), чтобы она зафиксировалось в журнале событий Windows? (желательно без имени пользователя)
   Mikhail Volkov
 
51 - 23.03.21 - 11:25
Если сообщение командой MSG (всем или конкретному пользователю) послано, когда нет активных сеансов (или конкретного пользователя) на сервере-терминале, оно не фиксируется в журнале событий Windows?
   mistеr
 
52 - 23.03.21 - 12:07
Жесть, сколько садо-мазо стоя в гамаке, вместо того, чтобы настроить нормальные бэкапы.
   Kassern
 
53 - 23.03.21 - 12:12
(52) мне кажется, что это еще не предел)
   Mikhail Volkov
 
54 - 23.03.21 - 12:43
(52) Бэкапы настроены, делаются на SQL-сервере. Но были случаи его выхода из строя. Это дополнительно...
Секцию темы на IT/Админ сменить можно? А то ее только 1С-ники видят...
   mistеr
 
55 - 23.03.21 - 13:38
(54) >Но были случаи его выхода из строя.

Настоящий бэкап защищает и от этого.
   Mikhail Volkov
 
56 - 23.03.21 - 14:15
(55) SQL-бэкап возможно был, но восстановить из него файловый вариант базы не получилось.
   Kassern
 
57 - 23.03.21 - 14:16
(56) вот в этом направлении и нужно было копать и автоматизировать, а не забить и параллельно запустить дт бекапы
   Kassern
 
58 - 23.03.21 - 14:16
(56) разобрались почему не получилось восстановить бекап?
   mistеr
 
59 - 23.03.21 - 14:18
(56) Из скульного бэкапа пытались получить файловую базу? Да вы там шутники однако.
   Mikhail Volkov
 
60 - 24.03.21 - 09:01
Создал новую тему IT/Админ: Создать событие Windows из 1С возможно?
 
 
   Mikhail Volkov
 
61 - 09.09.21 - 10:57
При завершении работы пользователя выполняется предопределенная процедура ПередЗавершениемРаботыСистемы(). В ней проверяется последний ли пользователь. Если последний, то запускается bat-файл архивации. Но замечено что иногда последнему как-то удается завершить свою работу в Альфа-Авто и терминале (обычно это кассир завершает свою работу не с рабочего компьютера, а с домашнего) минуя эту предопределенную процедуру, и bat-файл не выполняется. Хотя в журнале регистрации есть запись события: Сеанс. Завершение.
Не пойму как такое возможно?
   Mikhail Volkov
 
62 - 09.09.21 - 14:29
Может пользователь завершил терминальный сеанс не закрыв Альфа-Авто, она завершилась аварийно?
   Mikhail Volkov
 
63 - 14.09.21 - 10:51
Для RDP ведется какой ни будь журнал регистрации подобный ЖР 1С, можно посмотреть когда начат сеанс RDP пользователем: состояние Активно/Отключено, а когда он вышел: не показывает состояние? Как?
   ildary
 
64 - 14.09.21 - 15:23
(63) погуглите "Журнал событий Windows"
   Mikhail Volkov
 
65 - 14.09.21 - 17:25
(64) Ссылок на проконтролировать вход по RDP много, а на проконтролировать выход из RDP не нашел. Хочется знать всегда ли выполняется предопределенная процедура ПриЗавершенииРаботыСистемы(), даже при аварийном завершении 1С, при закрытии сеанса RDP?
   Mikhail Volkov
 
66 - 16.09.21 - 08:40
Например вчера 15.09.2021 20:34:37 по ЖР 1С есть запись Сеанс. Завершение. В журнале Безопасность этому пользователю соответствуют две записи категории "Выход из системы":
15.09.2021 20:34:31 код события: 4647 Данное событие возникает, когда выход начат. Дальнейшие действия, запрошенные пользователем, не выполняются.  Данное событие можно рассматривать как событие выхода.
15.09.2021 20:35:07 код события: 4634 Данное событие возникает при уничтожении сеанса входа. Его можно однозначно связать с событием входа с помощью значения "Код входа". Коды входа остаются уникальными после перезагрузки, но они уникальны только на одном компьютере. Тип входа: 3
В чем некорректность выхода: можно определить?
   mistеr
 
67 - 16.09.21 - 11:11
(61) >В ней проверяется последний ли пользователь.

Ставлю на то, что проверка кривая.
   mistеr
 
68 - 16.09.21 - 11:12
У меня в одном месте сделано так. Проверка в самом bat файле, что нет активных сеансов, и если есть, то архивация не выполняется.
   Mikhail Volkov
 
69 - 16.09.21 - 12:24
(68) Пожалуйста, выложи текст этой проверки!?
Разобрался, при закрытии сеанса RDP предопределенная процедура ПриЗавершенииРаботыСистемы() не выполняется. Но запись в ЖР Сеанс. Завершение делается. Где, как отловить это событие в 1С?
   mistеr
 
70 - 16.09.21 - 13:38
(69) Там файловая, просто проверяется наличие lock-файлов в папке с базой.
   Mikhail Volkov
 
71 - 17.09.21 - 09:23
(70) Для SQL-базы это не пойдет.
Но запись в ЖР Сеанс. Завершение делается. Где, на уровне платформы? Конфигуратором туда не добраться?
Еще заметил, что перед каждой записью в ЖР Сеанс. Завершение делается более 3-х записей событий: Данные. Изменение в Регистр сведений. Значения свойств объектов. Каких объектов, какие свойства неизвестно. Можно как-то под настроить ЖР, чтобы знать что за объекты?
   Mikhail Volkov
 
72 - 18.09.21 - 09:58
Выяснил в Регистр сведений. Значения свойств объектов пишется свойства оборудования - кассы при завершении работы пользователя, вызывается в конечном счете из предопределенной процедуры ПриЗавершенииРаботыСистемы().
   Mikhail Volkov
 
73 - 20.09.21 - 09:15
Обычно жалуются, что Активные пользователи в 1С остаются после отключение пользователя от RDP. У меня такой проблемы нет. Но в теме https://1s-forum.fun/showthread.php/201142-Активные-пользователи-в-1С-остаются-после-отключение-пользователя-от-RDP дан совет: "укажите в свойствах РДП - не отключение сеанса - а завершение, с переопределением пользовательских настроек". Мне бы наоборот, только где конкретно в свойствах RDP?
   SiAl-chel
 
74 - 20.09.21 - 11:56
(73) Версию Windows Server озвучь.
   Mikhail Volkov
 
75 - 20.09.21 - 12:31
(74) 2008R2
   Mikhail Volkov
 
76 - 22.09.21 - 17:01
https://pro1c.org.ua/index.php?showtopic=26358 «Пуск» - «Все программы»-«Администрирование»-«Настройка служб терминалов» - нет у меня на сервере терминалов!?
И «Пуск» - «Выполнить»- «%SystemRoot%\system32\tscc.msc /s» - не удается найти tscc.msc?
   Mikhail Volkov
 
77 - 26.09.21 - 13:03
В bat-файле для получения dt-выгрузки базы прописана строка:
"C:\Program Files (x86)\1cv8\8.3.10.2466\bin\1cv8s.exe" DESIGNER /S "Сервер\база" /N"Администратор" /P"Пароль" /DumpIB %BakName% /Out %LogName% -NoTruncate /DisableStartupMessages /UC AllowRobotLogon
Он запускается заданием, которое обычно запускается из 1С при завершении работы последнего пользователя из предопределенной процедуры ПриЗавершенииРаботыСистемы(). Перед его запуском в 1С проверяется: открыт ли конфигуратор, если он открыт, то он закрывается процедурой (23).
А есть ли другой способ закрыть конфигуратор? Вроде встречал команду для командной строки, выгоняющую всех пользователей из базы. Она закрывает конфигуратор, если он открыт? Или есть команда проверяющая открыт ли конфигуратор, или кто-то есть в базе (в серверной SQL)?


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.