Почему при обращении к веб-сервису 1С возникает ошибка «Сеанс отсутствует или удален» и как это исправить?

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

При работе с веб-сервисами в среде 1С:Предприятие 8.3 системные администраторы и разработчики часто сталкиваются с крайне неприятной ситуацией: веб-сервис прекрасно работает в пустой базе или в файловом варианте, но стоит только добавить первого пользователя или перенести базу на полноценный сервер (SQL), как обращения к WSDL-схеме или методам сервиса начинают возвращать критическую ошибку. Текст ошибки обычно выглядит следующим образом: «1C:Enterprise 8 application error: Невосстановимая ошибка. Сеанс отсутствует или удален ID=..., File=src\ClusterDistribImpl.cpp». При этом тонкий и веб-клиенты могут продолжать работать в штатном режиме.

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

Разбор ситуации: почему это происходит?

Для начала проанализируем симптомы. Проблема чаще всего проявляется на версиях платформы 8.3.13.х (например, 1690) и выше. Суть заключается в том, что когда в информационной базе нет ни одного пользователя, веб-сервер (Apache или IIS) подключается к базе анонимно, и платформа без проблем инициализирует сеанс. Однако, как только появляется хотя бы один пользователь, механизм безопасности 1С требует аутентификации.

Ошибка в файле ClusterDistribImpl.cpp указывает на то, что сбой происходит на уровне распределения сеансов внутри кластера серверов 1С. В момент обращения к веб-сервису модуль расширения веб-сервера пытается создать сеанс, но по какой-то причине (часто из-за багов в конкретных релизах платформы) связь между рабочим процессом rphost и менеджером кластера разрывается или идентификатор сеанса передается некорректно. Система «теряет» только что созданный сеанс, о чем и сообщает в логах.

Способ №1: Явное указание пользователя в файле публикации (Workaround)

Как показывает практика и обсуждения на форумах, самым быстрым и эффективным «лекарством» является исключение этапа интерактивного запроса логина и пароля при обращении к веб-сервису. Если мы заранее сообщим веб-серверу, под каким пользователем нужно подключаться к базе 1С, ошибка исчезает.

Рассмотрим по шагам, как отредактировать файл конфигурации публикации:

  1. Перейдем в каталог, где опубликована ваша база. По умолчанию для Apache на Windows это может быть путь вида C:\inetpub\wwwroot\ваша_база или папка, указанная при публикации через конфигуратор.
  2. Найдем файл default.vrd. Это XML-файл, описывающий параметры подключения к информационной базе.
  3. Откроем его любым текстовым редактором (например, Notepad++).
  4. Найдем строку, начинающуюся с тега <point ...>. Внутри этого тега есть атрибут ib, который содержит строку соединения.
  5. Добавим в строку соединения параметры пользователя Usr и пароля Pwd.

Давайте посмотрим на пример того, как должна выглядеть строка подключения в файле 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="/MyBase"
        ib="Srvr=&quot;MyServer&quot;;Ref=&quot;MyBaseName&quot;;Usr=&quot;WebServiceUser&quot;;Pwd=&quot;MyPassword123&quot;;">
    <ws>
        <point name="Exchange" alias="exchange.1cws" enable="true"/>
    </ws>
</point>

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

Способ №2: Проверка настроек кластера 1С

Если правка default.vrd не помогает или невозможна по соображениям безопасности, проанализируем настройки самого кластера. Иногда сеанс «вылетает» из-за агрессивных настроек энергосбережения или лимитов памяти. Рассмотрим параметры рабочего сервера в консоли администрирования 1С:

  1. Запустим консоль «Администрирование серверов 1С Предприятия».
  2. Перейдем в ветку Кластеры -> [Имя кластера] -> Рабочие серверы.
  3. Откроем свойства рабочего сервера (обычно это localhost).
  4. Проверим параметр «Безопасный расход памяти за один вызов». Если там установлено значение, отличное от нуля, попробуем временно установить 0 (без ограничений).
  5. Проверим «Количество сеансов на рабочий процесс». Если это значение слишком мало (например, 10–20), это может приводить к тому, что при попытке веб-сервиса создать новый поток, кластер будет «отфутболивать» соединение.

Также стоит обратить внимание на перезапуск рабочих процессов. Если в настройках кластера стоит малый интервал перезапуска или жесткий лимит по памяти, процессы rphost могут завершаться именно в момент инициализации тяжелого веб-сервиса.

Способ №3: Анализ разрядности и модулей расширения

Выясним еще одну важную техническую деталь. Очень часто ошибка возникает при несоответствии разрядности веб-сервера и платформы 1С. Рассмотрим типичную ошибку: установлен 64-битный Apache (x64), а платформа 1С используется 32-битная (x86). Модуль wsap24.dll должен соответствовать разрядности Apache, а не сервера 1С.

Проанализируем файл httpd.conf вашего Apache. В нем должна быть строка загрузки модуля 1С:

LoadModule _1cws_module "C:/Program Files/1cv8/8.3.13.1690/bin/wsap24.dll"

Если ваш Apache 64-битный, путь должен вести к папке Program Files, а если 32-битный — к Program Files (x86). Смешивание разрядностей может приводить к нестабильной работе памяти, что выливается в ошибки ClusterDistribImpl.cpp.

Способ №4: Использование технологического журнала (ТЖ)

Если вышеуказанные способы не помогли, нам придется «заглянуть «под капот» системы. Для этого настроим сбор логов технологического журнала. Это поможет понять, в какой именно момент сеанс помечается как удаленный.

Создадим файл logcfg.xml в папке C:\Program Files\1cv8\conf (или аналогичной для вашей версии) со следующим содержанием:


<config xmlns="http://v8.1c.ru/7.3/config">
    <log location="C:\Logs\1C" history="2">
        <event>
            <eq property="Name" value="EXCP"/>
        </event>
        <event>
            <eq property="Name" value="SESN"/>
        </event>
        <property name="all"/>
    </log>
</config>

После этого попробуем вызвать веб-сервис и изучим файлы в каталоге C:\Logs\1C. Ищите события EXCP (Exception). Если в описании ошибки вы увидите SeanceContextException, это подтвердит гипотезу о проблемах инициализации контекста пользователя. В некоторых случаях там может быть более детальная информация, например, об отсутствии прав на какой-то конкретный объект метаданных или расширение.

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

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

Краткий чек-лист по исправлению:

Надеемся, что данные рекомендации помогут вам восстановить стабильную работу ваших интеграционных механизмов!

← На главную