Как исправить ошибку «Session management header or a cookie with session ID is not specified» при обращении к Web-сервису 1С?

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

При интеграции систем на базе платформы «1С:Предприятие 8.3» с внешними приложениями разработчики часто используют механизмы Web-сервисов (SOAP). Это проверенный временем и удобный способ организации двустороннего обмена данными. Однако в процессе развертывания и публикации Web-сервисов на веб-серверах (будь то IIS или Apache) можно столкнуться с неочевидным поведением платформы.

Типичный сценарий: при попытке получить WSDL-описание опубликованного веб-сервиса по ссылке вида http://127.0.0.1/erpdemo2/ws/miko_crm_api.1cws?wsdl в браузере или стороннем клиенте возвращается ошибка:

«Session management header or a cookie with session ID is not specified»

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

Выясняем причину: почему возникает ошибка?

Для того чтобы понять природу этой ошибки, нам необходимо проанализировать файл публикации веб-сервисов — default.vrd. Этот XML-файл располагается в каталоге виртуального приложения на веб-сервере и управляет всеми ключевыми параметрами взаимодействия веб-сервера с платформой 1С.

В файле default.vrd для каждой точки подключения (Web-сервиса) настраивается набор атрибутов. Обратим внимание на пример конфигурации:


<point name="микоПровайдерAPI"
       alias="miko_crm_api.1cws"
       enable="true"
       reuseSessions="use"
       sessionMaxAge="3000"
       poolSize="10"
       poolTimeout="5"/>

Ключевым параметром здесь является reuseSessions (Повторное использование сеансов). Этот параметр определяет, каким образом платформа 1С будет управлять сеансами пользователей при обработке входящих HTTP-запросов к данному веб-сервису.

Платформа 1С поддерживает три режима работы для параметра reuseSessions:

  1. dontuse (Не использовать): При каждом входящем SOAP-запросе платформа создает абсолютно новый сеанс 1С, выполняет требуемый метод и тут же завершает сеанс. Этот режим крайне непроизводителен, так как инициализация сеанса (особенно в тяжелых конфигурациях класса ERP или Комплексная автоматизация) может занимать от 1 до 5 секунд. Тем не менее, в этом режиме получение WSDL-схемы через браузер работает без каких-либо дополнительных условий.
  2. use (Использовать / Ручное управление): Этот режим активирует механизм повторного использования сеансов. При этом управление жизненным циклом сессии полностью ложится на плечи вызывающего (клиентского) приложения. Клиент обязан явно управлять сессиями с помощью специальных HTTP-заголовков. Если клиент отправляет обычный GET-запрос (например, из браузера для просмотра WSDL) без этих заголовков, платформа 1С отвергает запрос и возвращает ошибку «Session management header or a cookie with session ID is not specified».
  3. autouse (Использовать автоматически): Промежуточный режим, при котором веб-сервер 1С самостоятельно организует пул сеансов. Платформа сопоставляет входящие запросы по параметрам подключения (пользователь, пароль, разделители) и автоматически выделяет свободный сеанс из пула. При этом режиме ручное управление заголовками со стороны клиента не требуется, и WSDL-описание успешно отдается в браузер.

Таким образом, когда в файле default.vrd (или в метаданных самого веб-сервиса в конфигураторе) установлено значение use, стандартный браузер не может просто так получить WSDL-схему, так как он не передает обязательные параметры инициализации сессии.

Решение по шагам: Как получить WSDL в режиме ручного управления сессиями (use)

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

Вариант 1. Использование плагинов для модификации HTTP-заголовков в браузере

Если вам нужно оперативно просмотреть WSDL-структуру или импортировать её в локальный инструмент разработки непосредственно через браузер, мы можем принудительно заставить браузер отправить нужный заголовок инициализации сессии.

