Как из 1С отправить POST-запрос к API для авторизации и отправки данных в JSON?

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

В современной разработке часто возникает необходимость интегрировать 1С с внешними сервисами через REST API. Типовая схема такого взаимодействия включает два этапа: сначала нужно авторизоваться, получив токен доступа, а затем использовать этот токен для выполнения других запросов. Рассмотрим по шагам, как реализовать этот механизм в 1С, используя готовую заготовку интеграции со сторонним приложением, разобрав частые ошибки и предоставив примеры кода.

Проанализируем две ключевые задачи, которые часто встречаются при настройке обмена данными между базами 1С и приложениями:

  1. Отправка POST-запроса с логином и паролем в теле JSON для получения Bearer-токена.
  2. Отправка POST-запроса с полученным токеном в заголовках и массивом данных в теле JSON.

Для работы с HTTP в 1С мы будем использовать встроенные объекты: HTTPСоединение, HTTPЗапрос и HTTPОтвет, которые позволяют, например, получать данные о контрагенте по УНП с сайта Kartoteka.by.

Этап 1: Авторизация и получение токена

Наша первая задача — отправить POST-запрос на адрес вида /Auth, передав в теле логин и пароль в формате JSON (похожий принцип используется и для получения токена авторизации RuStore). В ответ сервер должен вернуть токен, который мы будем использовать в дальнейшем.

Шаг 1. Установка защищенного соединения

Большинство современных API работают по протоколу HTTPS. Для установления соединения с таким сервером в 1С необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Если этого не сделать, вы можете столкнуться с ошибками или редиректами (например, код ответа 301 или 308), так как сервер будет перенаправлять вас с HTTP на безопасный HTTPS.

Создадим объект HTTPСоединение:


// Указываем адрес сервера без "https://"
Сервер = "pharmapi.apteka.ru";

// Для работы с HTTPS обязательно создаем объект защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем соединение. Порт 443 для HTTPS является стандартным.
// Остальные параметры (прокси, таймаут) оставляем по умолчанию.
СоединениеHTTP = Новый HTTPСоединение(Сервер, 443, , , , , ЗащищенноеСоединение);

Шаг 2. Формирование тела запроса в формате JSON

Сервер ожидает получить данные в виде JSON-объекта, например: {"login": "myLogin", "password": "myPassword"}. Пытаться собрать такую строку вручную с помощью конкатенации — плохая практика, так как легко допустить ошибку с кавычками или экранированием символов. Правильный способ — использовать встроенные в 1С механизмы для работы с JSON.

Создадим структуру, которая соответствует нашему JSON, и преобразуем (сериализуем) ее в строку.


// Создаем структуру для тела запроса
ТелоСтруктура = Новый Структура;
ТелоСтруктура.Вставить("login", Логин);     // Переменная "Логин" содержит логин
ТелоСтруктура.Вставить("password", Пароль); // Переменная "Пароль" содержит пароль

// Настраиваем запись в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(); // Указываем, что результат будет строкой

// Преобразуем структуру 1С в строку JSON
ЗаписатьJSON(ЗаписьJSON, ТелоСтруктура);

// Получаем готовую строку
ТелоЗапросаJSON = ЗаписьJSON.Закрыть();

Шаг 3. Создание и отправка HTTP-запроса

Теперь у нас есть всё для формирования запроса: соединение, адрес ресурса и тело. Важно также указать правильные заголовки. Ключевой заголовок для POST-запросов с телом — это Content-Type, который сообщает серверу, в каком формате мы прислали данные. Для JSON это application/json.


// Указываем адрес ресурса (эндпоинт)
АдресРесурса = "/Auth";

// Создаем объект для заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

// Создаем HTTP-запрос, передавая адрес и заголовки
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса, Заголовки);

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

// Отправляем запрос методом POST и получаем ответ
ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод("POST", ЗапросHTTP);

