Как правильно отправить HTTP-запрос из 1С к API iSpring и избежать ошибок 302 и 500

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

Интеграция 1С с внешними веб-сервисами — одна из самых частых задач современного разработчика. Платформа дистанционного обучения iSpring предоставляет мощный REST API для управления пользователями, курсами и организационной структурой. Однако при попытке настроить обмен данными из 1С программисты часто сталкиваются с неочевидными ошибками, такими как 302 Redirect (перенаправление) или 500 Internal Server Error (внутренняя ошибка сервера). В этой статье мы подробно разберем, почему возникают эти сбои и как написать надежный и корректный код для взаимодействия с API iSpring.

Выясняем причины ошибок: почему сервер возвращает 302 и 500?

Для начала проанализируем природу возникновения этих ошибок в контексте работы с платформой 1С:

  1. Код состояния 302 (Временное перенаправление). Этот ответ означает, что запрашиваемый ресурс временно находится по другому адресу. В интеграциях с iSpring это чаще всего происходит по двум причинам:
    • Использование протокола HTTP вместо безопасного протокола HTTPS. Сервер iSpring принудительно перенаправляет незащищенный трафик на защищенное соединение.
    • Неверный хост или адрес ресурса. Например, обращение к устаревшему домену api.ispringonline.ru или отсутствие обязательного префикса протокола в заголовке X-Auth-Account-Url.
  2. Код состояния 500 (Внутренняя ошибка сервера). Этот код указывает на то, что сервер столкнулся с непредвиденным условием, которое не позволило ему выполнить запрос. В случае с API iSpring ошибка 500 возникает, когда:
    • Параметры создания объекта передаются в заголовках запроса (например, название организации в заголовке X-Name), в то время как сервер ожидает их внутри тела запроса в формате XML или JSON.
    • Происходит дублирование параметров или в теле запроса передаются некорректные данные, ломающие парсер на стороне сервера.

Рассмотрим по шагам, как построить правильную архитектуру HTTP-запроса в 1С, чтобы исключить эти проблемы.

Шаг 1. Инициализация безопасного SSL-соединения

Любое взаимодействие с современными веб-сервисами должно происходить по защищенному каналу. Для этого в платформе 1С предусмотрен объект ЗащищенноеСоединениеOpenSSL. Если не указать его при создании объекта HTTPСоединение, платформа попытается установить связь по порту 80 (HTTP), что неизбежно приведет к редиректу 302.

Посмотрим на пример правильной инициализации соединения:


Хост = "api.ispringonline.ru"; // Для СНГ-сегмента также актуален адрес api-learn.ispringlearn.ru
Порт = 443; // Стандартный порт для HTTPS

// Создаем объект защищенного соединения, используя дефолтные сертификаты операционной системы
SSLСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

// Создаем HTTP-соединение с указанием SSL
HTTPСоединение = Новый HTTPСоединение(Хост, Порт, , , , 30, SSLСоединение);

Шаг 2. Формирование правильных заголовков авторизации

Для авторизации в API iSpring используются специализированные заголовки. Обратите внимание на важную деталь: в заголовке X-Auth-Account-Url обязательно должен быть указан полный URL-адрес вашего аккаунта, включая протокол https://.

Выполним заполнение соответствия заголовков:


Заголовки = Новый Соответствие;
// Указываем полный URL вашего аккаунта iSpring Learn
Заголовки.Вставить("X-Auth-Account-Url", "https://econika-dev.ispringonline.ru"); 
// Email администратора системы
Заголовки.Вставить("X-Auth-Email", "admin@yourcompany.ru"); 
// Пароль администратора
Заголовки.Вставить("X-Auth-Password", "YourSecretPassword123");

Шаг 3. Отправка GET-запроса для получения данных

Если нам необходимо получить список существующих организаций (или отделов), мы должны использовать метод GET. Для этого в 1С применяется метод Получить объекта HTTPСоединение. Передавать тело запроса при этом не требуется.

Рассмотрим пример кода для получения списка структурных единиц:


АдресРесурса = "/organization"; // Устаревший эндпоинт, в новых версиях API используется /department

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

Попытка
    HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
        РезультатСтрокой = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8");
        Сообщить("Данные успешно получены:");
        Сообщить(РезультатСтрокой);
    Иначе
        Сообщить("Ошибка запроса! Код состояния: " + HTTPОтвет.КодСостояния, СтатусСообщения.Важное);
        Сообщить("Текст ошибки: " + HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"), СтатусСообщения.Важное);
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить связь с сервером. Проверьте настройки сети.", СтатусСообщения.Важное);
КонецПопытки;

Шаг 4. Отправка POST-запроса для добавления новой записи

Для создания новой организации или отдела требуется метод POST. В 1С для отправки POST-запросов используется метод ОтправитьДляОбработки. Название и описание создаваемой структуры должны передаваться строго в соответствии со спецификацией API iSpring.

Важное замечание: В устаревших версиях API допускалась передача параметров создания (таких как название организации) в заголовке X-Name. Однако современный стандарт требует передачи этих данных в теле запроса (в формате JSON или XML).

Рассмотрим классический пример создания организации с передачей параметров через заголовки (для legacy-методов API):


// Добавляем дополнительные заголовки для создания записи
Заголовки.Вставить("X-Name", "Новый отдел продаж");
Заголовки.Вставить("X-Description", "Описание отдела продаж компании");

HTTPЗапрос = Новый HTTPЗапрос("/organization", Заголовки);

Попытка
    // Используем ОтправитьДляОбработки для выполнения POST-запроса
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    Если HTTPОтвет.КодСостояния = 201 Тогда
        Сообщить("Организация успешно создана!");
        Сообщить("Ответ сервера: " + HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"));
    Иначе
        Сообщить("Ошибка создания! Код состояния: " + HTTPОтвет.КодСостояния, СтатусСообщения.Важное);
        Сообщить("Детали: " + HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"), СтатусСообщения.Важное);
    КонецЕсли;
Исключение
    Сообщить("Критическая ошибка при отправке POST-запроса.", СтатусСообщения.Важное);
КонецПопытки;

Современный подход: Передача параметров в теле JSON

Если вы интегрируетесь с новыми версиями iSpring Learn (API v3), настоятельно рекомендуется уходить от передачи метаданных в заголовках запроса. Намного надежнее передавать структуру в формате JSON внутри тела запроса. Это гарантирует отсутствие проблем с кодировкой кириллических символов (например, при передаче названия «Эконика»).

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


// Устанавливаем заголовок Content-Type
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

HTTPЗапрос = Новый HTTPЗапрос("/api/v3/department", Заголовки);

// Формируем структуру данных будущего отдела
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("name", "Департамент Логистики");
СтруктураДанных.Вставить("parentDepartmentId", ""); // ID родительского отдела при наличии

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

// Устанавливаем тело запроса в кодировке UTF-8 без использования BOM
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаТелаЗапроса, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);

Попытка
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    Если HTTPОтвет.КодСостояния = 200 Или HTTPОтвет.КодСостояния = 201 Тогда
        Сообщить("Департамент успешно добавлен через JSON API!");
    Иначе
        Сообщить("Ошибка API! Код: " + HTTPОтвет.КодСостояния + ", Текст: " + HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"));
    КонецЕсли;
Исключение
    Сообщить("Не удалось выполнить JSON POST-запрос.");
КонецПопытки;

Чек-лист для быстрой проверки вашей интеграции

Если ваш запрос из 1С к iSpring все еще завершается ошибкой, пройдитесь по следующим пунктам:

← На главную