Имя: Пароль:
1C
1С v8
Соединение с 1С-сервером по COM-соединению
0 Garry1010
 
03.12.19
15:51
Для проверки сеансов (а-ля в Консоли администрирования серверов) и для выкидывания юзеров есть известный механизм через COMСоединитель.ConnectAgent().

Но возникла мысль сначала проверить какие там Приложения запущены. Для вариативной реакции: для фоновых заданий выкидывать без разговоров, для клиентов сначала предупредить (как - это уже моё дело). Но не могу получить список этих Приложений. Еле нашёл в СП GetAssignmentRules(), которая возвращает Массив объектов "Требование назначения сервисов" - вроде, по свойствам то, что надо. Но она требует на входы: (Тип: Кластер серверов) и (Тип: Рабочий сервер). Вроде нашёл где брать и как получать - но в результате имею массив без содержимого... Что за нафик и как быть?

Ищется так:

    Агент = COMСоединитель.ConnectAgent("1C_claster");        
    Cluster = Агент.GetClusters().GetValue(0);
    Агент.Authenticate(Cluster,,)
    Server = Агент.GetWorkingServers(Cluster).GetValue(0);    //у нас только 1 сервер в кластере
    Базы = Агент.GetInfoBases(Cluster);
    ф = Агент.GetAssignmentRules(Cluster, Server);

И вот этот Ф имеет размер 0, хотя и в Cluster, и в Server данные есть.
Что я упустил и где? Гугл, ессно, молчит по этому поводу - всякую фигню находит (или я его неверно пытаю).
1 Garry1010
 
05.12.19
08:40
UP
2 Галахад
 
гуру
05.12.19
08:51
Типа того:
    Коннектор = Новый COMОбъект("v82.COMConnector");
    Агент = Коннектор.ConnectAgent(ИмяСервера + ":" + ПортСервера);
    Кластеры = Агент.GetClusters();
    
    Для каждого Кластер из Кластеры Цикл
        
        Агент.Authenticate(Кластер,"","");
        Процессы = Агент.GetWorkingProcesses(Кластер);
        Для каждого Процесс из Процессы Цикл
            Порт = Процесс.MainPort;
            // теперь есть адрес и порт для подключения к рабочему процессу
            РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
            РабПроц.AddAuthentication("Администратор", Пас);
            
            ИнформационнаяБаза = "";
            
            Базы = Агент.GetInfoBases(Кластер);
            Для каждого База из Базы Цикл
                Если База.Name = ИмяБазы Тогда
                    ИнформационнаяБаза = База;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            
        КонецЦикла;
        
        Если НЕ ИнформационнаяБаза = "" Тогда
            
            Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
            Для каждого Сеанс из Сеансы Цикл

                Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" ИЛИ нРег(Сеанс.AppID) = "srvrconsole" Тогда
3 cons24
 
05.12.19
09:36
Вообще фигню написал. GetAssignmentRules - это "требования назначения функциональности" - так и гугли.
Используется в КОРП лицензии на сервер. Имеет смысл если БОЛЕЕ 1 сервера в кластере.
А судя по "у нас 1 сервер в кластере" и непонимаю вааще что такое AssignmentRules - тычешь пальцем в розетку. Чтож, удачи!
4 cons24
 
05.12.19
09:38
Во это "Для вариативной реакции: для фоновых заданий выкидывать без разговоров, для клиентов сначала предупредить" вообще шедевр. Т.е. расчет с/ст просто так прибьешь?
Вообще кривая постановка задачи детектед
5 Garry1010
 
05.12.19
09:42
(3) Ну так вместо ругани лучше бы сказал что тогда надо вызывать вместо GetAssignmentRules, если у нас 1(!) сервер?
(4) Который код прибиваем и никаких проблем![зло]
6 Garry1010
 
05.12.19
09:56
(2) А-а-а... Вот GetInfoBaseSessions() уже что-то.
Спасибо! Кажется, отсюда можно что-то вытянуть.