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

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

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

Разбор типичных ошибок формирования запроса

Рассмотрим, почему стандартные методы могут приводить к сбоям:

  1. Некорректные разделители: Протокол требует использования последовательности CRLF (символы Символы.ВК + Символы.ПС). Использование других переносов строк приведет к тому, что парсер сервера проигнорирует содержимое.
  2. Лишние заголовки: Платформа 1С самостоятельно вычисляет Content-Length при использовании метода УстановитьТелоИзДвоичныхДанных. Ручное добавление этого заголовка часто создает конфликт.
  3. Синтаксис имен файлов: Неправильная расстановка кавычек в Content-Disposition делает невозможным извлечение файла на стороне сервера.
  4. Маршрутизация: Наличие лишних слэшей (например, //) в пути к PHP-скрипту заставляет сервер отдавать файл как текст, а не выполнять его.

Пошаговая инструкция по корректной отправке

Чтобы успешно передать файл, выполним следующие шаги:

  1. Сформируем поток данных, используя кодировку КодировкаТекста.UTF8 для обеспечения совместимости.
  2. Правильно укажем boundary (разделитель), который должен быть уникальным.
  3. Убедимся, что после каждого блока данных в multipart-запросе стоят необходимые пустые строки.

Пример правильного кода для отправки файла

Ниже представлен пример, который учитывает исправленные ошибки и рекомендации:


Разделитель = "----" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
Тело = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, , Символы.ВК + Символы.ПС, "");

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

// Запись двоичных данных
ДанныеФайла = Новый ДвоичныеДанные(ПолноеИмяФайла);
ЗаписьДанных.Записать(ДанныеФайла);
ЗаписьДанных.ЗаписатьСтроку(""); 

// Закрытие блока
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.Закрыть();

ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();

// Настройка HTTP-соединения
ssl = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение("xxxxxxxa.ru", , , , , , ssl);
HTTPЗапрос = Новый HTTPЗапрос("/xxxxxxxxxx/sendMessage.php"); 

HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);

ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
НашОтвет = ОтветHTTP.ПолучитьТелоКакСтроку();

Важные рекомендации по отладке

Если после внесения изменений вы все еще получаете ошибку или код страницы, проанализируйте следующие аспекты:

Помните, что сервер может возвращать ошибку, если у вас нет доступа к ресурсу с текущего IP-адреса, даже если структура запроса идеальна. Всегда уточняйте у администратора API требования к заголовкам и правам доступа.

← На главную