При разработке интеграций на платформе 1С часто возникает задача передачи файлов от сервера к клиенту. Если стандартная задача подразумевает отправку одного файла, то реализация передачи нескольких файлов за один HTTP-запрос требует особого подхода. Давайте разберем, какие методы существуют, какие из них считаются стандартом индустрии и на что обратить внимание при реализации.
Стандартным способом передачи составных данных в HTTP является формат multipart/form-data. Это позволяет объединить несколько блоков данных (в нашем случае файлов) в один HTTP-ответ. Чтобы реализовать это в 1С, необходимо вручную сформировать тело ответа, используя специальный разделитель — boundary.
Основные шаги реализации:
Content-Type со значением multipart/form-data; boundary=ВашУникальныйРазделитель.Content-Disposition и Content-Type, указывающие имя файла и тип контента.Стоит отметить, что реализация multipart вручную требует внимательной работы с двоичными данными. Платформа 1С предоставляет инструменты для последовательного доступа к данным, что позволяет формировать сложные пакеты сообщений без критической нагрузки на оперативную память.
В подавляющем большинстве корпоративных задач самым надежным и простым решением является создание ZIP-архива. Вместо манипуляций с заголовками и разделителями, мы собираем все необходимые файлы в один архивный файл и передаем его как единое целое.
Преимущества данного подхода:
Для реализации этого метода в 1С используем объект ЗаписьZipФайла:
// Пример создания архива в 1С
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ПутьКФайлу1);
МассивФайлов.Добавить(ПутьКФайлу2);
ЗаписьАрхива = Новый ЗаписьZipФайла(ИмяРезультирующегоФайла);
ЗаписьАрхива.Добавить(МассивФайлов);
ЗаписьАрхива.Записать();
После того как файл архива сформирован, вы просто отправляете его через Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные), где ДвоичныеДанные — это содержимое вашего архива.
При выборе метода передачи важно учитывать надежность сетевой инфраструктуры. Давайте проанализируем основные риски:
1. Ограничения сетевого оборудования (Прокси и балансировщики)
Если вы передаете пачку файлов одним большим запросом, промежуточные сетевые узлы (прокси-серверы, файрволы) могут принудительно разорвать соединение по таймауту или из-за ограничения размера пакета. Если файлы имеют большой объем, лучше передавать их по отдельности, реализовав логику последовательных запросов на стороне клиента.
2. Использование оперативной памяти сервера
Избегайте сборки больших пакетов (или архивов) целиком в оперативной памяти сервера 1С. Всегда старайтесь работать с временными файлами на диске. Это поможет предотвратить ошибки Out of Memory при одновременной работе нескольких пользователей или внешних систем.
3. Атомарность передачи
При передаче архива или multipart-пакета существует риск обрыва соединения. Если соединение прервется, клиент получит поврежденный поток. В случае поштучной передачи файлов (отдельный HTTP-запрос на каждый файл) вы можете легко реализовать механизм повторных попыток для конкретного файла, не пересылая всю пачку данных заново.
Если вы разрабатываете интеграцию между двумя системами 1С или клиентской программой, которую вы контролируете, ZIP-архивирование является наиболее предпочтительным и предсказуемым решением. К методу multipart/form-data стоит прибегать только в случае, если этого требует спецификация API стороннего сервиса. В остальных случаях старайтесь сохранять простоту архитектуры — это залог надежной работы вашего сервиса.