helpf.pro
Регистрация

v8.3: Как в 8.3 удалять сеансы с помощью регламентного задания?

yakov
22.09.2014 07:00Прочитано: 60131

Как в 8.3 удалять сеансы с помощью регламентного задания?

Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
22.09.2014 10:26Ответ № 1

 уточните - какие сеансы вы хотите удалить?

yakov
23.09.2014 05:29Ответ № 2

Все активные сеансы (исключения тоже не помешают)) Сеансы пользователей часто продолжают оставаться активными, даже если пользователь вышел. 

E_Migachev
23.09.2014 13:40Ответ № 3

зачем тогда через регламентное, обычно если хотят все сбросить и всех отключить, перезапускают службу агент сервера 1С

у меня в планировщике стоит задание, каждое утро в 3.30 выполнять скрипт вида

Код Batch File (DOS, CMD, BAT)
 net stop "1C:Enterprise 8.2 Server Agent"
net start "1C:Enterprise 8.2 Server Agent"

А далее идет сохранение баз в архив - Автоматическая архивация баз 1С 8.х для файлового и клиент-серверного варианта

yakov
23.09.2014 14:18Ответ № 4

Это вариант, спасибо! Но хотелось бы для отдельных пользователей сделать исключение..

E_Migachev
23.09.2014 15:35Ответ № 5

тогда через com соединение подключайся и отключай необходимых

вот пример Как принудительно завершить работу всех пользователей информационной базы?

еще пара примеров VBS скрипт и 1С

Код VBS
 Dim Connector, Agent, Cluster, WorkProcess, WorkProcessConnection, Base, Connections, i, CurrentConnection
Dim BaseList


BaseName = "ИмяБазы"


Set Connector = CreateObject("V81.COMConnector")


Set Agent = Connector.ConnectAgent("ИмяКластера")


Set Cluster = Agent.GetClusters()(0)


Agent.Authenticate Cluster, "Логин", "Пароль"


For Each WorkProcess In Agent.GetWorkingProcesses(Cluster)


    ConnectString = WorkProcess.HostName & ":" & WorkProcess.MainPort


    Set WorkProcessConnection = Connector.ConnectWorkingProcess(ConnectString)


    WorkProcessConnection.AddAuthentication "Логин", "Пароль"


    BaseList = WorkProcessConnection.GetInfoBases()


    For i = LBound(BaseList) To UBound(BaseList)
        If BaseList(i).Name = BaseName Then
            Set Base = BaseList(i)


            Connections = WorkProcessConnection.GetInfoBaseConnections(Base)


            For j = LBound(Connections) To UBound(Connections)
                Set CurrentConnection = Connections(j)
                If CurrentConnection.AppID <> "COMConsole" Then
                    WorkProcessConnection.Disconnect CurrentConnection
                End If
            Next
        End If
    Next
Next


Set Connector = Nothing
Set Agent = Nothing
Set Cluster = Nothing
Set WorkProcess = Nothing
Set WorkProcessConnection = Nothing
Set Base = Nothing
Set Connections = Nothing
Set i = Nothing
Set CurrentConnection = Nothing

в 1С-ке можно использовать код из обработки: Отключение и удаление все активных сеансов серверной БД 1С

Код 1C v 8.х
 Процедура УдалитьСеансы()
ПараметрыАдминистрированияИБ=ПолучитьПараметрыАдминистрированияИБ();
Попытка
Сеансы = ПолучитьАктивныеСеансыИБ(ПараметрыАдминистрированияИБ);
Для каждого Сеанс Из Сеансы.Сеансы Цикл
// Разрываем Connections с ИБ

Сеансы.АгентСервера.TerminateSession(Сеансы.КластерСерверов, Сеанс);
СтрСообщение = ПодставитьПараметрыВСтроку(
НСтр("ru = 'Разорван сеанс: Пользователь %1, компьютер %2, начат %3, режим %4'"),
Сеанс.UserName,
Сеанс.Host,
Сеанс.StartedAt,
Сеанс.AppID);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Завершение работы пользователей'"), УровеньЖурналаРегистрации.Информация, , , СтрСообщение);
КонецЦикла;

Исключение

ЗаписьЖурналаРегистрации(НСтр("ru = 'Завершение работы пользователей'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));



ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());

КонецПопытки;


КонецПроцедуры

Функция ПолучитьАктивныеСеансыИБ(НастройкаБлокировки, знач ВсеКромеТекущего = Истина)

Результат = Новый Структура("АгентСервера,КластерСерверов,Сеансы", Неопределено, Неопределено, Новый Массив);
ПодстрокиСтрокиСоединения = РазложитьСтрокуВМассивПодстрок(
СтрокаСоединенияИнформационнойБазы(), ";");

ИмяСервера = СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[0], 7));
ИмяИБ      = СократитьДвойныеКавычки(Сред(ПодстрокиСтрокиСоединения[1], 6));

СистемнаяИнфо = Новый СистемнаяИнформация;
ПодстрокиВерсии = РазложитьСтрокуВМассивПодстрок(
СистемнаяИнфо.ВерсияПриложения, ".");
ИмяCOMСоединителя="v" + ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + ".COMConnector";



COMСоединитель = Новый COMОбъект(ИмяCOMСоединителя);

РазделительПорта = Найти(ИмяСервера, ":");
Если РазделительПорта > 0 Тогда
ИмяИПортСервера = ИмяСервера;
ИмяСервера = Сред(ИмяИПортСервера, 1, РазделительПорта - 1);
НомерПортаКластера = Число(Сред(ИмяИПортСервера, РазделительПорта + 1));
ИначеЕсли НастройкаБлокировки.ПортКластераСерверов <> 0 Тогда
НомерПортаКластера = НастройкаБлокировки.ПортКластераСерверов;
Иначе
НомерПортаКластера = COMСоединитель.RMngrPortDefault;
КонецЕсли;

ИдентификаторАгентаСервера = ИмяСервера;
Если НастройкаБлокировки.ПортАгентаСервера <> 0 Тогда
ИдентификаторАгентаСервера = ИдентификаторАгентаСервера + ":" + 
Формат(НастройкаБлокировки.ПортАгентаСервера, "ЧГ=0");
КонецЕсли;

// Подключение к агенту сервера
АгентСервера = COMСоединитель.ConnectAgent(ИдентификаторАгентаСервера);
Результат.АгентСервера = АгентСервера; 

// Найдем необходимый нам кластер
Для каждого Кластер Из АгентСервера.GetClusters() Цикл

Если Кластер.MainPort <> НомерПортаКластера Тогда
Продолжить;
КонецЕсли;

Результат.КластерСерверов = Кластер; 
АгентСервера.Authenticate(Кластер, НастройкаБлокировки.ИмяАдминистратораКластера, 
НастройкаБлокировки.ПарольАдминистратораКластера);

// Получаем список сеансов
НомерТекущегоСеанса = НомерСеансаИнформационнойБазы();
СписокСеансов = АгентСервера.GetSessions(Кластер);
Для Каждого Сеанс из СписокСеансов Цикл
Если ВРег(Сеанс.InfoBase.Name) <> ВРег(ИмяИБ) Тогда
Продолжить;
КонецЕсли;
Если НЕ ВсеКромеТекущего ИЛИ (НомерТекущегоСеанса <> Сеанс.SessionID) Тогда
Результат.Сеансы.Добавить(Сеанс);
КонецЕсли;
КонецЦикла;

КонецЦикла;

Возврат Результат;


КонецФункции
yakov
24.09.2014 04:59Ответ № 6

Спасибо!

Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.