В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними веб-сервисами через HTTP-протокол стала стандартом. Будь то обмен данными с маркетплейсами, государственными системами или корпоративными сайтами, программисту необходимо четко понимать механику работы объектов HTTPСоединение и HTTPЗапрос. В рамках данной статьи мы подробно проанализируем процесс создания запросов, разберем по шагам настройку заголовков и выясним причину наиболее частых ошибок при десериализации JSON.
Перед тем как отправить запрос, нам необходимо установить связь с сервером. Для этого в платформе используется объект HTTPСоединение. Важно понимать, что параметры инициализации этого объекта определяют, как именно 1С будет взаимодействовать с удаленным узлом (использование SSL, тайм-ауты, прокси-сервер).
Рассмотрим пример создания базового соединения:
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Таймаут = 30; // Секунды
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , Таймаут, ЗащищенноеСоединение);
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Проанализируем ситуацию, когда сервер требует авторизации. Мы можем передать логин и пароль непосредственно в конструктор HTTPСоединение, либо использовать заголовки Authorization в самом запросе. Первый вариант предпочтительнее для базовой (Basic) аутентификации.
Метод GET используется для получения данных. Главная особенность заключается в том, что параметры передаются прямо в URL (строке запроса). Разберем, как правильно сконструировать такой запрос, чтобы избежать проблем с кодировкой специальных символов.
Посмотрим на пример формирования строки запроса с параметрами:
ПараметрыЗапроса = "id=105&status=active";
АдресРесурса = "/v1/get_data?" + ПараметрыЗапроса;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Accept", "application/json");
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
// Далее следует обработка JSON
Иначе
Сообщить("Ошибка сервера. Код: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Ошибка при отправке GET: " + ОписаниеОшибки());
КонецПопытки;
Обратим внимание на метод ПолучитьТелоКакСтроку(). Он автоматически учитывает кодировку, указанную сервером в заголовках. Если же сервер не прислал кодировку, 1С по умолчанию попробует прочитать текст в UTF-8.
Метод POST чаще всего применяется для передачи больших объемов данных или создания новых объектов в базе веб-сервиса. Здесь данные передаются в теле запроса. Рассмотрим подробнее процесс подготовки JSON и его упаковки в запрос.
ЗаписьJSON.Content-Type.Проанализируем пример кода:
// 1. Подготовка данных
Данные = Новый Структура;
Данные.Вставить("Наименование", "Товар №1");
Данные.Вставить("Артикул", "SN-990");
Данные.Вставить("Цена", 1500);
// 2. Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
СтрокаJSON = ЗаписьJSON.Закрыть();
// 3. Создание запроса
Запрос = Новый HTTPЗапрос("/v1/create_item");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
// 4. Отправка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Важно помнить: при использовании метода ОтправитьДляОбработки (который соответствует POST) крайне важно указывать Content-Type. Без этого многие серверы (например, на Node.js или Python) просто "не увидят" тело вашего запроса.
После получения ответа от сервера нам необходимо превратить текстовую строку обратно в объекты 1С (Структуры, Массивы, Соответствия). Выясним причину возможных сбоев: чаще всего это некорректная структура входящего JSON или наличие спецсимволов.
Для надежного парсинга используем следующий подход:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
Попытка
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Если результат - это массив структур
Для Каждого Элемент Из Результат Цикл
Сообщить("Получен объект: " + Элемент.Наименование);
КонецЦикла;
Исключение
Сообщить("Ошибка парсинга JSON: " + ОписаниеОшибки());
КонецПопытки;
При работе через защищенное соединение мы часто сталкиваемся с тем, что 1С не может проверить сертификат сервера. Чтобы решить эту проблему, мы используем объект ЗащищенноеСоединениеOpenSSL. Если вы работаете в корпоративной сети с самоподписанными сертификатами, их необходимо добавить в хранилище сертификатов ОС или явно указать в параметрах объекта 1С.
Посмотрим на пример инициализации с игнорированием проверки (только для отладки!):
Внимание: В рабочих системах крайне рекомендуется использовать полную проверку цепочки сертификатов для обеспечения безопасности данных.
// Использование стандартных настроек ОС для проверки
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(),
Новый ВалидацияСертификатаПеречнемДоверенныхСертификатовОС()
);
Рассмотрим несколько практических советов, которые помогут сделать вашу интеграцию стабильной:
Получить и ОтправитьДляОбработки в блоки Попытка...Исключение.User-Agent. Если сервер возвращает ошибку 403 (Forbidden), попробуйте добавить заголовок Запрос.Заголовки.Вставить("User-Agent", "1C+Enterprise");.Проанализировав все вышеперечисленные шаги, мы видим, что работа с HTTP в 1С 8.3 — это стройная система объектов, которая при правильной настройке позволяет реализовать обмен любой сложности. Главное — внимательно следить за кодировками, типами передаваемого контента и корректно обрабатывать исключительные ситуации.