Работа веб-клиента 1С:Предприятие через обратный прокси-сервер (Reverse Proxy) — это стандартная практика для обеспечения безопасности и удобства доступа. Однако часто системные администраторы сталкиваются с ситуацией, когда после успешной авторизации в браузере вместо интерфейса программы появляется сообщение «К сожалению, возникла ошибка». При этом в локальной сети всё работает безупречно.
Разберем детально, почему возникает эта проблема, проанализируем технические нюансы взаимодействия платформы 1С с прокси-сервером Traefik и найдем способ корректной настройки системы.
Рассмотрим ситуацию: используется платформа 1С версии 8.3.20.1914 (хотя проблема актуальна для всей ветки 8.3), конфигурация ERP Управление холдингом, развернутая на Windows Server 2019. В качестве веб-сервера выступает Apache или IIS, а внешние запросы принимает Traefik. Проблема проявляется специфическим образом: авторизация проходит успешно, но на этапе загрузки основного интерфейса возникает критическая ошибка JavaScript в файле mod_main_loader.js.
Проанализируем технологический журнал (ТЖ) сервера 1С. В моменты возникновения ошибки часто фиксируются события:
09:59.432010-0,EXCP,2,p:processName=RegMngrCntxt,... Descr='Первичный вызов сервиса пришел в пассивный сервис.'
09:59.932041-0,EXCP,2,p:processName=RegMngrCntxt,... Descr='Сеанс отсутствует или удален ID=...'
Выясним причину такого поведения. Основная сложность заключается в том, как 1С формирует URL-запросы. Платформа активно использует символ точки с запятой (;) в качестве разделителя параметров в строке запроса (Query String). Это необходимо для передачи идентификаторов форм, контекста и сеансов. Современные прокси-серверы, включая Traefik (начиная с версии 2.0), по соображениям безопасности могут блокировать, искажать или некорректно кодировать точку с запятой, считая её подозрительным символом. В результате веб-клиент 1С не может получить необходимые данные, что приводит к краху скрипта mod_main_loader.js.
Основное решение заключается в явном указании прокси-серверу Traefik на необходимость корректной обработки точек с запятой. Для этого в статической конфигурации (файл traefik.yml) в разделе описания точек входа (EntryPoints) необходимо добавить параметр encodeQuerySemicolons: true.
Рассмотрим пример правильной настройки traefik.yml:
entryPoints:
web:
address: ":80"
http:
encodeQuerySemicolons: true
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
http:
encodeQuerySemicolons: true
В данном примере мы активировали параметр для обоих портов (HTTP и HTTPS). Это гарантирует, что Traefik будет пропускать запросы с символом ; без их предварительного кодирования, которое «ломает» логику веб-клиента 1С.
Если вы используете Traefik в контейнерах Docker или запускаете его через командную строку без использования файла traefik.yml, настройки можно передать в виде флагов. Это особенно удобно для облачных развертываний.
Проанализируем необходимые параметры запуска:
command:
- --entryPoints.web.address=:80
- --entrypoints.web.http.encodequerysemicolons=true
- --entrypoints.web.http.redirections.entryPoint.to=websecure
- --entrypoints.web.http.redirections.entryPoint.scheme=https
- --entryPoints.websecure.address=:443
- --entrypoints.websecure.http.encodequerysemicolons=true
Обратите внимание, что название параметра в CLI версии должно быть записано в нижнем регистре. После применения этих настроек и перезапуска контейнера Traefik, веб-клиент 1С начнет корректно загружать модули интерфейса.
Даже после исправления ошибки с точкой с запятой, вы можете столкнуться с сообщением «Первичный вызов сервиса пришел в пассивный сервис». Разберем, почему это происходит. В кластерных решениях 1С сеанс пользователя привязан к конкретному рабочему процессу или серверу. Если Traefik перекинет очередной запрос пользователя на другой узел кластера, тот «не узнает» сеанс и выдаст ошибку.
Для решения этой проблемы в динамической конфигурации (Dynamic Configuration) необходимо включить механизм Sticky Sessions. Посмотрим на пример настройки сервиса:
http:
services:
1c-service:
loadBalancer:
sticky:
cookie:
name: "SRV_ID"
httpOnly: true
secure: true
servers:
- url: "http://192.168.1.10/erp_base"
Использование sticky sessions гарантирует, что все запросы в рамках одного сеанса браузера будут направляться на один и тот же внутренний сервер 1С.
Для того чтобы 1С правильно понимала, что она работает через прокси, и корректно строила внутренние ссылки (особенно при использовании HTTPS на внешнем контуре и HTTP внутри сети), Traefik должен передавать правильные заголовки. По умолчанию Traefik делает это автоматически, но важно убедиться, что промежуточные веб-серверы (Apache/IIS) их принимают.
Ключевые заголовки:
Если вы используете IIS, убедитесь, что установлен модуль ARR (Application Request Routing), а в настройках Apache включен mod_proxy и правильно настроен параметр ProxyPreserveHost On.
Подведем итог. Ошибка «Первичный вызов сервиса пришел в пассивный сервис» и сбои в mod_main_loader.js при использовании Traefik чаще всего не связаны с ошибками в коде 1С или повреждением базы данных. Это чисто инфраструктурная проблема настройки сетевого пути.
Основные шаги для исправления:
encodeQuerySemicolons: true в статической конфигурации Traefik для всех используемых EntryPoints.Sticky Sessions в описании сервиса Traefik для обеспечения привязки сеанса к рабочему процессу 1С.X-Forwarded-*, а веб-сервер 1С их интерпретирует.default.vrd) не включены специфические ограничения, которые могут конфликтовать с настройками прокси.Соблюдение этих правил позволит обеспечить стабильную и быструю работу веб-клиента ERP и других тяжелых конфигураций 1С через современные балансировщики нагрузки и обратные прокси-серверы.