Интеграция 1С с внешними системами (сайтами, маркетплейсами, сторонними сервисами) — одна из самых распространенных задач для разработчика. Чаще всего обмен данными происходит через HTTP-протокол с использованием формата JSON. В этой статье мы подробно разберем, как реализовать отправку POST-запроса, правильно настроить заголовки и избежать популярных ошибок, таких как "400 Bad Request" или проблем с SSL-сертификатами.
Давайте проанализируем процесс создания HTTP-клиента в 1С шаг за шагом. Мы создадим универсальный механизм, который можно использовать для любых API.
Прежде чем отправлять запрос, нам необходимо подготовить данные. В 1С для работы с форматом JSON используется объект ЗаписьJSON. Он позволяет корректно преобразовать структуры, массивы и соответствия 1С в строковый формат, понятный веб-серверу.
Рассмотрим пример, где нам нужно отправить данные о заказе. Создадим структуру данных и сериализуем её:
// Создаем структуру с данными
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("number", "00001");
ДанныеЗаказа.Вставить("date", "2023-10-27");
ДанныеЗаказа.Вставить("amount", 5000);
МассивТоваров = Новый Массив;
СтрокаТовара = Новый Структура("product, quantity", "Товар 1", 2);
МассивТоваров.Добавить(СтрокаТовара);
ДанныеЗаказа.Вставить("items", МассивТоваров);
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
СтрокаJSON = ЗаписьJSON.Закрыть();
В этом блоке мы используем метод ЗаписатьJSON. Обратите внимание, что для корректной передачи даты может потребоваться настройка параметров сериализации, но для простых типов (строки, числа, булево) стандартных настроек достаточно.
Для взаимодействия с сервером используется объект HTTPСоединение. Ключевой момент, который часто вызывает ошибки, — это работа по защищенному протоколу HTTPS. Если целевой ресурс использует HTTPS (а это 99% современных API), нам необходимо создать защищенное соединение.
Разберем создание HTTPСоединение с учетом SSL:
// Параметры подключения
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Ресурс = "/v1/orders/create";
// Настройка защищенного соединения
// Использование OpenSSLCertificate или системного хранилища сертификатов
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Создание соединения
Соединение = Новый HTTPСоединение(
Сервер,
Порт,
,, // Пользователь и пароль (если нужна Basic Auth)
, // Прокси
, // Таймаут
ЗащищенноеСоединение // Обязательно для HTTPS
);
Важно: Если вы не передадите параметр ЗащищенноеСоединение при обращении к https:// ресурсу, 1С вернет ошибку установления связи. Использование Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено) говорит платформе использовать сертификаты, установленные в операционной системе, что обычно достаточно для валидных "белых" сертификатов.
Теперь создадим объект HTTPЗапрос. Самая частая ошибка новичков — отсутствие правильных заголовков. Веб-сервер должен "понимать", что мы отправляем ему именно JSON. За это отвечает заголовок Content-Type.
Посмотрим, как правильно настроить запрос:
Запрос = Новый HTTPЗапрос(Ресурс);
// Устанавливаем заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Если API требует авторизации по токену
Токен = "Ваш_Токен_Доступа";
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
// Помещаем тело запроса (наш JSON)
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Мы используем метод УстановитьТелоИзСтроки. Здесь критически важно явно указать кодировку КодировкаТекста.UTF8, так как JSON стандартизирован именно в этой кодировке. Если отправить данные в windows-1251, сервер получатель скорее всего вернет ошибку парсинга или "кракозябры".
Финальный этап — вызов метода отправки и анализ ответа сервера. Мы должны предусмотреть обработку не только успешного статуса 200, но и ошибок.
Попытка
// Выполняем POST запрос
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния = Ответ.КодСостояния;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если КодСостояния = 200 ИЛИ КодСостояния = 201 Тогда
// Успешная отправка
// Можно распарсить ответ сервера, если нужно
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
ОтветСтруктура = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Логика успешного завершения...
Иначе
// Обработка ошибок API
Сообщить("Ошибка API. Код: " + КодСостояния);
Сообщить("Тело ответа: " + ТелоОтвета);
КонецЕсли;
Исключение
// Обработка ошибок соединения (нет интернета, сервер недоступен)
Сообщить("Не удалось выполнить запрос: " + ОписаниеОшибки());
КонецПопытки;
Давайте проанализируем ситуации, когда код написан верно, но обмен не работает:
КодировкаТекста.UTF8 при установке тела запроса и чтении ответа. По умолчанию 1С может использовать системную кодировку ОС.Если вам нужно отправлять много запросов подряд, не создавайте HTTPСоединение в цикле. Инициализация соединения (особенно SSL handshake) — дорогая операция. Создайте соединение один раз и используйте его для отправки серии запросов:
// Оптимально для пакетной выгрузки
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , , ЗащищенноеСоединение);
Для Каждого Заказ Из СписокЗаказов Цикл
// Подготовка JSON для текущего заказа
// ...
// Создание нового запроса (HTTPЗапрос нужно создавать новый для каждого вызова)
Запрос = Новый HTTPЗапрос(Ресурс);
// ...
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КонецЦикла;
Используя этот подход, вы обеспечите надежный и быстрый обмен данными с любыми внешними сервисами из вашей конфигурации 1С.