Работа с мобильными устройствами и терминалами сбора данных (ТСД) в экосистеме 1С имеет свои уникальные особенности. Часто разработчики сталкиваются с ситуацией, когда код, идеально работающий на стационарном компьютере, вызывает «мертвое» зависание приложения на мобильной платформе. В этой статье мы подробно проанализируем причины такого поведения, разберем конкретные ошибки в коде и рассмотрим методы оптимизации взаимодействия между ТСД и сервером.
Одной из самых распространенных, но порой трудноуловимых причин зависания является бесконечный цикл. На мобильных устройствах это проявляется особенно критично: приложение перестает реагировать на любые действия, а через некоторое время операционная система может принудительно закрыть его по таймауту или выдать ошибку соединения.
Проанализируем фрагмент кода, который стал причиной проблемы в рассматриваемом случае. В процедуре ЗаполнитьТаблицуНаСервере использовался обход таблицы значений, однако была допущена классическая ошибка программирования.
Рассмотрим проблемный участок кода:
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(Штрихкод, Количество)
...
СчетчикИндекса = 0;
...
Пока СчетчикИндекса < КоличествоИзПроизводсвтенногоЗадания.Количество() Цикл
Если Не Число(КоличествоИзПроизводсвтенногоЗадания[СчетчикИндекса].Количество) <= 0 Тогда
// Логика обработки строк
...
Если ОстатокВведенногоКоличества = 0 Или ОстатокНПЗ > 0 Тогда
Прервать;
КонецЕсли;
КонецЕсли;
// ВНИМАНИЕ: Здесь отсутствует увеличение переменной СчетчикИндекса!
КонецЦикла;
КонецПроцедуры
В данном примере условие цикла СчетчикИндекса < КоличествоИзПроизводсвтенногоЗадания.Количество() всегда остается истинным (если в таблице есть хотя бы одна строка), так как переменная СчетчикИндекса не инкрементируется. Если условие для оператора Прервать не выполняется при первой же итерации, система уходит в бесконечный цикл, потребляя ресурсы процессора и блокируя поток выполнения.
Даже если ваш код логически верен, мобильное приложение может «подвисать» на десятки секунд при вызове серверных процедур. Основная причина здесь кроется в механизме передачи данных между ТСД и сервером 1С. Разберем ситуацию подробнее.
Когда мы объявляем процедуру с директивой &НаСервере, при ее вызове мобильная платформа выполняет следующие действия:
Если в форме документа на ТСД открыта табличная часть с сотнями строк, объем передаваемых данных может достигать нескольких мегабайт. На нестабильном Wi-Fi в складских помещениях это гарантированно приводит к задержкам.
Как решить эту проблему? Используйте директиву &НаСервереБезКонтекста. В этом случае на сервер передаются только те параметры, которые вы явно указали в скобках. Контекст формы не передается, что ускоряет вызов в десятки раз.
Пример оптимизированного вызова:
// Вместо этого:
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(Штрихкод, Количество)
// Работа с реквизитом Объект.Номенклатура
КонецПроцедуры
// Используем это:
&НаСервереБезКонтекста
Функция ОбработатьДанныеНаСервере(Штрихкод, Количество)
// Выполняем расчеты, запросы и возвращаем только нужный результат
Возврат РезультатОбработки;
КонецФункции
При длительных зависаниях на ТСД часто возникает системная ошибка Software caused connection abort (10053). Выясним причины ее появления:
Заметим, что при включенной отладке конфигуратор может вести себя крайне нестабильно, «прыгая» по точкам останова с задержкой в 30-60 секунд. Это происходит потому, что отладочный трафик конкурирует с данными приложения за узкий канал связи. В условиях плохой связи пакеты подтверждения отладки (DBGS) могут теряться, заставляя конфигуратор ожидать ответа от мобильного устройства, что выглядит как зависание всей среды разработки.
Для предотвращения и решения подобных проблем придерживайтесь следующего алгоритма:
ЗаписьЖурналаРегистрации. Это позволит точно определить, дошла ли команда до сервера и на каком шаге произошел сбой.Прервать) в циклах Пока ... Цикл.&НаСервереБезКонтекста. Если нужно изменить данные в документе, передавайте только необходимые значения и обновляйте объект одной транзакцией.Помните, что разработка для ТСД требует более строгого отношения к качеству кода и объему передаваемого трафика, чем разработка для обычного тонкого клиента.