Как устранить таймаут при передаче больших объемов данных через Web-сервисы в 1С

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

Разработчики мобильных и внешних приложений при интеграции с базами данных «1С:Предприятие» часто сталкиваются с неприятной проблемой: при небольшом объеме данных обмен через Web-сервисы (SOAP) проходит успешно, но стоит объему вырасти, как соединение обрывается по таймауту. При этом явное указание таймаута в коде 1С при создании WSПрокси не приносит желаемого результата.

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

Анализ исходного кода и выявление уязвимостей

Для начала проанализируем фрагмент кода, представленный автором темы:


ВСОпределение = WSСсылки.WebExchOS.ПолучитьWSОпределения();
ВСПакеты = ВСОпределение.ФабрикаXDTO.Пакеты.Получить("Data");
ДанныеXDTO = Новый ХранилищеЗначения(ЗарегистрироватьВыгрузку(ВСОпределение), Новый СжатиеДанных(9));
ВСПрокси = WSСсылки.WebExchOS.СоздатьWSПрокси("Data", "WebExchOS", "WebExchOSSoap",, 43199);
ВСПрокси.Пользователь = "Тест";
ВСПрокси.Пароль = "Тест";
Ответ = ВСПрокси.Синхронизация(ДанныеXDTO);
Результат = ПолучитьДанныеИзXDTO(Ответ.Получить(), ВСОпределение);

В данном сценарии разработчик пытается решить проблему «в лоб», устанавливая гигантский таймаут соединения в параметрах конструктора СоздатьWSПрокси (43199 секунд, что составляет почти 12 часов). Однако на практике соединение все равно закрывается примерно через 15 минут. Почему так происходит?

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

Кроме того, передача больших объемов информации через ХранилищеЗначения внутри SOAP-сообщения крайне неэффективна по двум причинам:

  1. Избыточность Base64: Двоичные данные при упаковке в XML-конверт кодируются в формат Base64. Это увеличивает исходный размер передаваемого файла примерно на 33%, создавая дополнительную нагрузку на сеть.
  2. Повышенное потребление памяти (OutOfMemory): Для обработки XML-пакета объемом в сотни мегабайт веб-серверу и мобильному клиенту требуется в 3-5 раз больше оперативной памяти, чем весит сам пакет. Это приводит к падению рабочих процессов веб-сервера или завершению мобильного приложения операционной системой.

---

Причина №1: Ограничения веб-серверов (IIS и Apache)

Когда запрос от мобильного приложения поступает на веб-сервер, тот перенаправляет его расширению 1С (модулю ISAPI или CGI). Если обработка запроса внутри 1С длится слишком долго, веб-сервер считает, что процесс завис, и принудительно обрывает соединение.

Настройки Microsoft IIS (Internet Information Services):

В веб-сервере IIS по умолчанию установлено жесткое ограничение на время выполнения CGI-приложений, которое составляет ровно 15 минут (900 секунд). Это с точностью до секунды совпадает с симптомами автора темы. Для решения этой проблемы выполним следующие шаги:

  1. Откроем Диспетчер служб IIS.
  2. Выберем наш сервер или конкретный сайт в дереве подключений.
  3. В разделе «IIS» откроем настройки функции CGI.
  4. Найдем параметр Таймаут действия (Activity Timeout) и увеличим его значение (например, до 00:30:00 для 30 минут).
  5. Также проверим параметр Таймаут подключения (Connection Timeout) в настройках самого сайта (по умолчанию равен 120 секундам).

Настройки Apache:

Если публикация выполнена на веб-сервере Apache, то за удержание соединения отвечают директивы в конфигурационном файле httpd.conf (или apache2.conf):

---

Причина №2: Параметры файла публикации default.vrd

При публикации информационной базы 1С на веб-сервере создается файл настроек default.vrd. В нем можно и нужно явно управлять таймаутами пула соединений. Рассмотрим пример структуры файла с измененными параметрами ожидания сессий: Для комплексного аудита параметров публикации и файла vrd можно использовать инструмент для чек-апа веб-публикаций на IIS.


<?xml version="1.0" encoding="UTF-8"?>
<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="/MyDatabase"
       ib="Connect=&quot;Srvr=server;Ref=db;&quot;">
    <ws>
        <point name="WebExchOS"
               alias="WebExchOS.1c"
               enable="true"
               timeout="1800" /> 
    </ws>
    <connections poolTimeout="60" sessionTimeout="1800" />
