Как передать файл на HTTP-сервер в 1С:Предприятие 8.3?

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

При интеграции 1С с внешними веб-сервисами, интернет-магазинами (например, на платформе 1C-Битрикс) или облачными хранилищами разработчики часто сталкиваются с задачей отправки файлов на сервер по протоколу HTTP/HTTPS. Начинающие специалисты нередко пытаются прочитать весь файл с диска в строковую переменную или двоичные данные, после чего сталкиваются с вопросом: как именно прикрепить файл к запросу и какой метод соединения выбрать?

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

В чем заключается проблема при отправке файла

Проанализируем типовую ситуацию. Разработчик создает объект HTTPСоединение, формирует HTTPЗапрос и хочет отправить файл, лежащий на локальном диске (например, выгрузку каталога в формате XML размером 10–30 МБ). При этом в документации к объекту HTTPЗапрос встречаются методы УстановитьТелоИзСтроки(), УстановитьТелоИзДвоичныхДанных(), УстановитьИмяФайлаТела() и УстановитьТелоИзПотока(). Возникает вопрос: какой способ предпочесть и где указать имя исходного файла на диске?

Если прочитать файл размером 30 МБ в строку через ЧтениеТекста или загрузить в память как ДвоичныеДанные, платформа выделит под этот объект значительный объем оперативной памяти в сеансе. При многопользовательской работе или обработке гигантских файлов это приводит к падению производительности и ошибкам нехватки памяти.

Оптимальное решение: метод УстановитьИмяФайлаТела

В платформе 1С предусмотрен специализированный метод УстановитьИмяФайлаТела() у объекта HTTPЗапрос. Он принимает путь к файлу на диске в виде обычной строки. Платформа самостоятельно связывает этот файл с телом исходящего запроса и передает его потоком без полной вычитки в память.

Посмотрим на практический пример правильного формирования запроса:


Сервер = "sait.by";
АдресРесурса = "/bitrix/admin/1c_exchange.php?mode=file&filename=import.xml";
ИмяФайлаОтправки = "C:\Exchange\import.xml";

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");

HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);

SSL = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, "Логин", "Пароль",,, SSL);

HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Разница между методами: ОтправитьДляОбработки или Записать?

Выясним причину, почему в примерах кода встречаются разные методы объекта HTTPСоединение:

  1. ОтправитьДляОбработки (POST): отправляет HTTP-запрос методом POST. Именно этот метод чаще всего ожидают скрипты обработки данных, такие как 1c_exchange.php, веб-сервисы сбора аналитики или формы загрузки документов.
  2. Записать (PUT): отправляет HTTP-запрос методом PUT. Этот метод применяется в архитектуре REST API, когда ресурс напрямую сохраняется по указанному URL, либо в протоколах прямого файлового обмена (например, WebDAV).

Если веб-сервер или документация API явно требуют отправки формы или передачи данных обработчику, следует вызывать именно ОтправитьДляОбработки().

Альтернативные способы передачи данных

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

  1. Передача из потока (УстановитьТелоИзПотока): если файл формируется динамически или передается через поток данных, можно использовать ФайловыйПоток с режимом чтения. Это также исключает чрезмерное потребление памяти.
  2. Передача небольших файлов из строки или двоичных данных: методы УстановитьТелоИзСтроки() и УстановитьТелоИзДвоичныхДанных() подходят только для небольших фрагментов данных (JSON-сообщения, маленькие XML-пакеты до пары мегабайт). Использовать их для файлов от 10 МБ и выше не рекомендуется.
  3. Сохранение ответа в файл: если в ответ на загрузку сервер возвращает большой массив данных, метод HTTPСоединение.ОтправитьДляОбработки() позволяет указать имя выходного файла в качестве второго параметра. В этом случае тело ответа сервера сразу запишется на диск, минуя память сеанса.

Важные нюансы при работе с протоколом обмена Битрикс (1c_exchange.php)

Разберем особенности, которые критически важны при интеграции с интернет-магазинами на базе 1C-Битрикс:

  1. Сессионная авторизация через Cookie: скрипт 1c_exchange.php не принимает файл при прямом одиночном запросе. Сначала выполняется шаг проверки авторизации (mode=checkauth). Сервер возвращает имя и значение сессионной куки (или заголовок Set-Cookie). Полученный идентификатор необходимо передавать в заголовке Cookie на всех последующих шагах, включая передачу файла (mode=file).
  2. Анализ тела ответа: статус HTTP 200 OK говорит лишь о том, что веб-сервер передал запрос интерпретатору PHP. Успешность самого действия возвращается в первой строке тела ответа: success, progress или failure. Обязательно анализируйте результат через HTTPОтвет.ПолучитьТелоКакСтроку().
  3. Кодирование спецсимволов в URL: если параметр имени файла (filename) содержит кириллицу или специальные знаки, строку необходимо преобразовать с помощью функции КодироватьСтроку(ИмяФайла, СпособКодированияСтроки.КодировкаURL).
  4. Таймаут соединения: при отправке файлов размером от 10 МБ стандартного таймаута в 30 секунд может не хватить. Увеличивайте параметр Таймаут в конструкторе HTTPСоединение до 120–300 секунд.
  5. Сжатие в ZIP: передача «сырых» XML-файлов объемом в десятки мегабайт создает лишнюю нагрузку на сеть. Рекомендуется архивировать XML штатными средствами 1С через объект ЗаписьZipФайла и передавать уже архив с расширением .zip.
← На главную