Как исправить ошибку «Сеанс отсутствует или удален File=src\ClusterDistribImpl.cpp» при работе с Web-сервисами в 1С:Предприятие 8.3?

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

При обновлении платформы 1С:Предприятие (например, при переходе с релизов ветки 8.3.9 на 8.3.11 и выше) администраторы и разработчики нередко сталкиваются с ситуацией, когда обычные пользовательские подключения через веб-клиент или тонкий клиент продолжают успешно работать, однако внешние Web-сервисы и HTTP-сервисы перестают отвечать на запросы. В ответ на вызов возвращается критическая ошибка:

1C:Enterprise 8 application error: Невосстановимая ошибка by reason: Сеанс отсутствует или удален ID=..., File=src\ClusterDistribImpl.cpp

Разберем детально, почему возникает данная проблема на уровне архитектуры платформы 1С, и рассмотрим пошаговые методы восстановления корректной работы сервисов.

Причины возникновения ошибки в ClusterDistribImpl.cpp

Файл исходного кода ClusterDistribImpl.cpp в составе платформы 1С отвечает за распределение клиентских вызовов и маршрутизацию сеансов между менеджером кластера (rmngr) и рабочими процессами (rphost). Появление ошибки свидетельствует о том, что веб-расширение (модули wsisapi.dll для IIS или wsap24.dll для Apache) попыталось перенаправить поступивший HTTP/SOAP-запрос сеансу, который кластер 1С посчитал недействительным или уже уничтожил.

Проанализируем основные факторы, вызывающие этот сбой:

  1. Некорректная конфигурация пула сеансов в файле публикации (default.vrd): В новых релизах платформы существенно изменились правила повторного использования сеансов (параметр reuseSessions). Несоответствие между заголовками запроса и параметрами файла публикации приводит к мгновенному сбросу соединения.
  2. Неявная ошибка аутентификации: При отсутствии явной авторизации в теле или заголовках внешнего запроса веб-сервер пытается передать кластеру учетные данные системного пула (например, IIS_IUSRS). Кластер 1С создает кратковременный сеанс, не находит сопоставленного пользователя и аварийно завершает его до выполнения программного кода веб-сервиса.
  3. Кэш и устаревшие дескрипторы процессов кластера: При смене версии платформы служебные файлы реестра кластера в каталоге srvinfo могут содержать некорректную информацию о привязке сервисов к рабочим процессам.
  4. Нехватка клиентских лицензий для фонового сеанса: Если веб-клиент работает по одной лицензии, то входящий вызов сервиса пытается захватить отдельную лицензию на сеанс. Если лицензий недостаточно, сеанс уничтожается кластером в момент инициализации.

Способ 1. Корректировка параметров пула сеансов в default.vrd

Рассмотрим конфигурационный файл публикации информационной базы default.vrd, расположенный в каталоге публикации на веб-сервере. Поведение управления сеансами регулируется атрибутом reuseSessions.

Разберем три режима работы данного параметра:

  1. reuseSessions="use": Требует обязательной поддержки управления сеансами со стороны вызывающей системы. Внешний клиент при первом обращении обязан передавать заголовок IBSession=start и сохранять возвращаемые сервером cookie-файлы. Если клиент этого не делает, платформа возвращает ошибку отсутствия заголовка управления сеансами.
  2. reuseSessions="dontuse": На каждый входящий запрос кластер серверов 1С создает отдельный независимый сеанс и удаляет его сразу после формирования ответа. Если запросы идут с высокой частотой, менеджер кластера не успевает регистрировать и очищать структуры, вызывая коллизию сеансов.
  3. reuseSessions="autouse": Платформа самостоятельно управляет пулом сеансов для обслуживания входящих веб-вызовов. Для стабильной работы в этом режиме необходимо явно задать сопутствующие параметры пула.

Для устранения ошибки откроем файл default.vrd в текстовом редакторе и настроим секцию публикации веб-сервисов следующим образом:


<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/BaseName"
       ib="Srvr=Server1C;Ref=BaseName;">
    <ws enable="true"
        reuseSessions="autouse"
        sessionMaxAge="60"
        poolSize="10"
        poolTimeout="5"/>
    <httpServices enable="true"/>
</point>

Посмотрим на параметры, которые мы указали:

Параметр sessionMaxAge="60" определяет максимальное время жизни неактивного сеанса в пуле (в секундах). Параметр poolSize="10" задает количество одновременно удерживаемых сеансов, а poolTimeout="5" указывает время ожидания освобождения сеанса из пула при пиковых нагрузках.

Способ 2. Явное указание пользователя для веб-сервисов

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

Рассмотрим два варианта решения:

  1. Передача авторизации со стороны внешнего клиента: В заголовках HTTP-запроса клиент должен передавать строку базовой аутентификации с логином и паролем специально созданного пользователя 1С, у которого есть роль с правами на использование конкретного Web-сервиса.
  2. Указание учетных данных в строке подключения файла публикации: Если внешнюю систему изменить нельзя, пропишем служебного пользователя прямо в строке подключения внутри default.vrd:

<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       base="/BaseName"
       ib="Srvr=Server1C;Ref=BaseName;Usr=WebIntegration;Pwd=SecretPassword;">

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

Способ 3. Очистка кэша кластера серверов 1С

При обновлении платформы служебная информация о предыдущих рабочих процессах часто сохраняется в файлах состояния кластера. Проанализируем процедуру корректной очистки служебного кэша сервера:

  1. Остановим службу веб-сервера (IIS или Apache).
  2. Остановим службу агента сервера 1С:Предприятия (1C:Enterprise 8.3 Server Agent).
  3. Перейдем в каталог данных кластера (по умолчанию: C:\Program Files\1cv8\srvinfo\reg_1541\).
  4. Удалим все каталоги с кэшем сеансов и временными файлами: папки вида snserver..., 1CACache, а также временные файлы с расширением .tmp. Каталоги с самими базами данных и файл 1cv8wsrv.lst не удаляем.
  5. Запустим службу агента сервера 1С.
  6. Запустим службу веб-сервера и выполним повторную публикацию информационной базы через Конфигуратор (меню Администрирование → Публикация на веб-сервере).

Способ 4. Настройка рабочих процессов кластера (rphost)

Если в кластере серверов 1С настроено несколько рабочих процессов rphost, вызовы веб-сервисов могут адресоваться процессу, в котором отсутствует контекст открытого сеанса. Проверим настройки кластера в консоли Администрирование серверов 1С:Предприятия:

  1. Развернем ветку нужного кластера и откроем свойства рабочего сервера.
  2. Проверим параметр Количество ИБ на один процесс и Количество сеансов на один процесс.
  3. В целях диагностики установим режим работы кластера с одним рабочим процессом (или увеличим лимит сеансов на процесс), чтобы исключить разрыв контекста при межпроцессном взаимодействии.
  4. Применим изменения и перезапустим рабочий сервер.

Способ 5. Проверка таймаутов спящих и пассивных сеансов

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

  1. Откроем базу в режиме Конфигуратор с правами администратора.
  2. Перейдем в меню Администрирование → Параметры информационной базы.
  3. Проверим значения следующих параметров:
    1. Время завершения спящего сеанса: рекомендуется установить значение по умолчанию — 86400 секунд.
    2. Время завершения пассивного сеанса: установим значение не менее 1200 секунд.
  4. Сохраним настройки и проверим работу веб-сервиса со стороны внешнего приложения.
← На главную