</point>

Проанализируем ключевые атрибуты, которые мы добавили или изменили:

---

Причина №3: Системные ограничения мобильных ОС

Даже если мы идеально настроим веб-сервер и увеличим все лимиты, мы неизбежно столкнемся со спецификой работы мобильных устройств на iOS и Android.

Мобильные операционные системы жестко контролируют расход энергии и сетевую активность. Если приложение выполняет один непрерывный сетевой запрос дольше 5–10 минут, операционная система с высокой долей вероятности принудительно закроет сетевое соединение или вовсе «прибьет» процесс приложения в фоновом режиме. Бороться с этим программным увеличением таймаутов в 1С невозможно — это системные политики безопасности мобильных платформ.

---

Архитектурное решение №1: Деление данных на порции (пакеты)

Как справедливо отметили участники обсуждения на форуме, единственным профессиональным и стабильным решением является порционный обмен данными.

Рассмотрим по шагам, как реализовать порционную выгрузку с использованием планов обмена:

  1. На стороне сервера при получении запроса на обмен мы определяем общий объем изменений, зарегистрированных на узле плана обмена.
  2. Разбиваем весь массив данных на пакеты фиксированного размера (например, по 500 или 1000 объектов в одном пакете).
  3. Каждому пакету присваиваем уникальный номер.
  4. Мобильное приложение запрашивает пакеты последовательно, один за другим, отправляя серверу подтверждение об успешном приеме предыдущего пакета.

Посмотрим на пример реализации метода получения данных порциями на стороне сервера 1С:


Функция ПолучитьПорциюДанных(ИмяУзла, НомерПорции, РазмерПорции) Экспорт
    
    УзелОбмена = ПланыОбмена.МобильныеУстройства.НайтиПоКоду(ИмяУзла);
    Если УзелОбмена.Пустая() Тогда
        ВызватьИсключение "Узел обмена не найден!";
    КонецЕсли;
    
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерПорции, РазмерПорции);
    
    // Сериализуем выборку в XML/JSON
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("PortionData");
    
    Пока ВыборкаИзменений.Следующий() Цикл
        ДанныеОбъекта = ВыборкаИзменений.Получить();
        ЗаписатьXML(ЗаписьXML, ДанныеОбъекта);
    КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    Возврат ЗаписьXML.Закрыть();
    
КонецФункции

Преимущества данного подхода очевидны:

---

Архитектурное решение №2: Асинхронная схема работы (Рекомендовано 1С)

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

Проанализируем схему реализации асинхронного обмена:

  1. Мобильное приложение отправляет на сервер быстрый запрос: «Сформируй для меня файл выгрузки».
  2. Сервер мгновенно создает Фоновое задание для подготовки файла обмена, генерирует уникальный идентификатор задачи (UUID) и возвращает его клиенту: «Задача принята, ID = 9d8b7c6a-...». Соединение сразу же закрывается.
  3. Мобильное приложение с периодичностью раз в 10–30 секунд отправляет легкие запросы для проверки статуса: «Готов ли файл для ID 9d8b7c6a-...?».
  4. Фоновое задание на сервере формирует файл обмена и сохраняет его во временное хранилище или в статическую папку на веб-сервере.
  5. Как только фоновое задание успешно завершается, сервер при очередном запросе статуса отвечает мобильному приложению: «Готово, забирай по этой ссылке».
  6. Клиент скачивает готовый сжатый ZIP-архив напрямую по HTTP-протоколу. Это происходит в разы быстрее, чем разбор тяжеловесного SOAP XML-пакета.

---

Архитектурное решение №3: Переход на HTTP-сервисы

Использование технологии SOAP (Web-сервисы в 1С) для обмена с мобильными клиентами постепенно уходит в прошлое. На замену им пришли гораздо более гибкие и легковесные HTTP-сервисы. Для их быстрого развертывания можно применить общий модуль с готовым набором функций для организации HTTP-сервиса.

Выясним основные причины, почему для мобильного обмена стоит выбрать именно HTTP-сервисы:

Подводя итог, отметим: попытки увеличить лимиты ожидания веб-серверов до бесконечности — это тупиковый путь интеграции, который неизбежно приведет к нестабильности системы в реальных условиях эксплуатации. Проектирование порционного обмена или переход на легкие HTTP-сервисы гарантируют стабильную и быструю работу мобильного приложения даже при неустойчивом беспроводном соединении.

← На главную