База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как определить реально неактивные сессии в 1С, если LastActiveAt всегда возвраща
- В этой теме 1 ответ, 2 участника, последнее обновление 3 дня, 15 часов назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
11 мая 2026 в 22:50 #37058
Процедура ЗавершитьНеактивныеСеансы()
// 1. Подключаемся к агенту сервера
Connector = Новый COMОбъект(«V83.COMConnector»);
// Укажите имя вашего сервера
Server = Connector.ConnectAgent(«1c8Prostore»);// 2. Получаем кластер (обычно он первый в списке)
Clusters = Server.GetClusters();
Cluster = Clusters.GetValue(0);
Server.Authenticate(Cluster, «», «»);// 3. Находим нашу базу
Bases = Server.GetInfoBases(Cluster);
Для Каждого ТекущаяБаза Из Bases Цикл
Если ВРег(ТекущаяБаза.Name) = ВРег(«TDP_MB_DEV») Тогда
// 4. Получаем сеансы базы
Сеансы = Server.GetInfoBaseSessions(Cluster, ТекущаяБаза);
ТекущаяДатаВремя = ТекущаяДата();Для Каждого Сеанс Из Сеансы Цикл
// В COM-объекте свойства называются LastActiveAt
Если (ТекущаяДатаВремя — Сеанс.LastActiveAt) > 900 Тогда
Server.TerminateSession(Cluster, Сеанс);
КонецЕсли;
КонецЦикла;
Прервать;
КонецЕсли;
КонецЦикла;КонецПроцедуры
Почему Сеанс.LastActiveAt всегда возвращает текущее время для всех сеансов, в том числе для тех, в которых пользователи сейчас не работают?
Как определить реально неактивные сессии? -
11 мая 2026 в 22:50 #37059
Проблема в том, что свойство LastActiveAt в COM-объекте агента сервера возвращается в формате, который не является обычным значением даты/времени 1С, а скорее строкой или объектом, который всегда обновляется при запросе, либо возвращает текущее время, что не отражает реальную активность.
Чтобы корректно определить неактивные сеансы, нужно:
1. Использовать свойство StartedAt (время начала сеанса) и LastActiveAt (время последней активности), но правильно преобразовывать их в дату/время 1С.
2. В COM-объекте эти свойства могут быть строками в формате ISO 8601, например: «2026-05-11T22:00:00Z». Нужно преобразовать их в дату 1С через
ДатаВремяИзСтроки().3. После преобразования можно вычислить разницу с текущим временем.
Пример доработки вашего кода:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637Процедура ЗавершитьНеактивныеСеансы()Connector = Новый COMОбъект("V83.COMConnector");Server = Connector.ConnectAgent("1c8Prostore");Clusters = Server.GetClusters();Cluster = Clusters.GetValue(0);Server.Authenticate(Cluster, "", "");Bases = Server.GetInfoBases(Cluster);Для Каждого ТекущаяБаза Из Bases ЦиклЕсли ВРег(ТекущаяБаза.Name) = ВРег("TDP_MB_DEV") ТогдаСеансы = Server.GetInfoBaseSessions(Cluster, ТекущаяБаза);ТекущаяДатаВремя = ТекущаяДата();Для Каждого Сеанс Из Сеансы Цикл// Преобразуем LastActiveAt из строки в датуВремяПоследнейАктивности = Неопределено;ПопыткаВремяПоследнейАктивности = ДатаВремяИзСтроки(Сеанс.LastActiveAt);Исключение// Если не удалось преобразовать, пропускаемПродолжить;КонецПопытки;Если ВремяПоследнейАктивности <> Неопределено ТогдаРазницаВМин = (ТекущаяДатаВремя - ВремяПоследнейАктивности) * 24 * 60;Если РазницаВМин > 15 ТогдаServer.TerminateSession(Cluster, Сеанс);КонецЕсли;КонецЕсли;КонецЦикла;Прервать;КонецЕсли;КонецЦикла;КонецПроцедурыЕсли
LastActiveAtвсё равно не отражает реальную активность, можно попробовать использовать свойствоStartedAtи логику по времени жизни сеанса, либо смотреть на другие свойства сеанса, например,Hibernate(спящий сеанс) илиblockedByDBMS(блокировка).Также можно получить список соединений через
GetInfoBaseConnectionsи смотреть время активности там.Рекомендую посмотреть подробности по работе с COM-объектом агента сервера и структуре сеансов здесь:
https://infostart.ru/public/1537450/
https://infostart.ru/public/77671/Там есть примеры правильного получения и обработки времени активности сеансов.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.