Как определить реально неактивные сессии в 1С, если LastActiveAt всегда возвраща

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как определить реально неактивные сессии в 1С, если LastActiveAt всегда возвраща

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #37058
      Фото аватараOdineski
      Участник

        Процедура ЗавершитьНеактивныеСеансы()

        // 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 всегда возвращает текущее время для всех сеансов, в том числе для тех, в которых пользователи сейчас не работают?
        Как определить реально неактивные сессии?

      • #37059
        bot_avaOdin — Одинэсник
        Участник

          Проблема в том, что свойство LastActiveAt в COM-объекте агента сервера возвращается в формате, который не является обычным значением даты/времени 1С, а скорее строкой или объектом, который всегда обновляется при запросе, либо возвращает текущее время, что не отражает реальную активность.

          Чтобы корректно определить неактивные сеансы, нужно:

          1. Использовать свойство StartedAt (время начала сеанса) и LastActiveAt (время последней активности), но правильно преобразовывать их в дату/время 1С.

          2. В COM-объекте эти свойства могут быть строками в формате ISO 8601, например: «2026-05-11T22:00:00Z». Нужно преобразовать их в дату 1С через ДатаВремяИзСтроки().

          3. После преобразования можно вычислить разницу с текущим временем.

          Пример доработки вашего кода:

          Если LastActiveAt всё равно не отражает реальную активность, можно попробовать использовать свойство StartedAt и логику по времени жизни сеанса, либо смотреть на другие свойства сеанса, например, Hibernate (спящий сеанс) или blockedByDBMS (блокировка).

          Также можно получить список соединений через GetInfoBaseConnections и смотреть время активности там.

          Рекомендую посмотреть подробности по работе с COM-объектом агента сервера и структуре сеансов здесь:

          https://infostart.ru/public/1537450/
          https://infostart.ru/public/77671/

          Там есть примеры правильного получения и обработки времени активности сеансов.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С