Как завершать сеансы пользователей после выполнения запроса к веб-сервису в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При активной интеграции и тестировании внешних подключений (например, через утилиту SOAPUI или Postman) разработчики часто сталкиваются с ситуацией, когда после каждого обращения к веб-сервису в списке активных пользователей 1С остается «висеть» отдельный сеанс. Со временем количество таких подключений накапливается, что приводит к излишней нагрузке на кластер серверов и исчерпанию доступных клиентских лицензий.

Проанализируем причину такого поведения платформы «1С:Предприятие» и рассмотрим по шагам все способы корректного завершения или переиспользования сеансов интернет-сервисов.

Почему сеансы веб-сервисов не закрываются сразу

По умолчанию платформа 1С оптимизирует работу веб-сервисов (SOAP) и HTTP-сервисов, используя механизм пула сеансов. Инициализация нового сеанса (авторизация, запуск сеансовых событий, выполнение кода в модуле УстановкаПараметровСеанса) — ресурсоемкая операция. Чтобы не создавать сеанс заново при каждом отдельном HTTP/SOAP-запросе, сервер 1С удерживает созданную сессию в памяти для повторного использования последующими запросами.

Однако если пул сеансов настроен некорректно или внешнее приложение каждый раз инициирует абсолютно новую сессию без передачи идентификатора, неактивные сеансы продолжают занимать ресурсы.

Выясним, какие варианты настройки существуют для решения этой проблемы.

Способ 1. Полное отключение повторного использования сеансов (мгновенное закрытие)

Если специфика интеграции требует, чтобы сеанс уничтожался сразу после возврата ответа вызывающей стороне, отключим механизм повторного использования:

  1. Откроем конфигуратор и найдем нужный Web-сервис в ветке метаданных Общие / Web-сервисы.
  2. В палитре свойств найдем свойство «Повторное использование сеансов» и установим для него значение «Не использовать».
  3. Если конфигурация находится на поддержке или сервис добавлен через расширение (где данное свойство может быть недоступно в дизайнере метаданных), настроим публикацию через файл default.vrd. Для этого в описании сервиса добавим атрибут reuseSessions="dontuse".

Посмотрим на пример фрагмента файла публикации default.vrd с отключением повторного использования сессий:


<service name="MyExchangeService"
         alias="MyExchangeService.1cws"
         reuseSessions="dontuse"/>

Важный нюанс: при таком подходе сеанс завершается мгновенно, но каждый последующий вызов сервиса будет занимать больше времени из-за полной повторной инициализации окружения 1С.

Способ 2. Тонкая настройка пула и времени жизни сеанса

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

  1. В конфигураторе в свойствах веб-сервиса зададим параметр «Время жизни сеанса» (в секундах), например 20 или 60.
  2. В файле default.vrd укажем параметры автоматического пула сеансов:
    
    <service name="MyExchangeService"
             alias="MyExchangeService.1cws"
             reuseSessions="autouse"
             sessionMaxAge="20"
             poolSize="10"
             poolTimeout="5"/>
    

Разберем параметры этой настройки подробнее:

  1. reuseSessions="autouse" — платформа автоматически распределяет входящие запросы по свободным сеансам из пула.
  2. sessionMaxAge="20" — время жизни неактивного сеанса в секундах. Если в течение 20 секунд новых запросов не поступило, сеанс будет корректно закрыт платформой.
  3. poolSize="10" — максимальное число одновременно удерживаемых сессий для данного сервиса.
  4. poolTimeout="5" — время ожидания освобождения сеанса при превышении размера пула.

Способ 3. Явное управление сессией со стороны клиента (через HTTP-заголовки)

Если в свойствах сервиса установлено «Повторное использование сеансов» = «Использовать» (в default.vrd задан параметр reuseSessions="use"), клиентское приложение может самостоятельно управлять открытием и закрытием сессии:

  1. Старт сеанса: при первом запросе клиент передает специальный HTTP-заголовок IBSession: start. Платформа 1С инициализирует сессию и возвращает в заголовке ответа Cookie с идентификатором сеанса (IBSession=<GUID>).
  2. Рабочие запросы: вызывающая сторона передает полученный Cookie в каждом последующем вызове, не создавая новые сеансы в базе.
  3. Завершение сеанса: в последнем вызове клиент отправляет заголовок IBSession: finish. Обработав запрос, платформа сразу завершает сеанс пользователя и освобождает лицензию.

Способ 4. Ограничение времени спящих сеансов на уровне кластера 1С

Если к веб-сервису обращаются сторонние системы, поведение которых сложно изменить, настроим принудительное завершение неактивных сеансов средствами кластера серверов 1С:

  1. Откроем консоль администрирования кластера серверов 1С (утилиту ras / rac или оснастку MMC).
  2. Перейдем в свойства нужной информационной базы.
  3. Установим параметр «Время засыпания пассивных сеансов» (например, 60 секунд).
  4. Установим параметр «Время завершения спящих сеансов» (например, 60 секунд).

После применения параметров фоновые процессы кластера будут принудительно закрывать оставшиеся неактивные подключения, предотвращая разрастание списка сеансов.

← На главную