Интеграция 1С с внешними веб-сервисами поставщиков и интернет-магазинов — одна из наиболее распространенных задач. Часто API внешних систем требует сначала пройти аутентификацию (передать логин и пароль методом POST), получить токен авторизации (JWT / Bearer), а затем использовать этот токен для получения цен и остатков. Разберем по шагам, как перенести подобную логику на платформу 1С:Предприятие 8.3 и избежать распространенных сетевых ошибок.
При первой реализации запросов разработчики часто сталкиваются с ошибками веб-сервера. Проанализируем основные из них:
HTTPСоединение передан некорректный адрес хоста, содержащий протокол (например, https://) или лишние пробелы и кавычки. В конструкторе указывается только имя хоста или IP-адрес.POST, а в коде 1С был вызван метод HTTPСоединение.Получить() (который отправляет запрос GET).Content-Type, некорректно сформированной строке параметров, отсутствии экранирования спецсимволов или неявном добавлении сигнатуры UTF-8 BOM в тело запроса.Рассмотрим, как правильно сформировать 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));
КонецЕсли;
После успешного получения токена мы можем выполнять целевые запросы к 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_ОтветДанных.КодСостояния);
КонецЕсли;
В некоторых нестандартных 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):
Новый ИнтернетПрокси(Истина) или явно укажите адрес прокси 127.0.0.1:8888.Content-Type, длину тела Content-Length и наличие невидимых байтов BOM.