Как программно реализовать HTTP-запросы в 1С 8.3: работа с JSON, заголовками и авторизацией

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

В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними сервисами через REST API стала стандартом. В рамках данной статьи мы подробно разберем, как правильно настроить обмен данными, используя встроенные механизмы платформы. Мы проанализируем основные объекты, такие как HTTPСоединение и HTTPЗапрос, и научимся обрабатывать данные в формате JSON.

Инициализация HTTP-соединения и настройка параметров подключения

Прежде всего, нам необходимо установить связь с сервером. Для этого в 1С используется объект HTTPСоединение. На этом этапе крайне важно правильно определить адрес сервера, порт и параметры безопасности (SSL). Разберем по шагам, как создать объект соединения для работы по защищенному протоколу HTTPS.

Рассмотрим пример кода, где мы создаем соединение с сервером. Мы будем использовать конструктор, который принимает адрес сервера и настройки защищенного соединения. Обратите внимание, что адрес сервера указывается без префикса "https://".


ИмяСервера = "api.service.com";
Порт = 443; // Стандартный порт для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

Попытка
    Соединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , 30, ЗащищенноеСоединение);
Исключение
    Сообщить("Ошибка при установке соединения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

В данном фрагменте мы используем ЗащищенноеСоединениеOpenSSL, что позволяет платформе автоматически обрабатывать сертификаты безопасности. Параметр тайм-аута (в данном случае 30 секунд) предотвращает бесконечное ожидание ответа от зависшего сервера, что критично для стабильной работы системы.

Формирование HTTP-запроса и работа с заголовками

После установки соединения нам нужно подготовить сам запрос. Объект HTTPЗапрос позволяет указать относительный путь к ресурсу (endpoint) и наполнить его необходимыми заголовками. Заголовки (Headers) играют ключевую роль в авторизации и определении типа передаваемого контента.

Проанализируем ситуацию, когда внешнему сервису требуется авторизация по токену и указание формата данных application/json. Для этого мы создадим соответствие заголовков и передадим его в объект запроса.


Ресурс = "/v1/data/upload";
Запрос = Новый HTTPЗапрос(Ресурс);

// Установка заголовков
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
Запрос.Заголовки.Вставить("Accept", "application/json");

Важно помнить, что использование Bearer токенов требует их предварительного получения. Выясним причину возможных ошибок на этом этапе: часто разработчики забывают указывать Content-Type, из-за чего сервер не может корректно интерпретировать тело запроса.

Подготовка тела запроса в формате JSON

Для передачи данных в формате JSON в 1С удобнее всего использовать объекты ЗаписьJSON и СериализаторXDTO (или ручное формирование структур). Посмотрим на пример, как преобразовать структуру 1С в строку JSON и поместить её в тело запроса.


ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("Артикул", "ABC-123");
ДанныеДляОтправки.Вставить("Количество", 10);
ДанныеДляОтправки.Вставить("Цена", 1500.50);

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

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

Рассмотрим подробнее метод УстановитьТелоИзСтроки. Мы явно указываем кодировку UTF8, так как это стандарт для веб-сервисов. Использование ИспользованиеByteOrderMark.НеИспользовать помогает избежать добавления лишних символов в начало строки, которые могут вызвать ошибку парсинга на стороне сервера.

Выполнение запроса и обработка ответа сервера

Теперь мы переходим к выполнению самого метода (GET, POST, PUT или DELETE). Метод ВызватьHTTPМетод или специализированные методы типа ОтправитьДляОбъекта возвращают объект HTTPОтвет. Нам необходимо проанализировать код состояния (Status Code), чтобы понять, был ли запрос успешным.

Разберем по шагам логику обработки ответа:

  1. Выполняем запрос методом POST.
  2. Проверяем код состояния (200 или 201 означают успех).
  3. Если запрос успешен, читаем тело ответа.
  4. Если произошла ошибка (4xx или 5xx), логируем текст ошибки для отладки.

Попытка
    Ответ = Соединение.ОтправитьДляОбъекта(Запрос);
    КодСостояния = Ответ.КодСостояния;
    
    Если КодСостояния = 200 Или КодСостояния = 201 Тогда
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        // Обработка данных
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
        Результат = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
    Иначе
        Сообщить("Сервер вернул ошибку: " + КодСостояния);
        Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
КонецПопытки;

Расширенная обработка: использование временных файлов

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

Платформа 1С позволяет записывать тело запроса напрямую из файла и сохранять ответ сервера в файл. Это значительно оптимизирует работу системы при обработке тяжелых данных.


ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла("json");
// Код по записи данных в файл...
Запрос.УстановитьТелоИзФайла(ИмяФайлаЗапроса);

ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("json");
Ответ = Соединение.ЗаписатьОтветВФайл(Запрос, ИмяФайлаОтвета);

При работе с файлами не забывайте удалять временные файлы после завершения операции, используя УдалитьФайлы, чтобы не засорять дисковое пространство сервера.

Рекомендации по безопасности и стабильности

При реализации интеграций важно учитывать аспекты безопасности. Никогда не храните пароли и секретные ключи в открытом коде. Рекомендуется использовать Безопасное хранилище данных или константы с ограниченным доступом.

Также проанализируем вопрос стабильности. Внешние сервисы могут быть временно недоступны. Для минимизации рисков мы рекомендуем внедрять механизмы повторных попыток (retries) с экспоненциальной задержкой. Если запрос не удался, подождите 1 секунду, затем 3, затем 10, прежде чем окончательно фиксировать ошибку.

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

← На главную