Как передать несколько файлов через HTTP-сервис 1С?

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

При разработке интеграций на платформе 1С часто возникает задача передачи файлов от сервера к клиенту. Если стандартная задача подразумевает отправку одного файла, то реализация передачи нескольких файлов за один HTTP-запрос требует особого подхода. Давайте разберем, какие методы существуют, какие из них считаются стандартом индустрии и на что обратить внимание при реализации.

Метод 1: Использование формата multipart/form-data

Стандартным способом передачи составных данных в HTTP является формат multipart/form-data. Это позволяет объединить несколько блоков данных (в нашем случае файлов) в один HTTP-ответ. Чтобы реализовать это в 1С, необходимо вручную сформировать тело ответа, используя специальный разделитель — boundary.

Основные шаги реализации:

  1. Установить заголовок Content-Type со значением multipart/form-data; boundary=ВашУникальныйРазделитель.
  2. Сформировать тело сообщения, где каждый файл отделяется от другого строкой-разделителем.
  3. Для каждого файла внутри сообщения необходимо добавить заголовки Content-Disposition и Content-Type, указывающие имя файла и тип контента.

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

Метод 2: Упаковка файлов в ZIP-архив

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

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

Для реализации этого метода в 1С используем объект ЗаписьZipФайла:


// Пример создания архива в 1С
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ПутьКФайлу1);
МассивФайлов.Добавить(ПутьКФайлу2);

ЗаписьАрхива = Новый ЗаписьZipФайла(ИмяРезультирующегоФайла);
ЗаписьАрхива.Добавить(МассивФайлов);
ЗаписьАрхива.Записать();

После того как файл архива сформирован, вы просто отправляете его через Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные), где ДвоичныеДанные — это содержимое вашего архива.

Архитектурные рекомендации и риски

При выборе метода передачи важно учитывать надежность сетевой инфраструктуры. Давайте проанализируем основные риски:

1. Ограничения сетевого оборудования (Прокси и балансировщики)

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

2. Использование оперативной памяти сервера

Избегайте сборки больших пакетов (или архивов) целиком в оперативной памяти сервера 1С. Всегда старайтесь работать с временными файлами на диске. Это поможет предотвратить ошибки Out of Memory при одновременной работе нескольких пользователей или внешних систем.

3. Атомарность передачи

При передаче архива или multipart-пакета существует риск обрыва соединения. Если соединение прервется, клиент получит поврежденный поток. В случае поштучной передачи файлов (отдельный HTTP-запрос на каждый файл) вы можете легко реализовать механизм повторных попыток для конкретного файла, не пересылая всю пачку данных заново.

Итог

Если вы разрабатываете интеграцию между двумя системами 1С или клиентской программой, которую вы контролируете, ZIP-архивирование является наиболее предпочтительным и предсказуемым решением. К методу multipart/form-data стоит прибегать только в случае, если этого требует спецификация API стороннего сервиса. В остальных случаях старайтесь сохранять простоту архитектуры — это залог надежной работы вашего сервиса.

← На главную