Как отображать текст этапа выполнения и прогресс при длительных операциях в мобильном приложении 1С?

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

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

Механизм передачи сообщений через системный буфер

Рассмотрим наиболее простой и, как выяснилось на практике, эффективный способ передачи текстовой информации — использование системных сообщений. Долгое время среди разработчиков бытовало мнение, что метод ПолучитьСообщенияПользователю() недоступен для фоновых заданий в мобильной платформе. Однако, начиная с релиза 8.3.18, этот механизм работает стабильно.

Разберем алгоритм реализации этого метода по шагам. Сначала в модуле, где выполняется длительная операция (в контексте фонового задания), мы используем стандартную процедуру Сообщить() для фиксации этапов.


// Код внутри фонового задания
Процедура ВыполнитьДлительнуюОперациюЛокально() Экспорт
    // Этап 1
    Сообщить("Инициализация данных...");
    // Логика обработки...
    
    // Этап 2
    Сообщить("Загрузка объектов из базы...");
    // Логика обработки...
    
    // Этап 3
    Сообщить("Финальный расчет себестоимости...");
    // Логика обработки...
КонецПроцедуры

Теперь проанализируем, как получить эти данные в основной форме приложения. Нам потребуется обработчик ожидания, который будет периодически «опрашивать» фоновое задание на предмет новых сообщений.


&НаКлиенте
Процедура ОбработчикОжиданияКонтроляЗадания()
    // Получаем сообщения, накопленные фоновым заданием
    МассивСообщений = ПолучитьСообщенияПользователю(Истина);
    
    Если МассивСообщений.Количество() > 0 Тогда
        // Берем последнее сообщение для отображения текущего статуса
        ТекстТекущегоЭтапа = МассивСообщений[МассивСообщений.Количество() - 1].Текст;
        // Обновляем реквизит формы, связанный с надписью над крутилкой
        СтатусВыполнения = ТекстТекущегоЭтапа;
    КонецЕсли;
    
    // Проверка завершения задания
    Если ЗаданиеВыполнено() Тогда
        ОтключитьОбработчикОжидания("ОбработчикОжиданияКонтроляЗадания");
        // Закрываем форму индикации
    КонецЕсли;
КонецПроцедуры

Использование штатного метода ИнформироватьОПрогрессе

Посмотрим на более «профессиональный» подход, который предоставляет платформа для работы с индикаторами (Progress Bar). Метод ИнформироватьОПрогрессе() позволяет передавать не только текст, но и процент выполнения, что крайне важно для комфорта пользователя.

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


// В фоновом задании
ИнформироватьОПрогрессе(10, "Начало обработки...");
// ... часть кода ...
ИнформироватьОПрогрессе(50, "Обработано 500 элементов из 1000...");

На стороне формы мы используем метод ПолучитьПрогрессФоновогоЗадания(). Это позволяет нам не просто выводить текст, но и динамически изменять длину полосы прогресса на экране смартфона. Рассмотрим пример интеграции:


&НаКлиенте
Процедура МониторингПрогресса()
    ДанныеПрогресса = ПолучитьПрогрессФоновогоЗадания(ИдентификаторЗадания);
    Если ДанныеПрогресса <> Неопределено Тогда
        ПроцентВыполнения = ДанныеПрогресса.Процент;
        ТекстЭтапа = ДанныеПрогресса.Текст;
    КонецЕсли;
КонецПроцедуры

Особенности интерфейса: всплывающие окна и блокировка

Выясним причину, по которой многие разработчики сталкиваются с трудностями при попытке создать модальное окно прогресса в мобильном приложении. В мобильной платформе 1С стандартное открытие формы БлокироватьВесьИнтерфейс или модальное открытие зачастую занимает весь экран, перекрывая важные элементы навигации.

Для создания качественной «крутилки» рекомендуется придерживаться следующих правил:

  1. Не используйте системные предупреждения для отображения динамического прогресса. Методы типа ПоказатьПредупреждение() создают системное диалоговое окно, которое требует действия пользователя и прерывает поток анимации.
  2. Создайте отдельную форму-индикатор. Лучше всего спроектировать легкую форму, которая открывается поверх основной. В актуальных версиях мобильной платформы рекомендуется использовать полноэкранный режим, но с сохранением возможности отмены операции пользователем.
  3. Анимация. Чтобы интерфейс не выглядел «застывшим», обязательно используйте штатный анимированный индикатор (картинку типа GIF или встроенный элемент управления «Индикатор»).

Ограничения и альтернативные способы хранения состояния

Разберем важный нюанс: в мобильной платформе 1С может выполняться только одно фоновое задание одновременно. Это критическое ограничение, которое нужно учитывать при проектировании архитектуры приложения. Если ваша логика предполагает параллельные вычисления, их придется выстраивать в очередь.

Если по каким-то причинам механизмы сообщений и прогресса не подходят (например, при очень интенсивном обмене данными, который может «подтормаживать» интерфейсный поток), можно рассмотреть альтернативные варианты:

  1. Локальная таблица SQLite. Фоновое задание записывает текущий статус в маленькую техническую таблицу в локальной базе данных мобильного приложения. Основная форма считывает эту запись. Это самый надежный способ, гарантирующий сохранность данных даже при временном сворачивании приложения.
  2. Параметры сеанса. Хотя автор темы сомневался в них, в мобильной платформе они вполне применимы для хранения глобального состояния, однако они менее оперативны для частого обновления текста «на лету».
  3. ХранилищеЗначений. Вопреки устаревшей документации, современные релизы мобильной платформы прекрасно справляются с десериализацией объектов через ХранилищеЗначений, что позволяет передавать из фонового задания сложные структуры данных (например, промежуточные таблицы результатов).

Итоги и рекомендации

Подводя итог нашему анализу, можно составить оптимальный план реализации длительной операции в мобильном 1С:

Во-первых, всегда выносите тяжелые вычисления в фоновое задание, чтобы не блокировать интерфейс (UI-thread) и избежать системного сообщения ОС «Приложение не отвечает».

Во-вторых, используйте комбинацию ИнформироватьОПрогрессе() для числовых данных и Сообщить() для детального лога событий. Это даст вам максимальную гибкость при отладке и информировании пользователя.

В-третьих, реализуйте в форме обработчик ожидания с интервалом 1-2 секунды. Слишком частый опрос (например, каждые 0.1 сек) на мобильных устройствах может привести к избыточному расходу батареи и визуальным фризам анимации.

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

← На главную