Как устранить ошибку «Session request timeout expired» и нестабильную работу HTTP/REST сервисов в 1С?

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

В процессе эксплуатации клиент-серверных баз 1С на платформе 8.3 (особенно версий 8.3.9–8.3.12) многие разработчики сталкиваются с крайне неприятной проблемой: после некоторого времени стабильной работы HTTP-сервисы или интерфейс OData начинают возвращать ошибку «Session request timeout expired» (или «Истекло время ожидания сеанса»). Проблема осложняется тем, что удаление сеансов через консоль кластера 1С не приносит результата, и единственным временным спасением остается перезапуск службы 1C:Enterprise 8.3 Server Agent. В этой статье мы подробно разберем, почему это происходит, и как настроить систему для стабильной работы.

Выясняем причину: механизм переиспользования сеансов

Давайте проанализируем ситуацию. Начиная с версии платформы 8.3.9, компания 1С внедрила механизм Session Pooling (пул сеансов) для веб-сервисов. Основная цель этого нововведения — повысить производительность за счет исключения затрат времени на авторизацию пользователя и инициализацию параметров сеанса при каждом чих-запросе. За управление этим механизмом отвечает параметр reuseSessions в файле публикации .vrd.

Рассмотрим, как это работает в теории: когда запрос приходит на IIS или Apache, модуль расширения 1С проверяет наличие свободного «спящего» сеанса в пуле. Если такой сеанс есть, он подхватывает запрос, выполняет код и возвращается в пул. Если сеанса нет — создается новый.

Однако на практике в версиях 8.3.10 и при использовании режима совместимости с 8.2 этот механизм работает некорректно. Происходит «залипание» сеансов: система считает, что сеанс занят обработкой, хотя фактически он бездействует. В итоге новые запросы выстраиваются в очередь, ждут освобождения сеанса из пула и, не дождавшись, выдают ошибку таймаута.

Решение №1: Отключение переиспользования сеансов (Самый надежный метод)

Если ваша конфигурация работает в режиме совместимости или вы используете платформу ниже 8.3.12, самым эффективным решением будет полный отказ от автоматического использования пула сеансов. Разберем по шагам, как это сделать:

  1. Перейдем в каталог, где опубликована ваша база на веб-сервере (обычно это папка внутри C:\inetpub\wwwroot\).
  2. Найдем файл default.vrd и откроем его любым текстовым редактором.
  3. Найдем определение вашего HTTP-сервиса или блока OData.
  4. Изменим значение атрибута reuseSessions с "autouse" на "dontuse".

Пример того, как должен выглядеть блок в файле .vrd:


<httpServices publishByDefault="false">
    <service name="MyService"
             rootUrl="my_service"
             enable="true"
             reuseSessions="dontuse"/>
</httpServices>

Установка reuseSessions="dontuse" заставляет платформу создавать новый сеанс для каждого входящего запроса и завершать его сразу после отправки ответа. Это увеличивает нагрузку на сервер (время на авторизацию), но полностью устраняет проблему «мертвых» сеансов и таймаутов.

Решение №2: Тонкая настройка пула сеансов

Если нагрузка на ваш сервис очень велика и создание сеанса на каждый запрос обходится слишком «дорого» для процессора, попробуем оставить reuseSessions="autouse", но скорректировать параметры самого пула. Для этого в файле .vrd внутри тега point (или zone) добавим описание пула сеансов.

Проанализируем следующие атрибуты:

Пример настройки пула:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       base="/MyBase"
       ib="Srvr=ServerName;Ref=BaseName;">
    <sessionPool size="20" timeout="60" maxAge="300"/>
    <httpService name="MyService" rootUrl="v1" reuseSessions="autouse"/>
</point>

Решение №3: Настройка Web Garden в IIS

Часто нестабильность HTTP-сервисов 1С связана с тем, что в настройках IIS (Internet Information Services) включено использование нескольких рабочих процессов для одного пула приложений. В терминологии IIS это называется Web Garden.

Выясним причину конфликта: каждый рабочий процесс IIS создает свой собственный экземпляр модуля расширения 1С, и каждый из них пытается управлять своим пулом сеансов. Это часто приводит к коллизиям и блокировкам на уровне серверных вызовов.

Для исправления выполним следующие действия:

  1. Откроем Диспетчер служб IIS.
  2. Перейдем в раздел Пулы приложений (Application Pools).
  3. Найдем пул, на котором опубликована база 1С, и выберем Дополнительные параметры (Advanced Settings).
  4. В разделе «Модель процесса» найдем пункт Максимум рабочих процессов (Maximum Worker Processes).
  5. Установим значение 1.

Важно: Для работы 1С через веб-сервер это значение всегда должно быть равно единице, если только вы не используете специфические сценарии балансировки.

Анализ утечек памяти в rphost

Рассмотрим еще один важный аспект. При использовании reuseSessions="autouse" сеанс не завершается. Это означает, что все глобальные переменные, объявленные в Модуле сеанса или Глобальном модуле, сохраняют свои значения между запросами. Если в коде вашего HTTP-сервиса используются тяжелые массивы, таблицы значений или структуры, которые не очищаются в конце выполнения запроса, объем памяти, занимаемый процессом rphost, будет постоянно расти.

В режиме совместимости с 8.2 механизмы сборки мусора могут работать не так эффективно, как в новых версиях. Мы рекомендуем в конце каждого метода HTTP-сервиса явно очищать созданные объекты:


Функция МойМетодГЕТ(Запрос)
    // Какой-то код обработки
    Результат = Новый Структура;
    
    // Выполняем логику
    // ...

    // Перед возвратом ответа очищаем тяжелые объекты
    ТяжелаяТаблица.Очистить();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(СформироватьJSON(Результат));
    Возврат Ответ;
КонецФункции

Подведем итоги

Для стабильной работы HTTP/REST интерфейсов на платформе 1С 8.3.10 в клиент-серверном варианте мы рекомендуем следующую стратегию:

  1. Если быстродействие создания сеанса не критично (запросы идут не каждую миллисекунду), установите reuseSessions="dontuse". Это самый надежный способ забыть об ошибках таймаута.
  2. Проверьте настройки пула приложений IIS — количество рабочих процессов должно быть строго равно 1.
  3. Если вы вынуждены использовать autouse, обязательно настройте sessionMaxAge в файле .vrd, чтобы сеансы принудительно пересоздавались раз в несколько минут.
  4. По возможности обновите платформу до версии 8.3.12 или выше, где ошибки механизма переиспользования сеансов были исправлены разработчиками 1С.

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

← На главную