Как исправить ошибку парсинга XML и настроить отладку веб-сервиса 1С при работе с мобильным приложением?

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

При разработке мобильных приложений на Android, взаимодействующих с 1С через SOAP-сервисы, разработчики часто сталкиваются с двумя проблемами: приложение выдает ошибку org.xmlpull.v1.xmlpullparserexception: expected: start_tag, а конфигуратор 1С «не ловит» точки остановки в коде веб-сервиса. Разберем пошагово, как проанализировать эти ошибки, настроить среду и добиться стабильной работы обмена данными.

Анализ ошибки org.xmlpull.v1.xmlpullparserexception

Ошибка expected: start_tag при использовании библиотеки ksoap2 в Android-приложении чаще всего означает, что парсер ожидал увидеть начало XML-пакета (например, тег конверта SOAP), но вместо этого получил что-то другое. Проанализируем основные причины этой ситуации:

  1. Возврат HTML вместо XML. Это самая частая причина. Если на стороне веб-сервера (IIS или Apache) произошла ошибка авторизации (401), страница не найдена (404) или возникла внутренняя ошибка сервера (500), сервер отправляет стандартную HTML-страницу с описанием ошибки. Парсер встречает тег DOCTYPE html и прерывает работу.
  2. Проблемы авторизации. Если в 1С настроена Basic-авторизация, а веб-сервер настроен на Windows-авторизацию, запрос из Android может быть отклонен. Необходимо убедиться, что в настройках публикации разрешена проверка подлинности, которую поддерживает мобильный клиент.
  3. Byte Order Mark (BOM). Иногда 1С возвращает XML-ответ с префиксом BOM. Некоторые версии библиотек парсинга не умеют игнорировать эти символы в начале потока, что приводит к ошибке структуры.
  4. Пустые ответы. Если метод веб-сервиса в 1С имеет тип возвращаемого значения «Пусто», но библиотека ожидает структурированный SOAP-ответ, возникнет исключение.

Чтобы выяснить реальное содержимое ответа, проанализируем ситуацию с помощью сторонних инструментов. Рекомендуется использовать HTTP-прокси (например, Fiddler или Charles). Установив прокси между мобильным устройством и сервером 1С, мы сможем увидеть «сырой» (Raw) ответ сервера и понять, возвращается ли там SOAP-конверт или HTML-текст ошибки.

Настройка отладки веб-сервиса в 1С

Обычная отладка по протоколу TCP часто не видит сеансы веб-сервисов, так как они создаются динамически и существуют очень короткое время. Разберем, как грамотно настроить систему для отладки кода внутри 1С.

Шаг 1: Переход на отладку по протоколу HTTP.

Для надежной отладки веб-сервисов необходимо перевести сервер 1С и Конфигуратор на использование HTTP-протокола отладки. В настройках параметров (Сервис — Параметры — Отладка) выберем «Использовать протокол HTTP» и укажем адрес локального сервера отладки.

Шаг 2: Настройка файла публикации default.vrd.

Проверим файл публикации веб-сервиса. Для включения возможности отладки в файле default.vrd должны присутствовать соответствующие параметры. Рассмотрим пример структуры:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/MyService"
       ib="ConnectString">
    <ws debug="true" debuggerURL="http://localhost/debugserver"/>
</point>

Здесь параметр debug="true" разрешает отладку, а debuggerURL указывает адрес, по которому сервер должен обращаться к отладчику.

Шаг 3: Автоподключение предметов отладки.

В конфигураторе откроем окно «Параметры отладки» и убедимся, что включено автоматическое подключение для типов «Сеансы веб-сервисов». Поскольку сеанс живет доли секунды, ручное подключение практически невозможно.

Использование Журнала регистрации для диагностики

Если точки остановки все равно не срабатывают, нам нужно убедиться, что запрос вообще доходит до метода 1С. Для этого используем метод ЗаписатьЖурналРегистрации. Разберем пример реализации внутри метода веб-сервиса:


Функция ВыполнитьОбмен(ДанныеПакета)
    
    ЗаписатьЖурналРегистрации("Web-сервис.Обмен", 
        УровеньЖурналаРегистрации.Информация, , , 
        "Запрос принят. Содержимое: " + ДанныеПакета);
        
    Попытка
        // Основная логика обработки
        Возврат "Успех";
    Исключение
        ТекстОшибки = ОписаниеОшибки();
        ЗаписатьЖурналРегистрации("Web-сервис.Ошибка", 
            УровеньЖурналаРегистрации.Ошибка, , , 
            ТекстОшибки);
        Возврат ТекстОшибки;
    КонецПопытки;
    
КонецФункции

Если после вызова из Android в Журнале регистрации не появляется запись, значит проблема на уровне веб-сервера (IIS/Apache) или настроек публикации, и запрос просто не передается в 1С.

Рекомендации по типам данных и альтернативам

Проанализируем структуру передаваемых данных. Протокол SOAP требователен к типам XDTO. Любое расхождение в пространстве имен (Namespace) или структуре пакета приведет к ошибке десериализации.

Советы по повышению стабильности:

Таким образом, решив проблему с форматом ответа сервера и настроив HTTP-отладку с записью в Журнал регистрации, мы получим полный контроль над взаимодействием мобильного приложения и базы 1С.

← На главную