При работе с внешними Web-сервисами через объект WSПрокси разработчики часто сталкиваются с ситуацией, когда запрос уходит, но сервер возвращает ошибку или пустой результат. Поскольку WSПрокси является своего рода «черным ящиком», стандартными средствами отладчика 1С невозможно увидеть итоговую XML-структуру SOAP-конверта, которую платформа отправляет в сеть. В этой статье мы подробно разберем все доступные способы перехвата этих сообщений: от использования внешних снифферов до глубокой настройки самой платформы 1С.
Если у вас есть права на установку программного обеспечения на локальном компьютере, наиболее наглядным способом будет использование специализированных утилит-снифферов. Рассмотрим наиболее популярные инструменты:
WSПрокси происходит на стороне сервера 1С. В этом случае мы рекомендуем временно запустить обработку в файловой копии базы на локальном компьютере, где установлен Fiddler.Рассмотрим малодокументированный, но крайне эффективный встроенный механизм платформы 1С. Существует специальный флаг в конфигурационном файле conf.cfg, который заставляет платформу записывать все исходящие и входящие пакеты в текстовые файлы логов. Это идеальное решение, если на сервере запрещено устанавливать стороннее ПО.
Выполним следующие шаги для настройки:
conf.cfg. Обычно он располагается в каталоге установки платформы (например, C:\Program Files\1cv8\conf) или в папке профиля пользователя.EnableInternetExchangeLog=1.Важно: Не забудьте отключить этот параметр после завершения отладки, так как файлы логов могут очень быстро занять все свободное дисковое пространство при интенсивном обмене.
Технологический журнал — это самый мощный инструмент для системного администратора и разработчика 1С. С его помощью мы можем получить данные о сетевом обмене непосредственно в момент исполнения программного кода на сервере.
Для перехвата Web-вызовов нам нужно настроить сбор событий HTTP или SCOM. Пример настройки файла logcfg.xml для сбора данных об обмене может выглядеть следующим образом:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\Logs\WebExchange" history="24">
<event>
<eq property="Name" value="HTTP"/>
</event>
<property name="All"/>
</log>
</config>
Проанализируем результаты: в логах появятся записи, содержащие тело запроса и ответа. Кстати, для автоматической обработки собранных данных вам может пригодиться знание о том, как убрать лишние переносы строк в технологическом журнале, что значительно упростит парсинг. Это позволит нам увидеть точно ту структуру XML, которую генерирует WSПрокси, и сопоставить её с требованиями WSDL-схемы.
Выясним причину, по которой многие опытные разработчики предпочитают отказываться от использования объекта WSПрокси в пользу HTTPСоединение. Если вы еще не работали с этим напрямую, рекомендуем пройти интерактивный обучающий курс для работы с HTTP-запросами для понимания основ. Когда мы работаем с прокси-объектом, мы доверяем платформе автоматическую сериализацию объектов XDTO в XML. Если в схеме WSDL есть нюансы с пространствами имен, 1С может сформировать некорректный XML.
Разберем, как реализовать «прозрачный» вызов, где мы будем видеть каждое сообщение прямо в отладчике перед отправкой:
ЗаписьXML для создания структуры сообщения.СериализаторXDTO для преобразования объектов в XML.ЗаписьXML.Посмотрим на пример кода, который позволяет получить XML-строку объекта XDTO:
// Предположим, у нас есть ОбъектXDTO, который мы хотим отправить
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДанныеXDTO, НазначениеТипаXML.Явное);
СтрокаXML = ЗаписьXML.Закрыть();
// Теперь переменная СтрокаXML доступна для анализа в отладчике
После этого мы отправляем эту строку через HTTPЗапрос. Преимущество метода очевидно: вы полностью контролируете содержимое пакета и можете логировать его в любой справочник или текстовый файл внутри 1С.
Если нам нужно увидеть сообщение, которое формирует именно WSПрокси, но мы не можем использовать внешние инструменты, мы можем заставить 1С отправить запрос самой себе. Рассмотрим этот оригинальный метод:
POST этого сервиса пишем код, который считывает тело запроса и записывает его в Журнал регистрации или в текстовый файл на сервере.WSПрокси временно меняем адрес точки подключения (URL) на адрес нашего нового HTTP-сервиса.Пример кода в HTTP-сервисе для перехвата сообщения:
Функция ПерехватСообщения(Запрос)
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
ЗаписьЖурналаРегистрации("ОтладкаWebСервиса",,,, ТелоЗапроса);
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
Таким образом, 1С выступит в роли принимающей стороны и «сфотографирует» тот XML, который сама же и сгенерировала.
Проанализируем ситуацию, когда сообщение сформировано, но сервис его не принимает. Чаще всего проблема кроется в пространствах имен (namespaces). Обратите внимание на следующие моменты:
<soap:Envelope> против <soapenv:Envelope>), хотя по стандартам XML это не должно иметь значения.<xs:sequence>). Если вы добавляете свойства в объект XDTO не в том порядке, запрос будет невалидным.Для глубокого анализа структуры мы рекомендуем использовать Инструменты разработчика. Они позволяют визуально сопоставить структуру вашего объекта и требования схемы, а также выполнить тестовую сериализацию. А если вам нужно представить эти данные пользователю в понятном виде, можно превратить скучный XML в красивый отчет с помощью XSLT.