Разработка мобильных приложений на платформе 1С:Предприятие часто сопровождается специфическими трудностями, которые не встречаются в «настольной» версии. Одной из наиболее неприятных ситуаций является внезапное появление ошибок при загрузке конфигурации или сбои в сетевом обмене, которые сложно локализовать обычными средствами отладки. В этой статье мы подробно разберем, почему возникают ошибки разбора XML, как правильно настроить сервер отладки и что делать, если мобильное устройство блокирует HTTP-запросы после обновления ОС.
Рассмотрим ситуацию: вы внесли незначительные правки в код, успешно опубликовали приложение, но при попытке обновления на мобильном устройстве возникает ошибка: «Ошибка разбора 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 — внутренняя ошибка сервера).
Для решения этой проблемы выполним следующие шаги:
.1cema (тип application/xml) и .1cv8m (тип application/octet-stream).IUSR (для IIS) есть права на чтение папки, в которую была произведена публикация. Если прав нет, сервер вернет HTML-страницу с ошибкой 401, которую парсер мобильного приложения не сможет прочитать.Иногда даже после исправления настроек сервера мобильное приложение продолжает выдавать старую ошибку. Выясним причину: мобильная платформа агрессивно кэширует файлы конфигурации. Даже удаление и повторная установка приложения не всегда помогают, так как на SD-карте или во внутренней памяти могут оставаться «хвосты» предыдущих загрузок.
Рассмотрим алгоритм полной очистки для ОС Android:
1cema.xml и 1Cv8.1CM. Обычно они располагаются в каталоге /sdcard/Download/<ИмяБазы> или во внутренних папках приложения.Часто разработчики сталкиваются с сообщением: «отладка возможна только по протоколу http». При этом файл 1cemarun.xml, отвечающий за параметры запуска отладки, может отсутствовать в каталоге публикации.
Разберем по шагам, как заставить отладку работать:
1cemarun.xml.http://192.168.1.2:55555. Если опустить http://, соединение может не установиться.Если после обновления операционной системы смартфона ваш код, использующий 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 Тогда
Сообщить("Данные успешно отправлены!");
Иначе
Сообщить("Сервер вернул ошибку: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Сообщить("Ошибка сети: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
// Здесь можно логировать подробности для системного администратора
КонецПопытки;
КонецПроцедуры
Используя данные методы, мы обеспечим отказоустойчивость мобильного клиента и сможем оперативно выявлять причины сетевых сбоев, не тратя время на гадание по неинформативным сообщениям системы.