В мобильной разработке на платформе 1С работа с длительными операциями имеет ряд критических отличий от настольной версии. Основная сложность заключается в ограниченности ресурсов устройства и специфике работы фоновых заданий. Пользователи ожидают не просто «крутилку» (индикатор загрузки), а понимание того, на каком этапе находится процесс. В этой статье мы подробно разберем, как передавать информацию о состоянии выполнения из фонового потока в интерфейс мобильного приложения, проанализируем доступные методы и выберем оптимальную стратегию реализации.
Рассмотрим наиболее простой и, как выяснилось на практике, эффективный способ передачи текстовой информации — использование системных сообщений. Долгое время среди разработчиков бытовало мнение, что метод ПолучитьСообщенияПользователю() недоступен для фоновых заданий в мобильной платформе. Однако, начиная с релиза 8.3.18, этот механизм работает стабильно.
Разберем алгоритм реализации этого метода по шагам. Сначала в модуле, где выполняется длительная операция (в контексте фонового задания), мы используем стандартную процедуру Сообщить() для фиксации этапов.
// Код внутри фонового задания
Процедура ВыполнитьДлительнуюОперациюЛокально() Экспорт
// Этап 1
Сообщить("Инициализация данных...");
// Логика обработки...
// Этап 2
Сообщить("Загрузка объектов из базы...");
// Логика обработки...
// Этап 3
Сообщить("Финальный расчет себестоимости...");
// Логика обработки...
КонецПроцедуры
Теперь проанализируем, как получить эти данные в основной форме приложения. Нам потребуется обработчик ожидания, который будет периодически «опрашивать» фоновое задание на предмет новых сообщений.
&НаКлиенте
Процедура ОбработчикОжиданияКонтроляЗадания()
// Получаем сообщения, накопленные фоновым заданием
МассивСообщений = ПолучитьСообщенияПользователю(Истина);
Если МассивСообщений.Количество() > 0 Тогда
// Берем последнее сообщение для отображения текущего статуса
ТекстТекущегоЭтапа = МассивСообщений[МассивСообщений.Количество() - 1].Текст;
// Обновляем реквизит формы, связанный с надписью над крутилкой
СтатусВыполнения = ТекстТекущегоЭтапа;
КонецЕсли;
// Проверка завершения задания
Если ЗаданиеВыполнено() Тогда
ОтключитьОбработчикОжидания("ОбработчикОжиданияКонтроляЗадания");
// Закрываем форму индикации
КонецЕсли;
КонецПроцедуры
Посмотрим на более «профессиональный» подход, который предоставляет платформа для работы с индикаторами (Progress Bar). Метод ИнформироватьОПрогрессе() позволяет передавать не только текст, но и процент выполнения, что крайне важно для комфорта пользователя.
Проанализируем ситуацию: когда мы используем этот метод, данные попадают в специальное хранилище состояния фонового задания. В мобильном приложении это работает так же, как и в «большой» 1С, но требует четкого понимания структуры передаваемых данных.
// В фоновом задании
ИнформироватьОПрогрессе(10, "Начало обработки...");
// ... часть кода ...
ИнформироватьОПрогрессе(50, "Обработано 500 элементов из 1000...");
На стороне формы мы используем метод ПолучитьПрогрессФоновогоЗадания(). Это позволяет нам не просто выводить текст, но и динамически изменять длину полосы прогресса на экране смартфона. Рассмотрим пример интеграции:
&НаКлиенте
Процедура МониторингПрогресса()
ДанныеПрогресса = ПолучитьПрогрессФоновогоЗадания(ИдентификаторЗадания);
Если ДанныеПрогресса <> Неопределено Тогда
ПроцентВыполнения = ДанныеПрогресса.Процент;
ТекстЭтапа = ДанныеПрогресса.Текст;
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой многие разработчики сталкиваются с трудностями при попытке создать модальное окно прогресса в мобильном приложении. В мобильной платформе 1С стандартное открытие формы БлокироватьВесьИнтерфейс или модальное открытие зачастую занимает весь экран, перекрывая важные элементы навигации.
Для создания качественной «крутилки» рекомендуется придерживаться следующих правил:
ПоказатьПредупреждение() создают системное диалоговое окно, которое требует действия пользователя и прерывает поток анимации.Разберем важный нюанс: в мобильной платформе 1С может выполняться только одно фоновое задание одновременно. Это критическое ограничение, которое нужно учитывать при проектировании архитектуры приложения. Если ваша логика предполагает параллельные вычисления, их придется выстраивать в очередь.
Если по каким-то причинам механизмы сообщений и прогресса не подходят (например, при очень интенсивном обмене данными, который может «подтормаживать» интерфейсный поток), можно рассмотреть альтернативные варианты:
ХранилищеЗначений, что позволяет передавать из фонового задания сложные структуры данных (например, промежуточные таблицы результатов).Подводя итог нашему анализу, можно составить оптимальный план реализации длительной операции в мобильном 1С:
Во-первых, всегда выносите тяжелые вычисления в фоновое задание, чтобы не блокировать интерфейс (UI-thread) и избежать системного сообщения ОС «Приложение не отвечает».
Во-вторых, используйте комбинацию ИнформироватьОПрогрессе() для числовых данных и Сообщить() для детального лога событий. Это даст вам максимальную гибкость при отладке и информировании пользователя.
В-третьих, реализуйте в форме обработчик ожидания с интервалом 1-2 секунды. Слишком частый опрос (например, каждые 0.1 сек) на мобильных устройствах может привести к избыточному расходу батареи и визуальным фризам анимации.
Соблюдение этих правил позволит вашему мобильному приложению выглядеть профессионально и обеспечит пользователю комфортную работу даже с самыми трудоемкими процессами обработки данных.