|
Соединение с 1С-сервером по COM-соединению | ☑ | ||
---|---|---|---|---|
0
Garry1010
03.12.19
✎
15:51
|
Для проверки сеансов (а-ля в Консоли администрирования серверов) и для выкидывания юзеров есть известный механизм через COMСоединитель.ConnectAgent().
Но возникла мысль сначала проверить какие там Приложения запущены. Для вариативной реакции: для фоновых заданий выкидывать без разговоров, для клиентов сначала предупредить (как - это уже моё дело). Но не могу получить список этих Приложений. Еле нашёл в СП GetAssignmentRules(), которая возвращает Массив объектов "Требование назначения сервисов" - вроде, по свойствам то, что надо. Но она требует на входы: (Тип: Кластер серверов) и (Тип: Рабочий сервер). Вроде нашёл где брать и как получать - но в результате имею массив без содержимого... Что за нафик и как быть? Ищется так:
И вот этот Ф имеет размер 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() уже что-то.
Спасибо! Кажется, отсюда можно что-то вытянуть. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |