При работе с веб-сервисами в среде 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С, ошибка исчезает.
Рассмотрим по шагам, как отредактировать файл конфигурации публикации:
C:\inetpub\wwwroot\ваша_база или папка, указанная при публикации через конфигуратор.default.vrd. Это XML-файл, описывающий параметры подключения к информационной базе.<point ...>. Внутри этого тега есть атрибут ib, который содержит строку соединения.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="MyServer";Ref="MyBaseName";Usr="WebServiceUser";Pwd="MyPassword123";">
<ws>
<point name="Exchange" alias="exchange.1cws" enable="true"/>
</ws>
</point>
Важный момент: используйте для этих целей специально созданного пользователя с минимально необходимыми правами для работы конкретного веб-сервиса. Это безопаснее, чем прописывать учетную запись администратора системы.
Если правка default.vrd не помогает или невозможна по соображениям безопасности, проанализируем настройки самого кластера. Иногда сеанс «вылетает» из-за агрессивных настроек энергосбережения или лимитов памяти. Рассмотрим параметры рабочего сервера в консоли администрирования 1С:
localhost).0 (без ограничений).Также стоит обратить внимание на перезапуск рабочих процессов. Если в настройках кластера стоит малый интервал перезапуска или жесткий лимит по памяти, процессы rphost могут завершаться именно в момент инициализации тяжелого веб-сервиса.
Выясним еще одну важную техническую деталь. Очень часто ошибка возникает при несоответствии разрядности веб-сервера и платформы 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.
Если вышеуказанные способы не помогли, нам придется «заглянуть «под капот» системы. Для этого настроим сбор логов технологического журнала. Это поможет понять, в какой именно момент сеанс помечается как удаленный.
Создадим файл 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С, связанная с механизмом аутентификации в клиент-серверном режиме.
Краткий чек-лист по исправлению:
default.vrd.wsap24.dll (или isapi_1c.dll для IIS).Надеемся, что данные рекомендации помогут вам восстановить стабильную работу ваших интеграционных механизмов!