Для этого выполним следующие действия:

  1. Установим в браузер (например, Google Chrome или Яндекс.Браузер) расширение для модификации HTTP-заголовков. Отличным выбором будут расширения вроде «Modify Headers for Google Chrome», «Header Editor» или встроенные инструменты разработчика.
  2. Добавим новое правило для отправки заголовка при запросе к нашему веб-серверу.
  3. Зададим имя заголовка: IBSession.
  4. Зададим значение заголовка: start.
  5. Активируем правило и обновим страницу с адресом веб-сервиса: http://127.0.0.1/erpdemo2/ws/miko_crm_api.1cws?wsdl.

После этого веб-сервер 1С поймет, что мы инициируем новый сеанс, успешно обработает запрос и вернет корректную XML-структуру WSDL-описания.

Вариант 2. Программная реализация жизненного цикла сессии в клиентском приложении

Если внешняя система интегрируется с вашим веб-сервисом в режиме reuseSessions="use", разработчик этой системы обязан реализовать полноценный жизненный цикл сессии. Разберем этот алгоритм по шагам:

  1. Инициализация (Старт): При первом обращении к веб-сервису (например, для авторизации или получения первичных данных) клиент отправляет HTTP-запрос, в который добавляет заголовок:
    IBSession: start.
  2. Сохранение идентификатора: В ответ на этот запрос сервер 1С возвращает HTTP-заголовок ответа Set-Cookie, содержащий уникальный идентификатор сессии, например:
    Set-Cookie: ibsession=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; path=/;.
    Клиентское приложение должно считать это значение и сохранить его в памяти.
  3. Последующие вызовы (Работа в сеансе): Для всех последующих запросов к методам веб-сервиса клиент больше не должен передавать заголовок IBSession: start. Вместо этого он обязан передавать сохраненные куки в заголовке запроса:
    Cookie: ibsession=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
    Благодаря этому запросы будут выполняться мгновенно внутри одного и того же запущенного сеанса 1С.
  4. Завершение работы (Финиш): Чтобы сеанс не оставался «висеть» в памяти сервера, расходуя лицензии и ресурсы системы, клиент перед закрытием соединения должен отправить финальный запрос с заголовком:
    IBSession: finish.
    При этом также обязательно передается заголовок Cookie: ibsession=.... Платформа 1С корректно завершит сеанс и освободит лицензию.

Вариант 3. Переход на автоматический режим управления сессиями (autouse)

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

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


<point name="микоПровайдерAPI"
       alias="miko_crm_api.1cws"
       enable="true"
       reuseSessions="autouse"
       sessionMaxAge="1200"
       poolSize="20"
       poolTimeout="5"/>

Разберем параметры, которые критически важно настроить при использовании пула сеансов:

После сохранения файла default.vrd и перезапуска веб-сервера (IIS/Apache) WSDL-описание веб-сервиса станет доступно по прямой ссылке в любом браузере без каких-либо дополнительных манипуляций с заголовками.

Вариант 4. Использование статического WSDL-файла при разработке

При активной разработке постоянная генерация динамического WSDL платформой 1С может замедлять процесс импорта схемы во внешние среды (например, в Visual Studio, SOAP UI или другие базы 1С). Отличной практикой является сохранение структуры веб-сервиса в статичный файл.

Разберем, как это реализовать:

  1. Временно переключим параметр в default.vrd в режим reuseSessions="dontuse" или воспользуемся Вариантом 1 с подменой заголовка.
  2. Перейдем в браузер по адресу http://127.0.0.1/erpdemo2/ws/miko_crm_api.1cws?wsdl.
  3. Сохраним открывшуюся XML-страницу на диск под именем miko_crm_api.wsdl.
  4. Вернем исходные настройки reuseSessions="use" в файл публикации для обеспечения высокой производительности в продакшене.
  5. На стороне внешней системы настроим импорт метаданных веб-сервиса из локального файла miko_crm_api.wsdl, а фактический адрес отправки SOAP-запросов (endpoint) перенаправим на боевой URL веб-сервиса 1С.

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

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

← На главную