Доброго времени суток. Хочу сделать автоматическое закрытие 1с после проведения заказа клиентов и чтобы после закрытия сразу открывалось окно аутентификации в программе 1с. Все манипуляции делаю из-за нехватки лицензий. Я пробовал использовать команды ПрекратитьРаботуСистемы() и ЗавершитьРаботуСистемы(), они также могут завершить текущий сеанс и запустить клиент, только программа перезапускается не выходя из учетной записи пользователя. Поиск дополнительных параметров для ЗавершитьРаботуСистемы() найти не смог. Подскажите, есть ли альтернативные методы для реализации описанной выше проблемы или знает кто дополнительные параметры для ЗавершитьРаботуСистемы()
(5) Проблема уже решена. Вся загвоздка была в тостом клиенте, который перезапускает клиент, не выходя из аккаунта пользователя. Переключение на тонкий клиент решает эту проблема
ЗавершитьРаботуСистемы(<ЗапрашиватьВозможность>, <ПерезапуститьПриЗавершении>, <ДополнительныеПараметрыКоманднойСтроки>)
А если в третьем параметре задать пользователя отличного от текущего, ? что то по типу /user="Иван"
//Ну, а если кому-то необходимо посмотреть или удалить соединения, то вместо процедуры Сеансы()
//нужно вызвать процедуру Соединения(), показанную ниже,
//но тогда еще потребуются логин и пароль администратора информационной базы:
Процедура Соединения(Сервер1С, Коннектор, Агент, Кластер, База,
АдминКластера, ПарольАдминКластера, АдминИБ, ПарольАдминИБ)
Процессы = Агент.GetWorkingProcesses(Кластер);
Для каждого Процесс из Процессы Цикл
Порт = Процесс.MainPort;
РабПроц = Коннектор.ConnectWorkingProcess(Сервер1С + ":" + Порт);
Исключение ...
РабПроц.AuthenticateAdmin(АдминКластера, ПарольАдминКластера);
Исключение ...
РабПроц.AddAuthentication(АдминИБ, ПарольАдминИБ);
Исключение ...
ИнформационнаяБаза = РабПроц.CreateInfoBaseInfo();
ИнформационнаяБаза.Name = База;
СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза);
Исключение ...
Для Каждого Соединение Из СоединенияБазы Цикл
РабПроц.Disconnect(Соединение);
Исключение ...
КонецЦикла;
КонецЦикла;
КонецПроцедуры // Соединения()
&НаСервере
Процедура ВыгрузитьНаСервере()
Коннектор = Новый COMобъект("V83.ComConnector");
Агент = Коннектор.ConnectAgent("localhost");
Кластер = Агент.GetClusters().GetValue(0);
Агент.Authenticate(Кластер, "", "");
Процессы = Агент.GetWorkingProcesses(Кластер);
Для каждого РабочийПроцесс Из Процессы Цикл
Если РабочийПроцесс.Running И РабочийПроцесс.IsEnable Тогда
СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
СоединениеСРабочимПроцессом = Коннектор.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
СоединениеСРабочимПроцессом.AddAuthentication("логин", "пароль");
базы = СоединениеСРабочимПроцессом.GetInfoBases();
//запрещаем запуск регламентных заданий
для каждого база из базы цикл
Если база.name = "unf" тогда
база.ScheduledJobsDenied = истина;
СоединениеСРабочимПроцессом.UpdateInfoBase(база);
КонецЕсли;
конецЦикла;
базы = Агент.GetInfoBases(Кластер);
//обрубаем все соединения с бд
для каждого база из базы цикл
Если база.name = "unf" тогда
Сеансы = Агент.GetInfoBaseSessions(Кластер, база);
Для каждого Сеанс Из Сеансы Цикл
//Если Сеанс.AppID = "SrvrConsole" Тогда
// Продолжить;
//КонецЕсли;
Агент.TerminateSession(Кластер, Сеанс);
//Сообщить(Сеанс.AppID)
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли
КонецЦикла;
'Получение рабочего процесса кластера
For Each WorkProcess In Agent.GetWorkingProcesses(Cluster)
ConnectString = WorkProcess.HostName & ":" & WorkProcess.MainPort
Set WorkProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
'Установка аутентификации в базах. В бухгалтерии и зарплате создан логин "Алексей"
WorkProcessConnection.AddAuthentication "Алексей", "tystik1233"
'Получение списков баз на сервере
BaseList = WorkProcessConnection.GetInfoBases()
'Отключение пользователей из Зарплаты
For i = LBound(BaseList) To UBound(BaseList)
If BaseList(i).Name = BaseName Then
Set Base = BaseList(i)
'Получение соединений с базой, отрубаем всех ктоме COM-Администраторов, он вырубится когда закончится скрипт
Connections = WorkProcessConnection.GetInfoBaseConnections(Base)
For j = LBound(Connections) To UBound(Connections)
Set CurrentConnection = Connections(j)
If CurrentConnection.AppID <> "COMConsole" Then
'MSGBOX "Пользователь зарплаты : " & CurrentConnection.UserName
WorkProcessConnection.Disconnect CurrentConnection
End If
Next
End If
'Отключение пользователей из бухгалтерии
If BaseList(i).Name = BaseNameAcc Then
Set Base = BaseList(i)
'Получение соединений с базой, отрубаем всех ктоме COM-Администраторов, он вырубится когда закончится скрипт
Connections = WorkProcessConnection.GetInfoBaseConnections(Base)
For l = LBound(Connections) To UBound(Connections)
Set CurrentConnection = Connections(l)
If CurrentConnection.AppID <> "COMConsole" Then
'MSGBOX "Пользователь бухгалтерии : " & CurrentConnection.UserName
WorkProcessConnection.Disconnect CurrentConnection
End If
Next
End If
Next
Next
End Sub
// Разорвать соединения клиентских приложений.
Для Каждого Соединение Из СоединенияБазы Цикл
Если нРег(Соединение.AppID) = "backgroundjob" ИЛИ нРег(Соединение.AppID) = "comconsole" Тогда
Продолжить;
КонецЕсли;
Если Соединение.UserName = ИмяПользователя() Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;
РабПроц.Disconnect(Соединение);
КонецЦикла;
//Отключение сеансов
//Итак у нас есть все необходимые объекты для непосредственного обрыва сессий. При это рекомендую полностью разобраться, //какие именно сессии мы будем разрывать, иначе можно отключить сессию, в которой выполняется этот код Laughing :
Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
Для каждого Сеанс из Сеансы Цикл
Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" Тогда
// если это сеансы конфигуратора или фонового задания, то не отключаем
Продолжить;
КонецЕсли;
Если Сеанс.UserName = ИмяПользователя() Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;
Агент.TerminateSession(Кластер, Сеанс);
КонецЦикла;
//Также у типа "Сеанс" есть ещё много разных свойств, например, имя компьютера, данные о языке, времени и длительности //подключения и тп.
//Отключение соединений
//Отключение соединений происходит через объект рабочего процесса. Обрабатывает соединение тип "Соединение", у которого //структура свойств напоминает тип "Сеанс". Итак, как отключенить соединения:
СоединенияБазы = Агент.GetInfoBaseConnections(Кластер, ИнформационнаяБаза);
// Разорвать соединения клиентских приложений.
Для Каждого Соединение Из СоединенияБазы Цикл
Если нРег(Соединение.Application) = "backgroundjob" ИЛИ нРег(Соединение.Application) = "designer" Тогда
// если это соединение конфигуратора или фонового задания, то не отключаем
Продолжить;
КонецЕсли;
Если Соединение.UserName = ИмяПользователя() Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;
РабПроц.Disconnect(Соединение);
КонецЦикла;
(5) Проблема уже решена. Вся загвоздка была в тостом клиенте, который перезапускает клиент, не выходя из аккаунта пользователя. Переключение на тонкий клиент решает эту проблема