При интеграции 1С с различными API часто возникает задача отправки файлов на сервер. Если вы пытаетесь сделать это так же, как в инструменте Postman, вы можете столкнуться с тем, что файлы приходят на сервер поврежденными или нечитаемыми. Давайте разберем, почему это происходит и как правильно организовать передачу данных.
Когда вы отправляете файл через multipart/form-data, запрос не состоит просто из бинарных данных файла. Он включает в себя специальный разделитель — boundary, который отделяет метаданные части (имя файла, Content-Type) от самих данных. Если 1С отправляет данные без правильного оформления этой структуры, сервер не может корректно выделить файл из потока байтов.
Частой ошибкой является передача данных методом УстановитьТелоИзСтроки или попытка просто отправить бинарные данные без оформления заголовков каждой части внутри тела запроса.
Поскольку формирование multipart вручную — это сложная задача, требующая строгого соблюдения стандарта RFC, рекомендуем сначала рассмотреть готовые решения от сообщества разработчиков 1С. Например, использование Connector или аналогичных библиотек с сайта Infostart позволяет избежать ошибок при формировании заголовков и boundary. Это значительно экономит время на отладку сетевых обменов.
Если вы решили реализовать механизм отправки самостоятельно, вам необходимо работать с объектом ПотокВПамяти и ЗаписьДанных. Разберем по шагам, как подготовить тело запроса:
boundary, который будет гарантированно отсутствовать в данных файла.ЗаписьДанных для формирования текстовых заголовков каждой части.Символы.CR + Символы.LF между заголовками и данными, так как протокол HTTP требует строгого соблюдения CRLF.Посмотрим на пример кода для формирования тела запроса:
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
// Записываем заголовок части
ЗаписьДанных.ЗаписатьСтроку("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, ПутьКРаспакованномуФайлу);
Для успешной интеграции рекомендуем:
Content-Type вашего запроса — они должны содержать параметр boundary, соответствующий разделителям внутри тела.Символы.CR + Символы.LF для всех разделителей строк в теле запроса.Accept-Encoding).Проанализировав ситуацию, можно сделать вывод, что успех передачи файлов через 1С напрямую зависит от строгого следования стандарту HTTP. Не пренебрегайте использованием потоковых методов работы с данными, так как это позволяет эффективно обрабатывать файлы любого объема.