Интеграция 1С с внешними веб-сервисами — одна из самых частых задач современного разработчика. Платформа дистанционного обучения iSpring предоставляет мощный REST API для управления пользователями, курсами и организационной структурой. Однако при попытке настроить обмен данными из 1С программисты часто сталкиваются с неочевидными ошибками, такими как 302 Redirect (перенаправление) или 500 Internal Server Error (внутренняя ошибка сервера). В этой статье мы подробно разберем, почему возникают эти сбои и как написать надежный и корректный код для взаимодействия с API iSpring.
Для начала проанализируем природу возникновения этих ошибок в контексте работы с платформой 1С:
api.ispringonline.ru или отсутствие обязательного префикса протокола в заголовке X-Auth-Account-Url.X-Name), в то время как сервер ожидает их внутри тела запроса в формате XML или JSON.Рассмотрим по шагам, как построить правильную архитектуру HTTP-запроса в 1С, чтобы исключить эти проблемы.
Любое взаимодействие с современными веб-сервисами должно происходить по защищенному каналу. Для этого в платформе 1С предусмотрен объект ЗащищенноеСоединениеOpenSSL. Если не указать его при создании объекта HTTPСоединение, платформа попытается установить связь по порту 80 (HTTP), что неизбежно приведет к редиректу 302.
Посмотрим на пример правильной инициализации соединения:
Хост = "api.ispringonline.ru"; // Для СНГ-сегмента также актуален адрес api-learn.ispringlearn.ru
Порт = 443; // Стандартный порт для HTTPS
// Создаем объект защищенного соединения, используя дефолтные сертификаты операционной системы
SSLСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Создаем HTTP-соединение с указанием SSL
HTTPСоединение = Новый HTTPСоединение(Хост, Порт, , , , 30, SSLСоединение);
Для авторизации в 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");
Если нам необходимо получить список существующих организаций (или отделов), мы должны использовать метод GET. Для этого в 1С применяется метод Получить объекта HTTPСоединение. Передавать тело запроса при этом не требуется.
Рассмотрим пример кода для получения списка структурных единиц:
АдресРесурса = "/organization"; // Устаревший эндпоинт, в новых версиях API используется /department
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
РезультатСтрокой = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8");
Сообщить("Данные успешно получены:");
Сообщить(РезультатСтрокой);
Иначе
Сообщить("Ошибка запроса! Код состояния: " + HTTPОтвет.КодСостояния, СтатусСообщения.Важное);
Сообщить("Текст ошибки: " + HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"), СтатусСообщения.Важное);
КонецЕсли;
Исключение
Сообщить("Не удалось установить связь с сервером. Проверьте настройки сети.", СтатусСообщения.Важное);
КонецПопытки;
Для создания новой организации или отдела требуется метод 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-запроса.", СтатусСообщения.Важное);
КонецПопытки;
Если вы интегрируетесь с новыми версиями 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 все еще завершается ошибкой, пройдитесь по следующим пунктам:
https:// в значении заголовка X-Auth-Account-Url. Без него сервер может вернуть 302.HTTPСоединение передан объект ЗащищенноеСоединениеOpenSSL.Получить для отправки данных. Для изменения или создания объектов всегда применяйте ОтправитьДляОбработки (POST-запрос).UTF-8 в методе УстановитьТелоИзСтроки.api.ispringonline.ru на обновленный api-learn.ispringlearn.ru (или соответствующий вашему региону сервер iSpring Learn).