Почему при отправке POST-запроса из 1С на сервер PHP массив $_POST оказывается пустым и как это исправить

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

При интеграции 1С с веб-сервисами (например, системами техподдержки вроде HESK) программисты часто сталкиваются с ситуацией: запрос успешно уходит, сервер возвращает код состояния 200 OK, но целевое действие не выполняется. При детальном анализе выясняется, что на стороне сервера глобальный массив PHP $_POST пуст. Проанализируем причины этой проблемы и разберем по шагам, как правильно сформировать запрос в 1С.

Выясняем причину: почему сервер не видит данные

Прежде всего, разберем механизм работы веб-сервера. Тот факт, что вы получили ответ 200, означает лишь то, что скрипт-обработчик на сервере был успешно найден и запущен. Однако PHP автоматически заполняет массив $_POST только в строго определенных случаях. Рассмотрим основные условия:

  1. Заголовок Content-Type должен иметь значение application/x-www-form-urlencoded или multipart/form-data.
  2. Тело запроса должно быть сформировано в строгом соответствии со стандартом выбранного типа контента.
  3. Метод запроса должен быть именно POST (в 1С это объект HTTPЗапрос с методом "POST").

Если вы отправляете данные в формате JSON или просто как сырой текст без указания корректного заголовка, PHP не будет парсить их в массив $_POST. В этом случае данные придется "добывать" из потока php://input, что требует правок в коде сайта. Если сайт готовый (как HESK), нам необходимо подстроиться под его ожидания.

Использование Postman для диагностики

Как показывает практика, попытка "вслепую" повторить запрос из Fiddler в 1С часто приводит к ошибкам. Рассмотрим наиболее эффективный метод отладки — использование Postman. Это инструмент, который позволяет вручную собрать запрос и убедиться, что сервер его принимает.

Алгоритм совместной работы выглядит так:

  1. Создадим новый запрос в Postman, выберем метод POST и укажем URL скрипта (например, https://hesk.fun/submit_ticket.php).
  2. Во вкладке Body выберем x-www-form-urlencoded и заполним ключи и значения (имя клиента, тема тикета, текст).
  3. Нажмем Send. Если тикет создался — значит, сервер ожидает именно этот формат.
  4. Теперь самое важное: в Postman есть кнопка Code (справа), которая покажет точный текст заголовков и структуру тела запроса. Именно это нам нужно повторить в коде 1С.

Правильное формирование заголовков в 1С

Для стандартных веб-форм наиболее часто используется тип application/x-www-form-urlencoded. Рассмотрим, как правильно настроить объект HTTPЗапрос в 1С:


Запрос = Новый HTTPЗапрос("/submit_ticket.php");
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
// Важно также указать длину контента и хост, если это требуется сервером
Запрос.Заголовки.Вставить("Host", "hesk.fun");

Если вы работаете с кириллицей, обязательно убедитесь, что в заголовке или настройках соединения указана кодировка UTF-8. PHP крайне чувствителен к несоответствию кодировок при разборе POST-данных.

Формирование тела запроса и URL-кодирование

Одной из главных ошибок при работе с x-www-form-urlencoded является неправильная склейка параметров. Данные в теле запроса должны выглядеть как строка: параметр1=значение1&параметр2=значение2.

Однако просто написать Текст = "subject=" + ТемаТикета нельзя. Любой спецсимвол (пробел, амперсанд, знак вопроса или кириллица) разрушит структуру запроса. Проанализируем, как использовать встроенные функции 1С для безопасной передачи данных:


Функция СформироватьТелоЗапроса(ПараметрыСтруктура)
    Результат = "";
    Для Каждого Стр Из ПараметрыСтруктура Цикл
        Если ЗначениеЗаполнено(Результат) Тогда
            Результат = Результат + "&";
        КонецЕсли;
        // Кодируем и ключ, и значение по правилам URL
        Ключ = КодироватьСтроку(Стр.Ключ, СпособКодированияСтроки.URL);
        Значение = КодироватьСтроку(Строка(Стр.Значение), СпособКодированияСтроки.URL);
        Результат = Результат + Ключ + "=" + Значение;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Полученную строку необходимо поместить в тело запроса. Рекомендуется делать это через УстановитьТелоИзСтроки, явно указывая кодировку и отключая использование BOM (Byte Order Mark), так как PHP может некорректно воспринять эти невидимые символы в начале потока данных.


ТелоЗапроса = СформироватьТелоЗапроса(СтруктураДанных);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Защита от CSRF и токены безопасности

Системы типа HESK защищены от подделки запросов. Если вы просто отправите данные на URL обработки тикета, сервер может их проигнорировать, так как в запросе отсутствует специальный защитный токен (token или csrf_token).

Проанализируем алгоритм обхода этой защиты:

  1. Сначала выполним GET-запрос на страницу создания тикета.
  2. С помощью регулярных выражений или поиска в строке найдем в HTML-коде страницы скрытое поле input type="hidden" name="token" value="...".
  3. Сохраним полученные Cookies сессии из объекта HTTPОтвет.
  4. При формировании POST-запроса добавим этот токен в параметры тела, а Cookies — в заголовки нового запроса.

Без соблюдения этой последовательности сервер будет считать ваш запрос атакой и обнулять массив $_POST в целях безопасности.

Особенности multipart/form-data

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

Разберем структуру такого запроса:

Важный нюанс: все переносы строк в multipart-запросе должны соответствовать стандарту HTTP, то есть быть парой Символы.ВК + Символы.ПС. Ошибка в одном символе приведет к тому, что PHP не сможет корректно распарсить тело, и $_POST снова окажется пустым.

Проблемы с перенаправлениями (Redirects)

Еще одна неочевидная причина — редиректы. Если вы отправляете запрос на http://site.ru/post.php, а сервер настроен на принудительный https, произойдет перенаправление (код 301 или 302). Платформа 1С при использовании HTTPСоединение может автоматически последовать по редиректу, но при этом метод POST часто превращается в GET, а тело запроса теряется.

Выясним, как этого избежать: всегда указывайте в коде 1С прямой и актуальный URL сервера. Если сайт работает на HTTPS, убедитесь, что при создании HTTPСоединение вы используете объект ЗащищенноеСоединениеOpenSSL.

Подводя итог, можно сказать, что решение проблемы "пустого POST" кроется в детальном сравнении вашего запроса с тем, который формирует обычный браузер. Использование инструментов типа Postman в сочетании с правильной обработкой строк через КодироватьСтроку позволяет успешно интегрировать 1С с любой веб-системой.

← На главную