Как передать данные POST-запросом без использования JSON в 1С?

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

При интеграции 1С с внешними веб-сервисами часто возникает ситуация, когда принимающая сторона не поддерживает формат JSON или требует передачи данных в специфическом формате application/x-www-form-urlencoded. Разберем, как правильно сформировать и отправить такой запрос, избегая использования ЗаписьJSON.

Понимание формата application/x-www-form-urlencoded

Формат application/x-www-form-urlencoded — это классический способ передачи данных в веб-запросах. Он представляет собой текстовую строку, в которой пары ключ=значение отделяются друг от друга символом & (амперсанд). Если значения содержат специальные символы (пробелы, русские буквы, спецсимволы), их необходимо приводить к URL-безопасному виду.

В отличие от JSON, где структура данных может быть вложенной (объекты внутри объектов), этот формат по своей сути является «плоским». Однако, если вам необходимо передать массив данных, вы можете использовать конструкцию с квадратными скобками, которую понимают многие современные веб-серверы (PHP, Python, Node.js): ключ[]=значение1&ключ[]=значение2.

Реализация через объект WinHttp.WinHttpRequest

Рассмотрим вариант реализации с использованием компоненты WinHttp.WinHttpRequest.5.1. Это надежный и проверенный временем способ для платформы Windows, позволяющий гибко управлять заголовками запроса.

Для начала работы нам необходимо инициализировать COM-объект и задать необходимые параметры кодировки. Важно помнить, что для корректной передачи кириллицы необходимо явно указывать utf-8.


Попытка
    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Option(2, "utf-8"); // Устанавливаем кодировку UTF-8
    WinHttp.Open("POST", url, 0); // Открываем соединение
    
    // Устанавливаем необходимые заголовки
    WinHttp.SetRequestHeader("Accept-Language", "ru");
    WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
    WinHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
    
    // Формируем тело запроса
    ПараметрыПОСТ = "id=" + ГУИДКонтрагента;
    ПараметрыПОСТ = ПараметрыПОСТ + "&" + "type=" + "kontragent";
    ПараметрыПОСТ = ПараметрыПОСТ + "&" + "name=" + КодироватьСтроку(Источник.Наименование, СпособКодированияСтроки.КодировкаURL);
    
    // Отправляем данные
    WinHttp.Send(ПараметрыПОСТ);
    
    // Получаем ответ от сервера
    ТекстОтвета = WinHttp.ResponseText();
    Сообщить(ТекстОтвета);
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

Рекомендации по реализации

  1. Кодирование данных: Всегда используйте функцию КодироватьСтроку с параметром СпособКодированияСтроки.КодировкаURL для значений, которые могут содержать спецсимволы, иначе сервер может неверно интерпретировать входящую строку.
  2. Использование HTTPЗапрос: Если вы пишете на современной версии платформы 1С, предпочтительнее использовать встроенный объект HTTPЗапрос и HTTPСоединение. Это обеспечит кроссплатформенность вашего кода (работа на Linux-серверах) и исключит зависимость от COM-объектов.
  3. Отладка: Если данные не доходят до сервера, первым делом проверьте сформированную строку ПараметрыПОСТ в отладчике. Она должна выглядеть как последовательность вида key1=value1&key2=value2.

Когда использовать такой подход?

Данный метод идеально подходит для:

Таким образом, передача данных через POST-запрос без JSON сводится к правильному формированию строки с разделителями & и установке соответствующего заголовка Content-type. Это стандартный и эффективный способ взаимодействия между системами, который требует внимательности лишь при формировании самой строки параметров.

← На главную