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

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

Интеграция 1С с внешними веб-сервисами поставщиков и интернет-магазинов — одна из наиболее распространенных задач. Часто API внешних систем требует сначала пройти аутентификацию (передать логин и пароль методом POST), получить токен авторизации (JWT / Bearer), а затем использовать этот токен для получения цен и остатков. Разберем по шагам, как перенести подобную логику на платформу 1С:Предприятие 8.3 и избежать распространенных сетевых ошибок.

Анализ типовых ошибок при отправке HTTP-запросов

При первой реализации запросов разработчики часто сталкиваются с ошибками веб-сервера. Проанализируем основные из них:

  1. Ошибка «Couldn't resolve host name»: возникает, если в конструктор HTTPСоединение передан некорректный адрес хоста, содержащий протокол (например, https://) или лишние пробелы и кавычки. В конструкторе указывается только имя хоста или IP-адрес.
  2. Ошибка 405 (Method Not Allowed): означает, что адрес конечной точки (endpoint) ожидает другой HTTP-метод. Например, если для авторизации требуется метод POST, а в коде 1С был вызван метод HTTPСоединение.Получить() (который отправляет запрос GET).
  3. Ошибка 400 (Bad Request): веб-сервер не смог обработать запрос. Чаще всего причина кроется в неверном заголовке Content-Type, некорректно сформированной строке параметров, отсутствии экранирования спецсимволов или неявном добавлении сигнатуры UTF-8 BOM в тело запроса.

Шаг 1. Получение токена авторизации (метод POST)

Рассмотрим, как правильно сформировать POST-запрос в формате application/x-www-form-urlencoded для получения токена доступа. Обратите внимание на необходимость отключения BOM (маркера порядка байтов), так как веб-серверы могут отклонять запросы с BOM ошибкой 400.

Разберем готовый пример кода 1С:


// 1. Указываем адрес сервера и относительный путь к точке API
СерверAPI = "api.example.com";
ПутьКРесурсу = "/auth/token";

// 2. Настраиваем защищенное соединение SSL/TLS
Защита = Новый ЗащищенноеСоединениеOpenSSL();
HTTP_Соединение = Новый HTTPСоединение(СерверAPI, 443,,,,, Защита);

// 3. Формируем тело запроса (логин и пароль с кодированием спецсимволов)
ИмяПользователя = КодироватьСтроку("UserLogin", СпособКодированияСтроки.КодировкаURL);
Пароль = КодироватьСтроку("SecretP@ssword", СпособКодированияСтроки.КодировкаURL);
ТелоСтрока = "username=" + ИмяПользователя + "&password=" + Пароль;

// 4. Формируем заголовки и тело запроса
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

HTTP_Запрос = Новый HTTPЗапрос(ПутьКРесурсу, Заголовки);
// Отключаем ByteOrderMark (BOM), чтобы не провоцировать ошибку 400
HTTP_Запрос.УстановитьТелоИзСтроки(ТелоСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

// 5. Отправляем POST-запрос методом ОтправитьДляОбработки
HTTP_Ответ = HTTP_Соединение.ОтправитьДляОбработки(HTTP_Запрос);

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

Шаг 2. Выполнение запроса с токеном Bearer (получение данных)

После успешного получения токена мы можем выполнять целевые запросы к API (получение списка номенклатуры, остатков и цен). Для этого в заголовки добавляется поле Authorization с типом схемы Bearer.

Посмотрим на пример отправки авторизованного GET-запроса:


// Задаем строку поиска и формируем адрес запроса
ПоисковыйЗапрос = КодироватьСтроку("Артикул12345", СпособКодированияСтроки.КодировкаURL);
ПутьПоиска = "/catalog/search?phrase=" + ПоисковыйЗапрос;

Заголовки = Новый Соответствие();
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Authorization", "Bearer " + Токен);

HTTP_ЗапросДанных = Новый HTTPЗапрос(ПутьПоиска, Заголовки);
HTTP_ОтветДанных = HTTP_Соединение.Получить(HTTP_ЗапросДанных);

Если HTTP_ОтветДанных.КодСостояния = 200 Тогда
    СтрокаJSON = HTTP_ОтветДанных.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаJSON);
    МассивТоваров = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    // Обрабатываем полученную структуру данных
    Для Каждого Товар Из МассивТоваров Цикл
        Сообщить("Товар: " + Товар["name"] + ", Цена: " + Товар["price"]);
    КонецЦикла;
Иначе
    Сообщить("Не удалось получить данные. Код: " + HTTP_ОтветДанных.КодСостояния);
КонецЕсли;

Шаг 3. Как отправлять GET-запрос с телом (Payload)

В некоторых нестандартных API сервер требует передачу JSON-структуры в теле GET-запроса. Стандартный метод HTTPСоединение.Получить() в 1С не поддерживает передачу тела. В таком случае разберем использование универсального метода ВызватьHTTPМетод():


// Формируем JSON-тело для запроса
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ПараметрыПоиска = Новый Структура("phrase", "Артикул12345");
ЗаписатьJSON(Запись, ПараметрыПоиска);
СтрокаJSON = Запись.Закрыть();

HTTP_Запрос = Новый HTTPЗапрос("/catalog/search");
HTTP_Запрос.Заголовки.Вставить("Content-Type", "application/json");
HTTP_Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
HTTP_Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

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

Диагностика сетевых запросов и отладка через Fiddler

Если веб-сервер продолжает возвращать ошибки, выясним причину с помощью сниффера трафика (например, Fiddler):

  1. Настройте Fiddler на локальном компьютере для перехвата HTTP/HTTPS-трафика.
  2. Укажите использование локального прокси-сервера в 1С при создании соединения: Новый ИнтернетПрокси(Истина) или явно укажите адрес прокси 127.0.0.1:8888.
  3. Сравните исходящий пакет из 1С с эталонным пакетом (из Postman или рабочего PHP-скрипта). Особое внимание обратите на заголовок Content-Type, длину тела Content-Length и наличие невидимых байтов BOM.
← На главную