Почему запрос к веб-сервису работает в SoapUI, но возвращает ошибку 500 или 407 в 1С?

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

При интеграции 1С со сторонними веб-сервисами разработчики нередко сталкиваются с ситуацией, когда один и тот же XML-запрос успешно обрабатывается в тестовой утилите SoapUI, но при отправке из кода 1С сервер возвращает ошибку 500 (Internal Server Error) или 407 (Proxy Authentication Required). Разберем по шагам ключевые причины такого поведения и способы их устранения.

1. Проверка адреса конечной точки (Endpoint URL) и WSDL

Наиболее распространенная причина ошибки 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.

2. Различия окружения клиента и сервера 1С (Ошибка 407)

Код состояния HTTP 407 (Proxy Authentication Required) означает, что на пути к целевому веб-серверу находится корпоративный прокси-сервер, требующий авторизации. Разница в результатах между SoapUI и 1С часто обусловлена местом выполнения кода:

  1. Клиентское приложение или SoapUI: работают в сеансе текущего пользователя Windows и могут автоматически подхватывать настройки прокси операционной системы и учетные данные домена.
  2. Сервер 1С:Предприятие: выполняется в контексте отдельной системной службы (обычно учетная запись usr1cv8), у которой нет доступа к пользовательским настройкам прокси или разрешения на прямой выход в интернет.

Для явной настройки прокси-сервера в 1С используется объект ИнтернетПрокси, который передается в конструктор соединения:


Прокси = Новый ИнтернетПрокси(Истина); // Использовать системные настройки прокси
// Либо задаем параметры вручную, если требуется авторизация:
// Прокси.Установить("HTTP", "proxy.company.local", 8080, "proxy_user", "proxy_pass");

ЗащищенноеСоединение = Неопределено; // Для HTTPS: Новый ЗащищенноеСоединениеOpenSSL()
Соединение = Новый HTTPСоединение("192.168.0.95", , "Пользователь", "Пароль", Прокси, 30, ЗащищенноеСоединение);

3. Обязательные HTTP-заголовки: SOAPAction и Content-Type

Утилита SoapUI автоматически добавляет в запрос служебные заголовки, необходимые веб-серверу для маршрутизации и разбора пакета. При формировании запроса через HTTPЗапрос эти заголовки необходимо указывать явно:

  1. SOAPAction: Для протокола SOAP 1.1 заголовок является обязательным. Если веб-сервер не находит данный заголовок, он не может сопоставить запрос с нужной операцией и возвращает HTTP 500. Если для операции действие не задано, заголовок передается с пустыми кавычками: "".
  2. Content-Type: Для SOAP 1.1 значение должно быть 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");

4. Кодировка текста и маркер последовательности байтов (BOM)

Ошибки разбора XML-документа веб-сервером могут возникать из-за нестандартной кодировки или наличия сигнатуры BOM (Byte Order Mark) в начале потока данных. Использование кодировок вроде CESU-8 часто приводит к ошибкам десериализации на стороне сторонних сервисов.

Общепринятым стандартом для веб-сервисов является UTF-8 без маркера BOM. При установке тела запроса из строки задавайте параметры явно:


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

5. Анализ текста ошибки из ответа сервера (soap:Fault)

Если сервер возвращает код состояния 500, это не означает, что ответ пустой. В теле ответа веб-сервис передает XML-структуру soap:Fault с детальным описанием причины отклонения запроса (например, неверный формат даты, отсутствие обязательного тега или ошибка валидации схемы XSD).

Проанализируем ответ сервера с помощью следующего фрагмента кода:


Ответ = Соединение.ОтправитьДляОбработки(ЗапросWeb);

Если Ответ.КодСостояния >= 200 И Ответ.КодСостояния < 300 Тогда
    Сообщить("Успешный ответ: " + Ответ.ПолучитьТелоКакСтроку());
Иначе
    // Читаем подробности ошибки из тела ответа
    ТекстОшибки = Ответ.ПолучитьТелоКакСтроку();
    Сообщить("Сервер вернул код " + Ответ.КодСостояния + ". Подробности:");
    Сообщить(ТекстОшибки);
КонецЕсли;

6. Использование штатных объектов WSПрокси вместо ручной сборки

Чтобы избежать ошибок с формированием конвертов, заголовков и кодировок при использовании HTTPЗапрос, в платформе 1С рекомендуется работать с SOAP-сервисами через типизированный объект WSПрокси:


Определение = Новый WSОпределения("http://192.168.0.95/BaseMain/ws/SaveData?wsdl", "Пользователь", "Пароль");
Сервис = Определение.Сервисы[0];
ТочкаПодключения = Сервис.ТочкиПодключения[0];

Прокси = Новый WSПрокси(Определение, Сервис.Имя, Сервис.Имя, ТочкаПодключения.Имя);
Прокси.Пользователь = "Пользователь";
Прокси.Пароль = "Пароль";

// Вызов операции веб-сервиса напрямую через метод прокси
Результат = Прокси.SaveDataOperation(Параметр1, Параметр2);

Использование WSПрокси автоматически берет на себя формирование корректного SOAP-конверта, установку пространств имен и заголовков SOAPAction в строгом соответствии со схемой WSDL.

← На главную