При работе с HTTP-сервисами в среде 1С:Предприятие, особенно на устаревших конфигурациях с режимом совместимости 8.1, разработчики часто сталкиваются с проблемой «зависания» сессий. Пользователь с типом соединения Соединение с HTTP-сервисом продолжает отображаться в списке активных пользователей даже после того, как запрос был полностью обработан и ответ отправлен клиенту. Это создает нагрузку на систему и может блокировать работу в файловом режиме. В этой статье мы подробно разберем, как управлять жизненным циклом таких соединений и как правильно организовать фоновые процессы, чтобы база не «вешалась».
Прежде всего, проанализируем механизм работы платформы 1С с веб-серверами (Apache или IIS). Платформа использует так называемый пул соединений. Это означает, что после выполнения запроса сессия не уничтожается мгновенно, а переходит в состояние ожидания. Это сделано для оптимизации производительности: если через секунду придет новый запрос от того же сервиса, системе не придется тратить ресурсы на повторную авторизацию и создание серверного контекста.
Однако в условиях файловой базы и работы на слабых терминалах «висящие» сессии могут стать проблемой. Выясним, как принудительно ограничить время их жизни.
Основным инструментом управления сессиями HTTP-сервисов является файл default.vrd, который создается при публикации базы на веб-сервере. Разберем параметры, которые помогут нам «выгнать» пользователя из базы быстрее:
Пример настройки блока в файле default.vrd может выглядеть следующим образом:
<httpServices publishExtensionsByDefault="true">
<service name="ОбменОстатками"
rootUrl="inventory"
enable="true"
sessionMaxAge="30"
poolSize="1"
poolTimeout="10"/>
</httpServices>
После внесения изменений в default.vrd необходимо перезапустить веб-сервер Apache или IIS, чтобы новые параметры вступили в силу.
Рассмотрим ситуацию, когда HTTP-сервис выполняет длительную операцию (например, парсинг большого JSON и запись в РегистрСведений). Пока выполняется код 1С, клиент ждет ответа, а база заблокирована. Если процесс занимает 15-20 секунд, вероятность возникновения ошибки Превышено время ожидания крайне высока.
Проанализируем совет из обсуждения: разделим процесс получения данных и их фактическую запись. Вместо того чтобы перебирать набор записей прямо в методе Пост или Гет, мы быстро сохраним тело запроса во временный файл и сразу ответим клиенту кодом 200 OK.
Посмотрим на пример кода для HTTP-сервиса:
Функция ВыгрузитьДанные(Запрос)
ИмяФайлаЛога = ПолучитьИмяВременногоФайла("json");
ДанныеЗапроса = Запрос.ПолучитьТелоКакСтроку();
// Просто сохраняем данные на диск, не нагружая базу транзакциями
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ДанныеЗапроса);
ТекстовыйДокумент.Записать(ИмяФайлаЛога);
// Возвращаем ответ немедленно
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("Данные приняты в очередь");
Возврат Ответ;
КонецФункции
После того как клиент получил ответ, сессия в 1С перейдет в пул и закроется согласно настройкам sessionMaxAge. Сами же данные можно загрузить отдельным фоновым заданием, которое раз в несколько минут проверяет папку с временными файлами.
В режиме совместимости 8.1 и в файловом варианте работы регламентные задания ведут себя специфично. Они выполняются либо в контексте текущего активного сеанса пользователя, либо требуют запуска отдельной копии 1С. Чтобы избежать зависания интерфейса кассира, рассмотрим возможность переноса выполнения заданий на плечи веб-сервера.
В том же файле default.vrd можно включить поддержку выполнения заданий самим расширением веб-сервера. Для этого в корневом теге <point> нужно добавить атрибут allowExecuteScheduledJobs="true". Это позволит планировщику 1С запускать фоновые процессы через процессы Apache, что значительно стабильнее, чем использование клиентского сеанса.
Если режим совместимости 8.1 не позволяет стабильно использовать встроенные РегламентныеЗадания, применим проверенный временем метод внешнего запуска. Создадим скрипт, который будет запускать 1С в режиме предприятия под специальным пользователем, выполнять обработку и закрываться.
Алгоритм действий следующий:
Обмен.epf, где в модуле формы в процедуре ПриОткрытии прописываем логику обмена и обязательную команду ЗавершитьРаботуСистемы(Ложь).
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"C:\Base1C" /N"Автообмен" /P"Пароль" /Execute "C:\Scripts\Обмен.epf"
Этот способ гарантирует, что сеанс будет полностью завершен, лицензия освобождена, а память очищена. Это самый надежный вариант для старых конфигураций Розница 1 в файловом режиме.
Выясним причину ошибки Превышено время ожидания. Она часто возникает, когда настройки веб-сервера Apache конфликтуют с длительностью выполнения кода в 1С. Если ваша обработка данных все же занимает значительное время, проверьте файл httpd.conf.
Параметр Timeout в Apache по умолчанию может быть установлен в 60 или даже 30 секунд. Если 1С долго формирует ответ (особенно в файловом режиме при блокировках), Apache обрывает соединение. Увеличьте это значение, если асинхронная модель (Решение 2) по каким-то причинам вам не подходит.
Также обратите внимание на параметр KeepAlive. Его отключение (KeepAlive Off) может помочь в тех случаях, когда соединения «залипают» на сетевом уровне, не давая веб-серверу корректно закрыть поток.
Для корректного закрытия соединений и стабильной работы обмена в 1С:Розница 1 (режим совместимости 8.1) необходимо действовать комплексно: настроить параметры пула в vrd-файле, максимально сократить время транзакции внутри HTTP-метода и, при необходимости, вынести тяжелые операции во внешний планировщик. Такой подход обеспечит отзывчивость интерфейса кассира и исключит простои из-за блокировок базы.