В современной разработке на платформе 1С:Предприятие 8.3 задачи по интеграции с внешними веб-сервисами, государственными информационными системами или маркетплейсами встречаются повсеместно. Основным инструментом для решения таких задач является использование протокола HTTP и формата обмена данными JSON. В данной статье мы подробно разберем, как правильно настроить соединение, сформировать запрос, передать параметры и обработать полученный ответ.
Прежде всего, нам необходимо установить связь с удаленным сервером. Для этого в платформе используется объект HTTPСоединение. Разберем параметры его конструктора. Важно понимать, что соединение устанавливается с хостом (доменом), а не с конкретным адресом страницы. Проанализируем пример создания соединения:
Протокол = "https";
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
// Если требуется авторизация, можно указать логин и пароль
Логин = "admin";
Пароль = "secret_key";
// Создаем защищенное соединение, если используется HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , 30, ЗащищенноеСоединение);
Здесь параметр ЗащищенноеСоединениеOpenSSL критически важен при работе с современными сайтами, поддерживающими шифрование. Таймаут (в примере 30 секунд) позволяет избежать "зависания" системы, если внешний ресурс не отвечает вовремя.
После установки соединения нам нужно подготовить сам запрос. Для этого используется объект HTTPЗапрос. В нем мы указываем ресурс (путь к методу API) и заголовки, которые сообщают серверу формат передаваемых данных. Рассмотрим, как сформировать POST-запрос с данными в формате JSON.
Выясним причину, почему часто возникают ошибки при отправке: многие забывают указать заголовок Content-Type. Без него сервер может не понять, как обрабатывать входящий поток данных.
// Путь к конкретному методу API
Ресурс = "/v1/orders/create";
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
// Подготовим тело запроса (JSON)
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("НомерЗаказа", "М-123");
ДанныеЗапроса.Вставить("Дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Устанавливаем тело запроса
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Разберем подробнее метод УстановитьТелоИзСтроки. Важно использовать ИспользованиеByteOrderMark.НеИспользовать, так как многие веб-сервисы некорректно воспринимают BOM-символы в начале JSON-строки, что приводит к ошибкам парсинга на стороне сервера.
Теперь выполним отправку данных. Мы будем использовать метод ОтправитьДляОбъекта или просто ВызватьHTTPМетод. Посмотрим на пример получения результата:
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
КодСостояния = Ответ.КодСостояния;
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если КодСостояния = 200 Или КодСостояния = 201 Тогда
// Успешное выполнение
Сообщить("Данные успешно отправлены!");
Иначе
Сообщить("Ошибка при отправке. Код состояния: " + КодСостояния);
Сообщить("Ответ сервера: " + СтрокаОтвета);
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение с сервером: " + ОписаниеОшибки());
КонецПопытки;
Обратите внимание на блок Попытка...Исключение. Сетевые операции нестабильны по своей природе, поэтому программный код всегда должен быть готов к отсутствию интернета или сбоям на стороне сервера.
Полученную от сервера строку необходимо преобразовать обратно в объекты 1С (Структуры и Массивы), чтобы с данными можно было удобно работать. Для этого проанализируем возможности объекта ЧтениеJSON.
// Предположим, сервер вернул JSON со списком товаров
// СтрокаОтвета = "{"products": [{"id": 1, "name": "Товар 1"}, {"id": 2, "name": "Товар 2"}]}"
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
// Преобразуем JSON в структуру 1С
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Теперь мы можем обращаться к данным как к обычным полям структуры
Если Результат.Свойство("products") Тогда
Для Каждого Товар Из Результат.products Цикл
Сообщить("Найден товар: " + Товар.name + " с ID: " + Товар.id);
КонецЦикла;
КонецЕсли;
Использование метода ПрочитатьJSON позволяет автоматически рекурсивно преобразовать всю иерархию JSON в соответствующие объекты 1С. Это значительно упрощает код по сравнению с ручным разбором строки.
Рассмотрим несколько продвинутых техник, которые помогут сделать вашу интеграцию более надежной:
ЗащищенноеСоединениеOpenSSL, указав путь к файлу сертификата или выбрав его из хранилища сертификатов Windows.УстановитьТелоИзФайла вместо загрузки всего файла в память в виде строки. Это существенно снизит нагрузку на оперативную память сервера 1С.Таким образом, мы проанализировали полный цикл работы с внешними API в 1С. Правильное использование объектов HTTPСоединение, HTTPЗапрос и механизмов JSON позволяет создавать гибкие и производительные системы обмена данными, способные интегрировать 1С с любым современным веб-сервисом.