Как правильно отправить SOAP-запрос из 1С в сервис iSpring Online (iSpring Learn)?

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

Интеграция 1С с внешними веб-сервисами по протоколу SOAP — это классическая задача для разработчика, которая, однако, таит в себе множество нюансов: от правильной сборки XDTO-пакета до прохождения авторизации и корректной передачи кириллицы. В данной статье мы подробно разберем, как реализовать обмен данными с платформой iSpring Online (ныне iSpring Learn), проанализируем типичные ошибки и рассмотрим два основных подхода к решению задачи.

Способ №1: Использование WS-прокси и фабрики XDTO (Рекомендуемый подход)

Работа через объект WSПрокси является наиболее «цивилизованным» методом в 1С. Этот подход позволяет платформе автоматически типизировать данные на основе WSDL-описания сервиса. Разберем этот процесс по шагам, создавая структуру запроса для метода addOrganization.

Для начала нам необходимо инициализировать соединение. Мы будем использовать WSОпределения, чтобы считать схему сервиса непосредственно по URL. Обратите внимание, что для защищенного соединения iSpring требует использования SSL.


// Подготовка параметров подключения
AccountUrl = "https://yourcompany.ispringonline.ru";
WsdlUrl = "https://yourcompany.ispringonline.ru/api/soap/v1/iSpringOnline.wsdl";
Email = "admin@example.com";
Password = "your_api_password";

// Создаем определения и прокси
Попытка
    Определения = Новый WSОпределения(WsdlUrl);
    // Имена сервиса и порта обычно можно найти в конце WSDL-файла
    Прокси = Новый WSПрокси(Определения, "http://api.ispringonline.ru/", "iSpringOnlineService", "iSpringOnlineSoap");
    
    // В некоторых случаях авторизацию нужно передать напрямую в свойства прокси
    Прокси.Пользователь = Email;
    Прокси.Пароль = Password;
Исключение
    Сообщить("Ошибка инициализации WS-ссылки: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Теперь проанализируем структуру параметров. Большинство современных SOAP-сервисов (включая iSpring) требуют передачи сложного объекта, содержащего учетные данные (Credentials) и данные самого запроса. Посмотрим, как создать такие объекты через фабрику XDTO:


// 1. Создаем объект Credentials (учетные данные)
ТипCredentials = Прокси.ФабрикаXDTO.Тип("http://api.ispringonline.ru/", "Credentials");
Credentials = Прокси.ФабрикаXDTO.Создать(ТипCredentials);
Credentials.accountUrl = AccountUrl;
Credentials.email = Email;
Credentials.password = Password;

// 2. Создаем основной объект запроса AddOrganizationRequest
ТипЗапроса = Прокси.ФабрикаXDTO.Тип("http://api.ispringonline.ru/", "AddOrganizationRequest");
ЗапросОбъект = Прокси.ФабрикаXDTO.Создать(ТипЗапроса);
ЗапросОбъект.credentials = Credentials;
ЗапросОбъект.name = "Наименование организации"; // Здесь кириллица передается без проблем
ЗапросОбъект.description = "Создано автоматически из 1С";

// 3. Вызываем метод сервиса
Попытка
    // Сервис ожидает один параметр — наш объект запроса
    Результат = Прокси.addOrganization(ЗапросОбъект);
    Сообщить("Организация успешно добавлена. ID: " + Результат.organizationId);
Исключение
    Информация = ИнформацияОбОшибке();
    Сообщить("Ошибка вызова метода: " + Информация.Описание);
КонецПопытки;

Важный нюанс: если вы получаете ошибку «Слишком много фактических параметров», это означает, что метод в WSDL описан как принимающий один комплексный тип (в нашем случае AddOrganizationRequest), а вы пытаетесь передать параметры через запятую. Всегда проверяйте структуру метода в WSDL-файле или через отладчик в свойстве Прокси.Метаданные.

Способ №2: Низкоуровневый HTTP-запрос с ручным формированием XML

Иногда использование WSПрокси невозможно (например, из-за специфических ограничений платформы или проблем с импортом сложного WSDL). В этом случае мы можем пойти по пути формирования SOAP-конверта вручную и отправки его через HTTPСоединение.

Этот метод требует более тщательной работы с кодировками. Выясним причину проблем с кириллицей: сервис iSpring ожидает данные строго в формате UTF-8 без BOM. Рассмотрим пример реализации:


Хост = "api.ispringonline.ru";
// Формируем тело XML вручную, соблюдая структуру SOAP-конверта
ТекстЗапроса = 
"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:api=""http://api.ispringonline.ru/"">
|   <soapenv:Header/>
|   <soapenv:Body>
|      <api:addOrganization>
|         <api:AddOrganizationRequest>
|            <api:credentials>
|               <api:accountUrl>" + AccountUrl + "</api:accountUrl>
|               <api:email>" + Email + "</api:email>
|               <api:password>" + Password + "</api:password>
|            </api:credentials>
|            <api:name>Эконика (Кириллица)</api:name>
|            <api:description>Описание на русском</api:description>
|         </api:AddOrganizationRequest>
|      </api:addOrganization>
|   </soapenv:Body>
|</soapenv:Envelope>";

// Настройка защищенного соединения
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Хост, 443, , , , 30, SSL);

// Подготовка запроса
Запрос = Новый HTTPЗапрос("/api/soap/v1"); // Уточните путь к API в документации
Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Запрос.Заголовки.Вставить("SOAPAction", "addOrganization"); // Важный заголовок для SOAP

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

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

Анализируем типичные ошибки и способы их решения

Рассмотрим ситуацию, с которой часто сталкиваются разработчики при интеграции с iSpring: "Authorization failed (Код ошибки: client)". Если вы уверены в правильности логина и пароля, проанализируем следующие моменты:

  1. Доступ к API на стороне сервиса. В панели администратора iSpring Learn должен быть включен флаг «Разрешить доступ через API». Без этой настройки даже верные учетные данные будут отклонены сервером.
  2. Формат Account URL. Убедитесь, что вы передаете полный адрес портала, включая протокол (например, https://mybase.ispringonline.ru).
  3. Проблемы с кириллицей. Если вы используете REST API и кириллица «ломается», обязательно используйте функцию КодироватьСтроку(Значение, СпособКодированияСтроки.URLУмеренный) для параметров в URL. Однако для SOAP (как мы выяснили выше) использование WSПрокси или правильная установка UTF8 в HTTPЗапрос решает эту проблему автоматически.
  4. Ошибки XDTO. При использовании ФабрикаXDTO.Создать() всегда указывайте URI пространства имен (Namespace). В случае iSpring это обычно http://api.ispringonline.ru/. Если URI указан неверно, объект будет создан, но сервер его не распознает.

Подведем итог: для быстрой и надежной разработки в 1С 8.3 лучше всего использовать WSПрокси с предварительным изучением WSDL-структуры через импорт в «Объекты конфигурации -> WS-ссылки». Это позволит вам обращаться к методам сервиса как к обычным функциям 1С, не заботясь о ручном формировании XML-тегов. Если же вы сталкиваетесь с неразрешимыми ошибками авторизации, проверьте настройки доступа в личном кабинете iSpring и убедитесь, что ваш IP не заблокирован системой защиты от частых запросов.

← На главную