Как отключить зависающие сеансы веб-сервисов 1С и отладить объекты XDTO?

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

Анализ проблемы зависания сеансов веб-сервисов

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

Выясним причину такого поведения. По умолчанию платформа 1С использует пул сеансов для веб-сервисов и HTTP-сервисов. Это необходимо для ускорения повторных обращений, чтобы каждый раз не тратить время на авторизацию и создание нового соединения. Однако при тестовых вызовах без сохранения cookie сессии или при некорректных настройках пула каждый запрос приводит к созданию нового неактивного сеанса, который удерживается рабочими процессами веб-сервера.

Настройка файла публикации default.vrd для управления сеансами

Разберём по шагам, как отредактировать файл публикации default.vrd для корректного завершения или ограничения времени жизни сеансов. Файл публикаций находится в каталоге веб-сервера (Apache или IIS) и содержит параметр sessionPoolSettings.

Проанализируем основные параметры элемента sessionPoolSettings:

  1. reuse — отвечает за повторное использование сеансов. Если задать значение dontUse, платформа не будет сохранять сеанс в пуле, и он закрывается сразу после выполнения вызова. Значение use или auto активирует повторное использование.
  2. sessionTimeout — время жизни неактивного сеанса в секундах. Значение 0 часто приводит к ошибкам и накапливанию зависших сеансов. Рекомендуется указывать явный таймаут (например, 20 секунд).
  3. maxSessions и poolTimeout — задают максимальное количество удерживаемых сеансов и таймаут ожидания освобождения сеанса.

Посмотрим на пример конфигурации секции пула сеансов в файле default.vrd:


<point name="MyWebService"
       alias="ws1.1cws"
       enable="true">
    <sessionPoolSettings reuse="dontUse"
                         sessionTimeout="20"
                         maxSessions="10"
                         poolTimeout="5" />
</point>

Если требуется применить параметры ко всем сервисам публикации, тег sessionPoolSettings можно вынести на верхний уровень конфигурации default.vrd.

Способы работы и отладки объектов XDTO в 1С

В процессе разработки веб-сервисов в параметры процедур и функций часто передаётся ОбъектXDTO. В отличие от стандартной структуры или массива 1С, данный объект создан на основе XSD-схемы, поэтому его внутренние свойства не разворачиваются стандартным образом в табло отладчика. Проанализируем практические способы просмотра данных XDTO-объекта.

Способ 1. Преобразование объекта XDTO в XML-строку

Самый простой и эффективный способ просмотреть внутреннюю структуру и значения параметров — сериализовать ОбъектXDTO в строку XML с помощью объектов ЗаписьXML и ФабрикаXDTO.

Рассмотрим пример кода:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ПараметрXDTO);
ТекстXML = ЗаписьXML.Закрыть();

Сформированную переменную ТекстXML можно легко скопировать из табло отладчика или выгрузить в текстовый файл для анализа.

Способ 2. Чтение данных через СериализаторXDTO

Если переданный ОбъектXDTO формировался на стороне 1С и содержит типы платформы, вы можете декодировать его в прикладные объекты с помощью объекта СериализаторXDTO.

Посмотрим, как это реализуется в коде:

Значение1С = СериализаторXDTO.ПрочитатьXDTO(ПараметрXDTO);

После выполнения этой команды переменная Значение1С преобразуется в стандартный объект 1С (структуру, соответствие или массив) и будет полностью разворачиваться в дереве отладчика.

Способ 3. Программный обход свойств XDTO-объекта

Если необходимо перебрать свойства объекта в цикле, воспользуемся коллекцией Свойства() и методом Получить() объекта ОбъектXDTO.

Разберём пример программного обхода:


Для Каждого Свойство Из ПараметрXDTO.Свойства() Цикл
    ИмяСвойства = Свойство.Имя;
    ЗначениеСвойства = ПараметрXDTO.Получить(Свойство);
КонецЦикла;

Способ 4. Логирование входящих данных в Журнал регистрации

На этапе отладки боевых сервисов останавливаться точками останова не всегда удобно. В таком случае рекомендуем записывать полученный XML-пакет напрямую в журнал регистрации с помощью процедуры ЗаписьЖурналаРегистрации.

Рассмотрим пример записи входящего пакета:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ПараметрXDTO);
ТекстXML = ЗаписьXML.Закрыть();

ЗаписьЖурналаРегистрации("ВебСервис.ВходящийПакет",
    УровеньЖурналаРегистрации.Информация,,,
    ТекстXML);

Использование описанных настроек и методов позволит эффективно управлять сеансами веб-сервисов 1С и оперативно отлаживать передаваемые XDTO-данные.

← На главную