Как ускорить долгое первое подключение к web-сервисам 1С?

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

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

Разберем причины задержек: «Холодный старт» и очистка пула

Прежде чем переходить к настройкам, давайте выясним причину такого поведения системы. Когда клиентское приложение обращается к web-сервису, происходит несколько ресурсоемких операций:

  1. Запрос WSDL-схемы: Клиент запрашивает описание сервиса. Если вы используете динамическое создание WSПрокси, платформа каждый раз обращается к серверу за XML-файлом с описанием функций.
  2. Инициализация сеанса: На стороне сервера 1С создается новый сеанс. Выполняется процедура УстановкаПараметровСеанса и инициализируются глобальные модули конфигурации.
  3. Создание рабочего процесса: Если в пуле нет свободного соединения, веб-сервер инициирует создание нового подключения к рабочему процессу сервера 1С, что требует времени на авторизацию и выделение памяти.

Последующие вызовы проходят быстро, так как соединение уже «прогрето» и находится в пуле. Но как только время жизни соединения истекает, оно удаляется, и следующий пользователь снова сталкивается с ожиданием.

Настройка пула соединений в файле default.vrd

Основным инструментом управления жизненным циклом подключений является файл default.vrd, который создается при публикации базы. Проанализируем ключевые атрибуты, которые помогут нам удерживать соединения «горячими».

По умолчанию параметры пула могут быть не оптимальны для систем с редкими запросами. Нам необходимо отредактировать секцию <pool>. Рассмотрим основные параметры:

Пример настройки в файле default.vrd:


<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=Server1C;Ref=MyBase;">
    <ws>
        <pool maxAge="3600" poolSize="10" poolTimeout="5"/>
    </ws>
</point>

Кэширование WSDL на стороне клиента

Посмотрим на ситуацию со стороны клиента. Если вы используете программное создание прокси-класса через URL, 1С вынуждена скачивать описание сервиса при каждом запуске кода. Проанализируем два способа оптимизации:

1. Использование WS-ссылок в метаданных. Это самый эффективный способ для 1С 8.2 и 8.3. Мы импортируем WSDL-описание непосредственно в конфигурацию в раздел Общие -> WS-ссылки. В этом случае платформа берет описание структуры из своих метаданных, не тратя время на сетевой запрос к серверу.

2. Использование локального файла WSDL. Если вы не можете изменить конфигурацию, сохраните WSDL-файл на диск и обращайтесь к нему локально. Разберем пример кода:


// Вместо URL используем путь к файлу
ПутьКФайлуWSDL = "C:\WebServices\MyService.wsdl";
Определение = Новый WSОпределения(ПутьКФайлуWSDL, ИмяПользователя, Пароль);
Прокси = Новый WSПрокси(Определение, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения);

Настройка веб-сервера (IIS и Apache)

Зачастую задержка вызвана тем, что сам веб-сервер «засыпает». Выясним, как настроить IIS (Internet Information Services) для постоянной готовности.

В диспетчере IIS необходимо найти пул приложений (Application Pool), на котором опубликована база 1С, и изменить следующие настройки:

  1. Idle Time-out (Тайм-аут простоя): По умолчанию стоит 20 минут. Установите значение 0. Это предотвратит завершение рабочего процесса при отсутствии активности.
  2. Start Mode (Режим запуска): Установите значение AlwaysRunning. Это гарантирует, что процесс будет запущен сразу после старта сервера, не дожидаясь первого пользователя.
  3. Regular Time Interval (Интервал перезапуска): Отключите периодическую переработку (recycling), установив значение 0, или настройте её на ночное время.

Оптимизация кода инициализации сеанса

Проанализируем то, что происходит внутри 1С в момент подключения. При создании внешнего соединения (которым является web-сервис) срабатывает событие УстановкаПараметровСеанса. Если в этой процедуре прописаны тяжелые запросы, обращение к справочникам или расчеты, это напрямую влияет на скорость отклика сервиса.

Рекомендуется использовать проверку режима запуска, чтобы исключить выполнение лишнего кода для web-сервисов:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    Если ПараметрыСеанса.ТекущийПользователь.Пустая() Тогда
        // Облегченная инициализация для внешних соединений
        Если ПроверитьРежимРаботыСеанса() Тогда
             Возврат; 
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Функция ПроверитьРежимРаботыСеанса()
    // Логика определения, является ли сеанс внешним/веб-сервисом
    Возврат СеансИнформационнойБазы.ПолучитьТекущийСеанс().ИмяПриложения = "WebClient" 
            ИЛИ СеансИнформационнойБазы.ПолучитьТекущийСеанс().ИмяПриложения = "COMConnection";
КонецФункции

Проблемы авторизации и сетевого окружения

Рассмотрим еще один важный аспект — сетевые задержки и авторизация. Если используется Windows-авторизация (NTLM), первый пакет запроса всегда получает отказ 401, после чего начинается многоступенчатый обмен ключами. Это может добавлять до 1-2 секунд к каждому «холодному» вызову.

Попробуйте переключиться на Basic-авторизацию (при условии использования HTTPS для безопасности), так как она передает учетные данные сразу в первом заголовке. Также стоит проверить DNS-разрешение: если обращение идет по имени сервера, попробуйте указать IP-адрес, чтобы исключить задержки на стороне DNS-сервера.

Резюме: стратегия «разогрева»

Если вышеуказанные настройки не помогают в полной мере (особенно на старых версиях платформы 8.2), можно применить метод принудительного удержания сеанса. Создадим регламентное задание внутри 1С или простое внешнее приложение, которое раз в 5-10 минут будет выполнять простейший запрос к web-сервису (например, функцию Ping(), которая просто возвращает Истина). Это позволит удерживать рабочие процессы сервера 1С и пул соединений веб-сервера в активном состоянии, полностью исключая эффект долгого первого подключения.

← На главную