Как закрыть соединение с HTTP-сервисом и оптимизировать работу регламентных заданий в файловой базе 1С?

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

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

Анализируем причину: почему сессия не закрывается сразу?

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

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

Решение 1: Настройка файла публикации default.vrd

Основным инструментом управления сессиями HTTP-сервисов является файл default.vrd, который создается при публикации базы на веб-сервере. Разберем параметры, которые помогут нам «выгнать» пользователя из базы быстрее:

  1. sessionMaxAge — это время жизни сессии в секундах. По умолчанию оно может быть довольно большим. Для оперативного освобождения ресурсов установим минимально разумное значение (например, 20-30 секунд).
  2. poolSize — определяет количество удерживаемых в пуле «горячих» соединений. Если установить значение 0, платформа будет вынуждена пересоздавать сессию чаще, что уменьшит количество одновременно висящих пользователей, но увеличит время отклика.
  3. poolTimeout — время, через которое неиспользуемое соединение в пуле будет окончательно разорвано веб-сервером.

Пример настройки блока в файле default.vrd может выглядеть следующим образом:


<httpServices publishExtensionsByDefault="true">
    <service name="ОбменОстатками"
             rootUrl="inventory"
             enable="true"
             sessionMaxAge="30"
             poolSize="1"
             poolTimeout="10"/>
</httpServices>

После внесения изменений в default.vrd необходимо перезапустить веб-сервер Apache или IIS, чтобы новые параметры вступили в силу.

Решение 2: Асинхронная модель обработки данных

Рассмотрим ситуацию, когда HTTP-сервис выполняет длительную операцию (например, парсинг большого JSON и запись в РегистрСведений). Пока выполняется код 1С, клиент ждет ответа, а база заблокирована. Если процесс занимает 15-20 секунд, вероятность возникновения ошибки Превышено время ожидания крайне высока.

Проанализируем совет из обсуждения: разделим процесс получения данных и их фактическую запись. Вместо того чтобы перебирать набор записей прямо в методе Пост или Гет, мы быстро сохраним тело запроса во временный файл и сразу ответим клиенту кодом 200 OK.

Посмотрим на пример кода для HTTP-сервиса:


Функция ВыгрузитьДанные(Запрос)
    
    ИмяФайлаЛога = ПолучитьИмяВременногоФайла("json");
    ДанныеЗапроса = Запрос.ПолучитьТелоКакСтроку();
    
    // Просто сохраняем данные на диск, не нагружая базу транзакциями
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.УстановитьТекст(ДанныеЗапроса);
    ТекстовыйДокумент.Записать(ИмяФайлаЛога);
    
    // Возвращаем ответ немедленно
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("Данные приняты в очередь");
    Возврат Ответ;
    
КонецФункции

После того как клиент получил ответ, сессия в 1С перейдет в пул и закроется согласно настройкам sessionMaxAge. Сами же данные можно загрузить отдельным фоновым заданием, которое раз в несколько минут проверяет папку с временными файлами.

Решение 3: Организация регламентных заданий в файловой базе

В режиме совместимости 8.1 и в файловом варианте работы регламентные задания ведут себя специфично. Они выполняются либо в контексте текущего активного сеанса пользователя, либо требуют запуска отдельной копии 1С. Чтобы избежать зависания интерфейса кассира, рассмотрим возможность переноса выполнения заданий на плечи веб-сервера.

В том же файле default.vrd можно включить поддержку выполнения заданий самим расширением веб-сервера. Для этого в корневом теге <point> нужно добавить атрибут allowExecuteScheduledJobs="true". Это позволит планировщику 1С запускать фоновые процессы через процессы Apache, что значительно стабильнее, чем использование клиентского сеанса.

Решение 4: Использование внешнего планировщика Windows

Если режим совместимости 8.1 не позволяет стабильно использовать встроенные РегламентныеЗадания, применим проверенный временем метод внешнего запуска. Создадим скрипт, который будет запускать 1С в режиме предприятия под специальным пользователем, выполнять обработку и закрываться.

Алгоритм действий следующий:

  1. Создаем внешнюю обработку Обмен.epf, где в модуле формы в процедуре ПриОткрытии прописываем логику обмена и обязательную команду ЗавершитьРаботуСистемы(Ложь).
  2. Настраиваем Планировщик заданий Windows на запуск раз в 5 минут.
  3. В строке запуска используем параметры командной строки 1С:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"C:\Base1C" /N"Автообмен" /P"Пароль" /Execute "C:\Scripts\Обмен.epf"

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

Решение 5: Настройка таймаутов на стороне Apache

Выясним причину ошибки Превышено время ожидания. Она часто возникает, когда настройки веб-сервера Apache конфликтуют с длительностью выполнения кода в 1С. Если ваша обработка данных все же занимает значительное время, проверьте файл httpd.conf.

Параметр Timeout в Apache по умолчанию может быть установлен в 60 или даже 30 секунд. Если 1С долго формирует ответ (особенно в файловом режиме при блокировках), Apache обрывает соединение. Увеличьте это значение, если асинхронная модель (Решение 2) по каким-то причинам вам не подходит.

Также обратите внимание на параметр KeepAlive. Его отключение (KeepAlive Off) может помочь в тех случаях, когда соединения «залипают» на сетевом уровне, не давая веб-серверу корректно закрыть поток.

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

Для корректного закрытия соединений и стабильной работы обмена в 1С:Розница 1 (режим совместимости 8.1) необходимо действовать комплексно: настроить параметры пула в vrd-файле, максимально сократить время транзакции внутри HTTP-метода и, при необходимости, вынести тяжелые операции во внешний планировщик. Такой подход обеспечит отзывчивость интерфейса кассира и исключит простои из-за блокировок базы.

← На главную