Как правильно отправить JSON через POST-запрос в 1С:Предприятие 8?

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

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

Разбор типичной ошибки: почему сервер не видит данные

Рассмотрим ситуацию, с которой сталкиваются многие разработчики: при отправке данных сервер возвращает ошибку о том, что обязательные поля (например, code, name, type) не заполнены, хотя в коде 1С они явно добавлены в структуру. Выясним причину этой проблемы, проанализировав некорректный фрагмент кода:


HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
...
HTTPЗапрос.УстановитьТелоИзСтроки("param=" + СтрокаJson);

Проблема №1: Неверный Content-Type. Заголовок application/x-www-form-urlencoded сообщает серверу, что данные передаются в формате стандартной HTML-формы (ключ=значение). Если вы отправляете чистый JSON, сервер ожидает заголовок application/json.

Проблема №2: Лишние префиксы в теле. Добавление строки "param=" перед самим JSON-текстом делает содержимое тела запроса невалидным с точки зрения парсера JSON на стороне сервера. Сервер пытается прочитать объект, начиная с фигурной скобки {, а встречает текст param=..., что приводит к ошибке синтаксиса или пустому результату.

Шаг 1. Формирование структуры JSON

Прежде всего, проанализируем, как правильно подготовить данные в 1С для их последующей сериализации. Рекомендуется использовать объекты Структура и Массив, которые наиболее точно соответствуют объектам и спискам в формате JSON.


// Создаем структуру для передачи данных
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("type", 0);
ДанныеДляОтправки.Вставить("name", "Тестовый клиент");
ДанныеДляОтправки.Вставить("code", "111");

// Сериализация структуры в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJson = ЗаписьJSON.Закрыть();

В этом примере мы используем объект ЗаписьJSON, который гарантирует корректное экранирование спецсимволов и соблюдение стандартов формата. Помните, что ручное формирование строки (склеивание кавычек и скобок) крайне нежелательно.

Шаг 2. Настройка HTTP-соединения и заголовков

Для успешной передачи JSON критически важно правильно настроить объект HTTPЗапрос. Разберем по шагам создание соединения и установку необходимых метаданных.


// Инициализация соединения
// Если используется HTTPS, необходимо передать объект ЗащищенноеСоединениеOpenSSL
Соединение = Новый HTTPСоединение(ХостСервера, , , , , 30); // Таймаут 30 секунд

HTTPЗапрос = Новый HTTPЗапрос("/api/client");

// Установка обязательных заголовков
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
HTTPЗапрос.Заголовки.Вставить("Accept", "application/json");
HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic " + ТокенАвторизации);

Обратите внимание на заголовок Accept. Он сообщает серверу, что 1С ожидает получить ответ также в формате JSON. Это помогает избежать проблем, когда сервер по умолчанию пытается вернуть XML или HTML при ошибке.

Шаг 3. Установка тела запроса без BOM

Одной из скрытых проблем при работе с 1С является добавление метки BOM (Byte Order Mark) в начало строки при использовании кодировки UTF-8. Многие веб-серверы (особенно написанные на PHP, Go или Python) не понимают этот символ и выдают ошибку Invalid JSON data.

Чтобы исключить эту проблему, при установке тела запроса следует явно указывать параметры кодировки:


HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJson, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Важно: Не добавляйте никаких дополнительных символов вроде "param=". В теле POST-запроса должен находиться только чистый JSON-текст, начинающийся с символа { или [.

Шаг 4. Обработка ответа сервера

После отправки запроса методом ОтправитьДляОбработки (POST), необходимо проанализировать результат. Мы рекомендуем не сохранять ответ во временные файлы, если объем данных невелик, а считывать его сразу в память.


Попытка
    Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    // Проверяем код состояния (200 - OK, 201 - Created)
    Если Ответ.КодСостояния = 200 Или Ответ.КодСостояния = 201 Тогда
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
        Сообщить("Данные успешно отправлены: " + ТекстОтвета);
    Иначе
        Сообщить("Ошибка сервера! Код состояния: " + Ответ.КодСостояния);
        Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;

Инструменты для отладки

Если код в 1С написан верно, но сервер всё равно возвращает ошибку, воспользуйтесь следующими рекомендациями для диагностики:

  1. Postman: Проверьте запрос в этой утилите. Если в Postman всё работает, сравните заголовки (Headers) и тело (Body). В 1С должно быть в точности так же.
  2. Fiddler / Charles: Эти прокси-отладчики позволяют перехватить трафик прямо из 1С и увидеть "сырой" HTTP-пакет. Это лучший способ заметить лишние символы или неверную кодировку. Для работы через прокси в 1С используйте объект HTTPПрокси в конструкторе HTTPСоединение.
  3. Логирование: Всегда записывайте СтрокаJson в журнал регистрации перед отправкой, чтобы иметь возможность проверить валидность JSON через онлайн-сервисы (валидаторы).

Подводя итог, отметим, что ключ к успешному выполнению HTTP POST запроса с JSON в 1С — это чистота тела запроса (отсутствие префиксов и BOM) и точное соответствие заголовков ожиданиям сервера. Использование встроенных средств сериализации (ЗаписатьJSON) и правильное управление кодировками позволяет избежать большинства проблем интеграции.

← На главную