При обновлении платформы 1С:Предприятие (например, при переходе с релизов ветки 8.3.9 на 8.3.11 и выше) администраторы и разработчики нередко сталкиваются с ситуацией, когда обычные пользовательские подключения через веб-клиент или тонкий клиент продолжают успешно работать, однако внешние Web-сервисы и HTTP-сервисы перестают отвечать на запросы. В ответ на вызов возвращается критическая ошибка:
1C:Enterprise 8 application error: Невосстановимая ошибка by reason: Сеанс отсутствует или удален ID=..., File=src\ClusterDistribImpl.cpp
Разберем детально, почему возникает данная проблема на уровне архитектуры платформы 1С, и рассмотрим пошаговые методы восстановления корректной работы сервисов.
Файл исходного кода ClusterDistribImpl.cpp в составе платформы 1С отвечает за распределение клиентских вызовов и маршрутизацию сеансов между менеджером кластера (rmngr) и рабочими процессами (rphost). Появление ошибки свидетельствует о том, что веб-расширение (модули wsisapi.dll для IIS или wsap24.dll для Apache) попыталось перенаправить поступивший HTTP/SOAP-запрос сеансу, который кластер 1С посчитал недействительным или уже уничтожил.
Проанализируем основные факторы, вызывающие этот сбой:
default.vrd): В новых релизах платформы существенно изменились правила повторного использования сеансов (параметр reuseSessions). Несоответствие между заголовками запроса и параметрами файла публикации приводит к мгновенному сбросу соединения.IIS_IUSRS). Кластер 1С создает кратковременный сеанс, не находит сопоставленного пользователя и аварийно завершает его до выполнения программного кода веб-сервиса.srvinfo могут содержать некорректную информацию о привязке сервисов к рабочим процессам.Рассмотрим конфигурационный файл публикации информационной базы default.vrd, расположенный в каталоге публикации на веб-сервере. Поведение управления сеансами регулируется атрибутом reuseSessions.
Разберем три режима работы данного параметра:
reuseSessions="use": Требует обязательной поддержки управления сеансами со стороны вызывающей системы. Внешний клиент при первом обращении обязан передавать заголовок IBSession=start и сохранять возвращаемые сервером cookie-файлы. Если клиент этого не делает, платформа возвращает ошибку отсутствия заголовка управления сеансами.reuseSessions="dontuse": На каждый входящий запрос кластер серверов 1С создает отдельный независимый сеанс и удаляет его сразу после формирования ответа. Если запросы идут с высокой частотой, менеджер кластера не успевает регистрировать и очищать структуры, вызывая коллизию сеансов.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" указывает время ожидания освобождения сеанса из пула при пиковых нагрузках.
Выясним, как исключить проблемы с правами и авторизацией. Если внешний сайт или сервис обращается к 1С без передачи заголовка Authorization: Basic, кластер не может сопоставить права. Для исправления ситуации настроим явную авторизацию.
Рассмотрим два варианта решения:
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 в конфигураторе отключена аутентификация операционной системы и снят флаг разделения сеансов, если используются разделенные базы данных.
При обновлении платформы служебная информация о предыдущих рабочих процессах часто сохраняется в файлах состояния кластера. Проанализируем процедуру корректной очистки служебного кэша сервера:
1C:Enterprise 8.3 Server Agent).C:\Program Files\1cv8\srvinfo\reg_1541\).snserver..., 1CACache, а также временные файлы с расширением .tmp. Каталоги с самими базами данных и файл 1cv8wsrv.lst не удаляем.Если в кластере серверов 1С настроено несколько рабочих процессов rphost, вызовы веб-сервисов могут адресоваться процессу, в котором отсутствует контекст открытого сеанса. Проверим настройки кластера в консоли Администрирование серверов 1С:Предприятия:
Если сеансы веб-сервисов принудительно разрываются самой конфигурацией до завершения длительных операций, проверим системные таймауты информационной базы:
86400 секунд.1200 секунд.