Почему 1С на ТСД зависает при вызове серверных процедур и как это исправить?

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

Работа с мобильными устройствами и терминалами сбора данных (ТСД) в экосистеме 1С имеет свои уникальные особенности. Часто разработчики сталкиваются с ситуацией, когда код, идеально работающий на стационарном компьютере, вызывает «мертвое» зависание приложения на мобильной платформе. В этой статье мы подробно проанализируем причины такого поведения, разберем конкретные ошибки в коде и рассмотрим методы оптимизации взаимодействия между ТСД и сервером.

Поиск логических ошибок: бесконечные циклы

Одной из самых распространенных, но порой трудноуловимых причин зависания является бесконечный цикл. На мобильных устройствах это проявляется особенно критично: приложение перестает реагировать на любые действия, а через некоторое время операционная система может принудительно закрыть его по таймауту или выдать ошибку соединения.

Проанализируем фрагмент кода, который стал причиной проблемы в рассматриваемом случае. В процедуре ЗаполнитьТаблицуНаСервере использовался обход таблицы значений, однако была допущена классическая ошибка программирования.

Рассмотрим проблемный участок кода:


&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(Штрихкод, Количество)
    ...
    СчетчикИндекса = 0;
    ...
    Пока СчетчикИндекса < КоличествоИзПроизводсвтенногоЗадания.Количество() Цикл
        
        Если Не Число(КоличествоИзПроизводсвтенногоЗадания[СчетчикИндекса].Количество) <= 0 Тогда 
            // Логика обработки строк
            ...
            Если ОстатокВведенногоКоличества = 0 Или ОстатокНПЗ > 0 Тогда
                Прервать;
            КонецЕсли;
        КонецЕсли;
        
        // ВНИМАНИЕ: Здесь отсутствует увеличение переменной СчетчикИндекса!
    КонецЦикла;
КонецПроцедуры

В данном примере условие цикла СчетчикИндекса < КоличествоИзПроизводсвтенногоЗадания.Количество() всегда остается истинным (если в таблице есть хотя бы одна строка), так как переменная СчетчикИндекса не инкрементируется. Если условие для оператора Прервать не выполняется при первой же итерации, система уходит в бесконечный цикл, потребляя ресурсы процессора и блокируя поток выполнения.

Оптимизация передачи данных: Контекст против БезКонтекста

Даже если ваш код логически верен, мобильное приложение может «подвисать» на десятки секунд при вызове серверных процедур. Основная причина здесь кроется в механизме передачи данных между ТСД и сервером 1С. Разберем ситуацию подробнее.

Когда мы объявляем процедуру с директивой &НаСервере, при ее вызове мобильная платформа выполняет следующие действия:

  1. Сериализация данных: Все данные текущей формы (реквизиты, тяжелые таблицы значений, элементы оформления) упаковываются в XML или JSON пакет.
  2. Передача по сети: Пакет отправляется по HTTP-каналу на веб-сервер.
  3. Десериализация: Сервер разворачивает пакет, создает контекст формы, выполняет код и упаковывает измененный контекст обратно.
  4. Возврат данных: ТСД получает пакет и обновляет форму.

Если в форме документа на ТСД открыта табличная часть с сотнями строк, объем передаваемых данных может достигать нескольких мегабайт. На нестабильном Wi-Fi в складских помещениях это гарантированно приводит к задержкам.

Как решить эту проблему? Используйте директиву &НаСервереБезКонтекста. В этом случае на сервер передаются только те параметры, которые вы явно указали в скобках. Контекст формы не передается, что ускоряет вызов в десятки раз.

Пример оптимизированного вызова:


// Вместо этого:
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(Штрихкод, Количество)
    // Работа с реквизитом Объект.Номенклатура
КонецПроцедуры

// Используем это:
&НаСервереБезКонтекста
Функция ОбработатьДанныеНаСервере(Штрихкод, Количество)
    // Выполняем расчеты, запросы и возвращаем только нужный результат
    Возврат РезультатОбработки;
КонецФункции

Анализ ошибки «Software caused connection abort»

При длительных зависаниях на ТСД часто возникает системная ошибка Software caused connection abort (10053). Выясним причины ее появления:

Специфика отладки мобильных приложений

Заметим, что при включенной отладке конфигуратор может вести себя крайне нестабильно, «прыгая» по точкам останова с задержкой в 30-60 секунд. Это происходит потому, что отладочный трафик конкурирует с данными приложения за узкий канал связи. В условиях плохой связи пакеты подтверждения отладки (DBGS) могут теряться, заставляя конфигуратор ожидать ответа от мобильного устройства, что выглядит как зависание всей среды разработки.

Рекомендации по диагностике и исправлению

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

  1. Используйте Журнал регистрации для логгирования: Если отладчик зависает, вставляйте в код вызовы ЗаписьЖурналаРегистрации. Это позволит точно определить, дошла ли команда до сервера и на каком шаге произошел сбой.
  2. Проверяйте циклы: Всегда контролируйте наличие инкремента счетчика или условия выхода (Прервать) в циклах Пока ... Цикл.
  3. Минимизируйте контекстные вызовы: Старайтесь переносить всю логику в функции &НаСервереБезКонтекста. Если нужно изменить данные в документе, передавайте только необходимые значения и обновляйте объект одной транзакцией.
  4. Очистка кэша: При странном поведении ТСД, которое не воспроизводится на других устройствах, попробуйте полностью очистить кэш приложения 1С в настройках Android или переустановить мобильное приложение.
  5. Контроль блокировок: Убедитесь, что серверная процедура не ждет освобождения таблиц в базе данных. На мобильном клиенте ожидание блокировки выглядит как обычное зависание интерфейса.

Помните, что разработка для ТСД требует более строгого отношения к качеству кода и объему передаваемого трафика, чем разработка для обычного тонкого клиента.

← На главную