Как исправить ошибку разбора XML и настроить стабильную работу мобильного приложения 1С

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

Разработка мобильных приложений на платформе 1С:Предприятие часто сопровождается специфическими трудностями, которые не встречаются в «настольной» версии. Одной из наиболее неприятных ситуаций является внезапное появление ошибок при загрузке конфигурации или сбои в сетевом обмене, которые сложно локализовать обычными средствами отладки. В этой статье мы подробно разберем, почему возникают ошибки разбора XML, как правильно настроить сервер отладки и что делать, если мобильное устройство блокирует HTTP-запросы после обновления ОС.

Анализируем фатальную ошибку разбора XML: Opening and ending tag mismatch

Рассмотрим ситуацию: вы внесли незначительные правки в код, успешно опубликовали приложение, но при попытке обновления на мобильном устройстве возникает ошибка: «Ошибка разбора XML 12,10. Фатальная ошибка. Opening and ending tag mismatch: link line 10 end head». Проблема выглядит странно, так как сам файл MobileAppInfo в конфигураторе кажется корректным.

Проанализируем причину. Текст ошибки прямо указывает на теги link и head. Однако в стандартном XML-файле описания мобильного приложения 1cema.xml таких тегов не существует. Это явный признак того, что мобильная платформа вместо ожидаемого XML-файла получила от веб-сервера (IIS или Apache) обычную HTML-страницу. Чаще всего это страница с описанием ошибки (404 — файл не найден, 401 — доступ запрещен или 500 — внутренняя ошибка сервера).

Для решения этой проблемы выполним следующие шаги:

  1. Проверка MIME-типов на веб-сервере: Убедимся, что сервер IIS знает, как отдавать файлы 1С. Для этого в настройках MIME-типов должны быть прописаны расширения .1cema (тип application/xml) и .1cv8m (тип application/octet-stream).
  2. Права доступа: Проверим, что у пользователя IUSR (для IIS) есть права на чтение папки, в которую была произведена публикация. Если прав нет, сервер вернет HTML-страницу с ошибкой 401, которую парсер мобильного приложения не сможет прочитать.
  3. Проверка через браузер: Попробуем открыть адрес публикации прямо в браузере мобильного устройства. Если вместо XML-структуры мы видим текст ошибки или страницу авторизации, значит, проблему нужно решать на стороне веб-сервера.

Решаем проблему кэширования на мобильном устройстве

Иногда даже после исправления настроек сервера мобильное приложение продолжает выдавать старую ошибку. Выясним причину: мобильная платформа агрессивно кэширует файлы конфигурации. Даже удаление и повторная установка приложения не всегда помогают, так как на SD-карте или во внутренней памяти могут оставаться «хвосты» предыдущих загрузок.

Рассмотрим алгоритм полной очистки для ОС Android:

  1. Удалим базу из списка в мобильном приложении.
  2. С помощью файлового менеджера найдем и удалим все файлы 1cema.xml и 1Cv8.1CM. Обычно они располагаются в каталоге /sdcard/Download/<ИмяБазы> или во внутренних папках приложения.
  3. Важный момент: Лучший способ гарантированно очистить кэш — зайти в настройки Android, выбрать раздел «Приложения», найти «1С:Предприятие» и нажать кнопку «Очистить данные». Это приведет платформу в первозданное состояние.

Настройка HTTP-отладки мобильного приложения

Часто разработчики сталкиваются с сообщением: «отладка возможна только по протоколу http». При этом файл 1cemarun.xml, отвечающий за параметры запуска отладки, может отсутствовать в каталоге публикации.

Разберем по шагам, как заставить отладку работать:

  1. Публикация: При выполнении публикации на веб-сервере в конфигураторе 1С обязательно должна быть установлена галочка «Для отладки». Именно она инициирует создание файла 1cemarun.xml.
  2. Протокол в адресе: Обратим внимание на формат адреса сервера отладки. Платформа чувствительна к префиксам. Нужно указывать полный путь, например: http://192.168.1.2:55555. Если опустить http://, соединение может не установиться.
  3. Брандмауэр и антивирус: Проверим, что порт сервера отладки (по умолчанию используется диапазон 1560–1591 или конкретный порт, указанный в настройках) открыт на входящие соединения на компьютере разработчика.

Проблемы с HTTP-запросами после обновления Android

Если после обновления операционной системы смартфона ваш код, использующий HTTPСоединение, перестал работать и выдает «Ошибка работы интернет», хотя в браузере всё открывается — причина кроется в политике безопасности Android (начиная с версии 9 и выше).

Современные версии Android по умолчанию блокируют Cleartext Traffic (незашифрованный HTTP-трафик). Чтобы восстановить работу, рассмотрим два варианта:

Вариант 1: Переход на HTTPS. Это рекомендуемый способ. Установите SSL-сертификат на ваш веб-сервер и измените адрес обращения в коде 1С.

Вариант 2: Настройка разрешений в манифесте (только для сборных приложений). Если вы собираете собственный APK, необходимо добавить конфигурацию сетевой безопасности network_security_config.xml, где явно разрешен cleartextTraffic для ваших доменов:


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

Если же вы используете типовую мобильную платформу от 1С (режим разработчика), попробуйте полностью удалить базу из списка и добавить её заново. Иногда это помогает сбросить внутренние флаги безопасности приложения, которые «заклинило» после системного обновления.

Практические рекомендации по написанию кода обмена

При работе с HTTPЗапрос в мобильном приложении всегда используйте блоки Попытка...Исключение, чтобы получать детальную информацию об ошибке. Рассмотрим пример правильной обработки сетевого запроса:


Процедура ОтправитьДанныеНаСервер()
    Сервер = "192.168.1.10";
    Порт = 80;
    
    Попытка
        Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 10); // Таймаут 10 секунд
        Запрос = Новый HTTPЗапрос("/hs/my_service/v1/send");
        Запрос.УстановитьТелоИзСтроки("Данные для отправки", КодировкаТекста.UTF8);
        
        Ответ = Соединение.ОтправитьДляОбработки(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            Сообщить("Данные успешно отправлены!");
        Иначе
            Сообщить("Сервер вернул ошибку: " + Ответ.КодСостояния);
        КонецЕсли;
    Исключение
        ИнформацияОбОшибке = ИнформацияОбОшибке();
        Сообщить("Ошибка сети: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
        // Здесь можно логировать подробности для системного администратора
    КонецПопытки;
КонецПроцедуры

Используя данные методы, мы обеспечим отказоустойчивость мобильного клиента и сможем оперативно выявлять причины сетевых сбоев, не тратя время на гадание по неинформативным сообщениям системы.

← На главную