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

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

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

Понимание проблемы формата multipart/form-data

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

Частой ошибкой является передача данных методом УстановитьТелоИзСтроки или попытка просто отправить бинарные данные без оформления заголовков каждой части внутри тела запроса.

Вариант 1: Использование готовых инструментов и библиотек

Поскольку формирование multipart вручную — это сложная задача, требующая строгого соблюдения стандарта RFC, рекомендуем сначала рассмотреть готовые решения от сообщества разработчиков 1С. Например, использование Connector или аналогичных библиотек с сайта Infostart позволяет избежать ошибок при формировании заголовков и boundary. Это значительно экономит время на отладку сетевых обменов.

Вариант 2: Самостоятельная сборка потока данных

Если вы решили реализовать механизм отправки самостоятельно, вам необходимо работать с объектом ПотокВПамяти и ЗаписьДанных. Разберем по шагам, как подготовить тело запроса:

  1. Создайте уникальный boundary, который будет гарантированно отсутствовать в данных файла.
  2. Используйте ЗаписьДанных для формирования текстовых заголовков каждой части.
  3. Обязательно используйте символы переноса строк Символы.CR + Символы.LF между заголовками и данными, так как протокол HTTP требует строгого соблюдения CRLF.
  4. Запишите бинарные данные файла в поток.

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


Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
// Записываем заголовок части
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайла + """");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/octet-stream");
ЗаписьДанных.ЗаписатьСтроку(""); // Пустая строка отделяет заголовки от тела
ЗаписьДанных.Записать(ДвоичныеДанныеФайла); 
ЗаписьДанных.Закрыть();

ФайлДляОтправки = Поток.ЗакрытьИПолучитьДвоичныеДанные();
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ФайлДляОтправки);

Почему возникают ошибки с типами файлов?

Если ваши PDF-файлы читаются, а картинки или Excel-документы — нет, причина почти наверняка кроется в нарушении структуры multipart. Некоторые серверы способны «прощать» отсутствие boundary или неправильные переносы строк для простых текстовых или PDF-файлов, но становятся крайне критичными при обработке сложных двоичных форматов.

Также важно проверить, не сжимает ли сервер ответ или запрос с помощью gzip. Если 1С получает сжатый ответ, она не всегда может корректно интерпретировать его «из коробки». В таких случаях можно либо отключить сжатие в заголовках запроса, либо использовать внешние COM-объекты для распаковки данных:


// Пример обработки gzip ответа через COM-объект
архиватор = Новый COMОбъект("XStandard.GZip");
архиватор.Decompress(ПутьКФайлуZip, ПутьКРаспакованномуФайлу);

Заключение и рекомендации

Для успешной интеграции рекомендуем:

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

← На главную