При интеграции 1С со сторонними веб-сервисами разработчики нередко сталкиваются с ситуацией, когда один и тот же XML-запрос успешно обрабатывается в тестовой утилите SoapUI, но при отправке из кода 1С сервер возвращает ошибку 500 (Internal Server Error) или 407 (Proxy Authentication Required). Разберем по шагам ключевые причины такого поведения и способы их устранения.
Наиболее распространенная причина ошибки 500 при переносе запроса из SoapUI в 1С — отправка тела запроса не на тот адрес. В SoapUI адрес сервиса подтягивается автоматически из файла описания WSDL, в то время как при ручном формировании вызова через объект HTTPЗапрос разработчик может ошибиться в URI ресурса или отправить POST-запрос на адрес самого WSDL-файла вместо адреса выполнения операции (Endpoint).
Проверим доступность сервиса и корректность его описания. Для этого можно открыть адрес WSDL в браузере или использовать встроенный объект платформы WSОпределения:
// Проверка доступности WSDL и создание определений веб-сервиса
Попытка
Определение = Новый WSОпределения(
"http://192.168.0.95/BaseMain/ws/SaveData?wsdl",
"Пользователь",
"Пароль"
);
Сообщить("WSDL успешно прочитан, сервис доступен.");
Исключение
Сообщить("Ошибка получения WSDL: " + ОписаниеОшибки());
КонецПопытки;
Если WSDL открывается без ошибок, убедитесь, что в объекте HTTPЗапрос вы указываете относительный путь именно к точке обработки SOAP-вызовов, а не к схеме WSDL.
Код состояния HTTP 407 (Proxy Authentication Required) означает, что на пути к целевому веб-серверу находится корпоративный прокси-сервер, требующий авторизации. Разница в результатах между SoapUI и 1С часто обусловлена местом выполнения кода:
usr1cv8), у которой нет доступа к пользовательским настройкам прокси или разрешения на прямой выход в интернет.Для явной настройки прокси-сервера в 1С используется объект ИнтернетПрокси, который передается в конструктор соединения:
Прокси = Новый ИнтернетПрокси(Истина); // Использовать системные настройки прокси
// Либо задаем параметры вручную, если требуется авторизация:
// Прокси.Установить("HTTP", "proxy.company.local", 8080, "proxy_user", "proxy_pass");
ЗащищенноеСоединение = Неопределено; // Для HTTPS: Новый ЗащищенноеСоединениеOpenSSL()
Соединение = Новый HTTPСоединение("192.168.0.95", , "Пользователь", "Пароль", Прокси, 30, ЗащищенноеСоединение);
Утилита SoapUI автоматически добавляет в запрос служебные заголовки, необходимые веб-серверу для маршрутизации и разбора пакета. При формировании запроса через HTTPЗапрос эти заголовки необходимо указывать явно:
"".text/xml; charset=utf-8, а для SOAP 1.2 — application/soap+xml; charset=utf-8.
ЗапросWeb = Новый HTTPЗапрос("/BaseMain/ws/SaveData");
ЗапросWeb.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
ЗапросWeb.Заголовки.Вставить("SOAPAction", "http://tempuri.org/SaveDataOperation");
Ошибки разбора XML-документа веб-сервером могут возникать из-за нестандартной кодировки или наличия сигнатуры BOM (Byte Order Mark) в начале потока данных. Использование кодировок вроде CESU-8 часто приводит к ошибкам десериализации на стороне сторонних сервисов.
Общепринятым стандартом для веб-сервисов является UTF-8 без маркера BOM. При установке тела запроса из строки задавайте параметры явно:
// Установка тела запроса в UTF-8 без использования BOM
ЗапросWeb.УстановитьТелоИзСтроки(
ТекстЗапроса,
КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать
);
Если сервер возвращает код состояния 500, это не означает, что ответ пустой. В теле ответа веб-сервис передает XML-структуру soap:Fault с детальным описанием причины отклонения запроса (например, неверный формат даты, отсутствие обязательного тега или ошибка валидации схемы XSD).
Проанализируем ответ сервера с помощью следующего фрагмента кода:
Ответ = Соединение.ОтправитьДляОбработки(ЗапросWeb);
Если Ответ.КодСостояния >= 200 И Ответ.КодСостояния < 300 Тогда
Сообщить("Успешный ответ: " + Ответ.ПолучитьТелоКакСтроку());
Иначе
// Читаем подробности ошибки из тела ответа
ТекстОшибки = Ответ.ПолучитьТелоКакСтроку();
Сообщить("Сервер вернул код " + Ответ.КодСостояния + ". Подробности:");
Сообщить(ТекстОшибки);
КонецЕсли;
Чтобы избежать ошибок с формированием конвертов, заголовков и кодировок при использовании HTTPЗапрос, в платформе 1С рекомендуется работать с SOAP-сервисами через типизированный объект WSПрокси:
Определение = Новый WSОпределения("http://192.168.0.95/BaseMain/ws/SaveData?wsdl", "Пользователь", "Пароль");
Сервис = Определение.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];
Прокси = Новый WSПрокси(Определение, Сервис.Имя, Сервис.Имя, ТочкаПодключения.Имя);
Прокси.Пользователь = "Пользователь";
Прокси.Пароль = "Пароль";
// Вызов операции веб-сервиса напрямую через метод прокси
Результат = Прокси.SaveDataOperation(Параметр1, Параметр2);
Использование WSПрокси автоматически берет на себя формирование корректного SOAP-конверта, установку пространств имен и заголовков SOAPAction в строгом соответствии со схемой WSDL.