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

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

В современной практике интеграции систем часто возникает задача передачи файлов из 1С на веб-ресурс. Казалось бы, стандартные механизмы платформы HTTPСоединение и HTTPЗапрос интуитивно понятны, однако на практике разработчики часто сталкиваются с ситуацией, когда сервер возвращает код состояния 200 (ОК), но физически файл на стороне сайта не появляется. Рассмотрим подробно, как избежать типичных ошибок и реализовать надежный механизм обмена данными.

Анализируем базовый механизм отправки

Для начала разберем стандартный подход к формированию запроса. Одной из распространенных ошибок является попытка передать путь к файлу непосредственно в конструктор запроса, надеясь, что платформа сама прочитает данные. Однако более надежным и управляемым методом является явная установка тела запроса из двоичных данных. Проанализируем правильную последовательность действий в коде:


// Подготавливаем соединение
Хост = "mysite.com";
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение(Хост, 443, "Логин", "Пароль", , , SSL);

// Формируем запрос
Запрос = Новый HTTPЗапрос();
Запрос.АдресРесурса = "/cml/1c_exchange.php?mode=file&type=catalog&filename=prices.xml";

// Читаем файл в двоичные данные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);

// Устанавливаем тело запроса
Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеФайла);

// Указываем корректные заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");

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

В этом примере мы используем метод УстановитьТелоИзДвоичныхДанных. Это критически важно, так как сервер должен получить «сырое» содержимое файла в теле POST-запроса. Обратим внимание на заголовок Content-Type: для передачи файлов в формате XML или бинарных данных часто лучше использовать application/octet-stream, вместо стандартного text/plain.

Особенности работы со скриптом 1c_exchange.php (Bitrix и аналоги)

Если ваш скрипт на стороне сайта называется 1c_exchange.php, это с высокой вероятностью означает использование стандартного протокола обмена CommerceML. Выясним причину, по которой простая отправка файла (даже с кодом 200) может не работать. Данный протокол требует строгого соблюдения этапов обмена:

  1. Авторизация (checkauth): Сначала необходимо отправить GET-запрос с параметром mode=checkauth. В ответ сервер пришлет идентификатор сессии (Cookie).
  2. Инициализация (init): Второй запрос сообщает серверу о готовности к передаче и проверяет ограничения по размеру.
  3. Передача файла (file): Только на этом этапе выполняется загрузка данных.

Важный момент: Если вы пропустите первый этап и не передадите полученные Cookies в запросе на отправку файла, сервер примет запрос, но проигнорирует данные, так как сессия не будет считаться авторизованной. Проанализируем ситуацию: сервер возвращает «success», но это означает лишь успешный запуск скрипта, а не факт сохранения файла в нужную папку.

Управление сессиями и заголовками Cookie

Разберем, как правильно передать куки, полученные от сервера. После выполнения запроса авторизации нам необходимо извлечь заголовок Set-Cookie и добавить его в последующие запросы. Выглядит это примерно так:


// Допустим, мы получили значение сессии в переменную ЗначениеКуки
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", "PHPSESSID=" + ЗначениеКуки);

// Применяем заголовки к запросу на отправку файла
Запрос.Заголовки = Заголовки;

Без использования Cookie каждый ваш запрос к серверу воспринимается как абсолютно новый пользователь, что блокирует работу механизмов загрузки на стороне CMS.

Почему FTP может не быть альтернативой?

Иногда разработчики пытаются обойти сложности HTTP, используя FTPСоединение. Посмотрим на этот вопрос глубже. Хотя файл может физически загрузиться на сервер по FTP, скрипт обмена (тот самый 1c_exchange.php) всё равно не «увидит» его в своей логике обработки. При HTTP-загрузке скрипт сам размещает файл в нужной временной директории и сразу начинает его импорт. При FTP-загрузке вам придется вручную обеспечивать попадание файла в специфическую папку с нужными правами доступа, что значительно усложняет архитектуру.

Диагностика на стороне сервера

Если программный код в 1С написан верно, но результат отсутствует, проанализируем настройки веб-сервера. Существует несколько параметров в php.ini, которые могут блокировать прием файлов:

В заключение отметим, что для успешной отправки файла важно не только использовать правильные объекты платформы 1С, такие как HTTPЗапрос и ДвоичныеДанные, но и четко понимать протокол взаимодействия с принимающей стороной. Всегда проверяйте тело ответа сервера методом ПолучитьТелоКакСтроку(), так как именно там часто содержится текстовое описание ошибки, даже если HTTP-статус равен 200.

← На главную