Шаг 4. Обработка ответа и получение токена

После отправки запроса необходимо проанализировать ответ. Сначала проверим код состояния. Код 200 (OK) означает, что запрос прошел успешно. Если код другой (например, 400, 401, 500), значит, произошла ошибка, и ее описание, скорее всего, будет в теле ответа.

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


Если ОтветHTTP.КодСостояния = 200 Тогда
    // Получаем тело ответа в виде строки
    ТелоОтветаСтрокой = ОтветHTTP.ПолучитьТелоКакСтроку();
    
    // Читаем JSON из строки
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоОтветаСтрокой);
    
    // Преобразуем JSON в структуру или соответствие 1С
    ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
    
    // Теперь можно получить токен по ключу (название ключа зависит от API)
    Токен = ДанныеОтвета["access_token"]; // Пример, ключ может быть другим
    
    Сообщить("Токен успешно получен!");
Иначе
    // Если произошла ошибка, выводим код и тело ответа для анализа
    Сообщить("Ошибка при получении токена!");
    Сообщить("Код состояния: " + ОтветHTTP.КодСостояния);
    Сообщить("Тело ответа: " + ОтветHTTP.ПолучитьТелоКакСтроку());
КонецЕсли;

Этап 2: Отправка данных с использованием Bearer-токена

Итак, токен у нас есть. Теперь решим вторую задачу: отправим на сервер POST-запрос с массивом номеров заказов. Для аутентификации этого запроса мы будем использовать полученный токен в заголовке Authorization.

Шаг 1. Формирование заголовков с токеном

Это ключевой шаг. Сервер должен понять, что мы авторизованы. Для этого используется стандартный заголовок Authorization со схемой Bearer.


ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("Accept", "application/json");
ЗаголовкиЗапроса.Вставить("Content-Type", "application/json; charset=utf-8");

// Формируем заголовок авторизации. Обратите внимание на пробел после "Bearer"
ЗаголовкиЗапроса.Вставить("Authorization", "Bearer " + Токен);

Шаг 2. Формирование тела запроса с массивом

По условию задачи, нам нужно отправить JSON вида: {"orderNums": ["Z001", "Z002"]}. Для этого в 1С мы создадим массив, поместим его в структуру, а затем сериализуем в JSON.


// Создаем массив 1С
МассивНомеров = Новый Массив;
МассивНомеров.Добавить("Z001"); // Добавляем номера заказов
МассивНомеров.Добавить("Z002");

// Создаем корневую структуру
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("orderNums", МассивНомеров);

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

Шаг 3. Отправка запроса и получение результата

Собираем все вместе. Соединение можно использовать то же, что и на первом этапе. Создаем новый запрос с нужным адресом ресурса, новыми заголовками и новым телом.

Важный момент: заголовки нужно передавать при создании объекта HTTPЗапрос. Если создать запрос без заголовков, а потом пытаться их добавить, это может не сработать для некоторых типов заголовков. В теме на форуме именно это было финальной ошибкой, которая приводила к коду ответа 400.


// Указываем новый адрес ресурса
Адрес = "/Pharm/ShippedOrders";

// Соединение используем то же, что и для авторизации
// HTTPСоединение = Новый HTTPСоединение(...)

// Создаем запрос, СРАЗУ передавая заголовки в конструктор
HTTPЗапрос = Новый HTTPЗапрос(Адрес, ЗаголовкиЗапроса);

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

// Отправляем POST-запрос
HTTPОтвет = СоединениеHTTP.ВызватьHTTPМетод("POST", HTTPЗапрос);

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

Таким образом, мы успешно решили обе задачи. Главные выводы, которые можно сделать: всегда используйте ЗащищенноеСоединениеOpenSSL для HTTPS, формируйте JSON с помощью встроенных объектов, внимательно следите за заголовками Content-Type и Authorization и передавайте их при создании объекта HTTPЗапрос.

← На главную