При разработке и внедрении мобильных решений на платформе 1С разработчики нередко сталкиваются с ситуацией, когда приложение на мобильном устройстве или терминале сбора данных (ТСД) внезапно закрывается с системным сообщением операционной системы: «В приложении произошла ошибка». Сбой может происходить как при выполнении ресурсоемких операций, так и при открытии простых списков, форм ввода или даже на практически пустой конфигурации. Разберем по шагам ключевые причины такого поведения мобильной платформы и выясним, как диагностировать и устранить эти ошибки.
Мобильная платформа 1С функционирует на мобильном устройстве как полноценный программный комплекс, объединяющий клиентскую часть, серверную логику и встроенную СУБД для работы с локальной базой данных. На бюджетных смартфонах и ТСД с объемом оперативной памяти 1 ГБ или менее операционная система жестко ограничивает лимит памяти (Heap Size) для одного процесса.
При резком увеличении потребления памяти служба Low Memory Killer в Android принудительно завершает процесс приложения без возможности перехватить исключение через конструкцию Попытка ... Исключение в коде 1С. Основными факторами переполнения памяти являются:
Для минимизации риска выгрузки процесса системой выполним следующие оптимизации при сборке мобильного приложения:
AndroidManifest.xml через настройки сборщика мобильных приложений включим параметр android:largeHeap="true", что позволит запросить у операционной системы максимальный лимит памяти для Java-процесса.android:screenOrientation="portrait", если специфика работы пользователей не требует альбомного режима.Проанализируем частую причину сбоев, связанную с взаимодействием с сетевыми протоколами. Попытка выполнить прямое обращение к внешнему ресурсу при отсутствии подключения к сети Интернет (например, когда отключен Wi-Fi или мобильная передача данных) на мобильной платформе может приводить к аварийному закрытию приложения.
Посмотрим на пример: вызов метода ИнтернетПочта.Подключиться() или отправка HTTP-запроса без предварительной проверки статуса подключения гарантированно вызывает ошибку. Перед выполнением любых сетевых операций необходимо проверять доступность подключения:
Если СредстваТелефонии.Поддерживается() И НЕ СредстваТелефонии.ПолучитьИнформациюОСети().Подключено Тогда
Сообщить("Отсутствует подключение к сети. Операция отменена.");
Возврат;
КонецЕсли;
Попытка
// Выполняем сетевое взаимодействие
ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль;
ПочтовыйПрофиль.АдресСервераPOP3 = "pop.example.com";
Почта = Новый ИнтернетПочта;
Почта.Подключиться(ПочтовыйПрофиль);
Исключение
Сообщить("Ошибка при подключении к почтовому серверу: " + ОписаниеОшибки());
КонецПопытки;
Практический опыт разработки на различных версиях мобильной платформы (начиная с 8.3.9 и выше) показывает, что нестабильность может быть связана с отображением определенных интерфейсных элементов и режимами открытия форм:
При использовании мобильной платформы на терминалах сбора данных (например, моделей Urovo, Motorola Symbol, CipherLab) частые падения происходят при интенсивном последовательном сканировании нескольких десятков позиций подряд.
Если после каждого сканирования запускается тяжелая процедура валидации или выполняется непрерывная запись в базу данных с частым автосохранением, файловая СУБД мобильного приложения блокирует интерфейсный поток, что приводит к зависанию и системному сбою. Разберем рекомендации по организации работы с торговым оборудованием:
Массив) и выполнять их пакетную обработку или запись в базу порциями, а не на каждое считывание.Если локализовать причину падения из кода 1С не удается, необходимо получить системный журнал операционной системы с помощью утилиты ADB (Android Debug Bridge). Выполним следующие действия:
adb logcat -v time *:E > crash_log.txt
Fatal signal, SIGSEGV или OutOfMemoryError. Это позволит точно определить, был ли сбой вызван нехваткой памяти, сбоем видеодрайвера устройства или ошибкой в библиотеках самой платформы.logcfg.xml с событиями EXCP и CRASH в рабочий каталог приложения на устройстве.На разных версиях ОС Android (от 4.2 до актуальных) и сторонних оболочках производителей поведение релизов мобильной платформы может существенно различаться. Если проект разворачивается на парке одинаковых бюджетных устройств, рекомендуется провести сравнительное тестирование смежных релизов платформы (например, линеек 8.3.10, 8.3.11 или более новых) для выбора версии с наименьшим количеством системных ошибок в условиях конкретного оборудования.