Как реализовать обновление формы по скроллу вниз (pull-to-refresh) в мобильном приложении 1С?

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

При разработке мобильных интерфейсов на платформе 1С часто возникает задача реализации привычного пользователям жеста pull-to-refresh — обновления данных при потягивании списка вниз. Несмотря на наличие штатных механизмов, разработчики часто сталкиваются с тем, что стандартные события не срабатывают или точка останова в конфигураторе игнорируется. В рамках данной статьи мы подробно разберем, как заставить этот механизм работать, проанализируем возможные ошибки и рассмотрим альтернативные способы реализации динамического обновления.

Разбор штатного механизма: событие ОбработкаЗапросаОбновления

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

  1. Версия платформы: Данное событие было введено в мобильную платформу, начиная с версии 8.3.15. Если ваше мобильное приложение собрано на более старой версии или вы используете устаревший мобильный клиент, жест обновления просто не будет поддерживаться на уровне ядра системы.
  2. Тип элемента управления: Рассмотрим свойства элементов на форме. Событие ОбработкаЗапросаОбновления не является универсальным для всей формы. Оно жестко привязано к Динамическим спискам и Таблицам, которые связаны с наборами данных.
  3. Настройка свойств: Проанализируем свойства таблицы на форме. Чтобы жест «заработал», необходимо найти параметр Обновление при листании. В большинстве случаев его следует установить в режим Авто или принудительно разрешить обновление.
  4. Привязка обработчика: Обратите внимание, что само событие назначается в свойствах Формы, однако триггером (инициатором) выступает жест над конкретным списком. Если на форме расположено несколько таблиц, убедитесь, что жест выполняется именно над той, которая настроена как основная.

Особенности отладки и визуальной индикации

Выясним причину, по которой точка останова может «пролетать». Отладка мобильных приложений имеет свои нюансы: интерфейсные жесты в мобильных ОС (Android/iOS) имеют жесткие тайм-ауты. Если поток интерфейса замирает на точке останова, операционная система может сбросить состояние жеста, посчитав приложение зависшим. Рассмотрим, как проверить работу кода без использования классической отладки:

Вместо точки останова используем запись в журнал регистрации или вывод сообщения. Проанализируем следующий пример кода:


&НаКлиенте
Процедура ОбработкаЗапросаОбновления(Отказ, СтандартнаяОбработка)
    
    // Записываем событие для проверки без отладки
    ЗаписьЖурналаРегистрации("МобильноеПриложение.Обновление", УровеньЖурналаРегистрации.Информация, , , "Жест обновления сработал");
    
    // Обновляем данные динамического списка
    Элементы.Список.Обновить();
    
    // Если нужно программно отменить стандартное поведение
    // СтандартнаяОбработка = Ложь;
    
КонецПроцедуры

При вызове этого события на мобильном устройстве автоматически появляется стандартный индикатор загрузки (spinner). Как только выполнение кода в этом обработчике завершается, индикатор исчезает. Если ваш код выполняется слишком быстро, пользователь может просто не заметить анимации. Разберем важный момент: жест работает только тогда, когда список находится в самой верхней позиции. Если список прокручен хотя бы на один пиксель вниз, система воспримет касание как обычный скролл.

Реализация через ПолеHTMLДокумента

Как отмечают опытные разработчики, иногда штатные средства 1С кажутся недостаточно гибкими. В таких случаях рассмотрим альтернативный подход с использованием ПолеHTMLДокумента. Этот метод позволяет создать полностью кастомный интерфейс с использованием HTML, CSS и JavaScript. Проанализируем, как связать мобильную платформу и JS-скрипт:

Для реализации pull-to-refresh внутри HTML-поля нам потребуется библиотека (например, PullToRefresh.js) или написание собственного обработчика событий касания (touch events). Посмотрим на логику взаимодействия:

  1. Внутри HTML-документа JavaScript перехватывает жест свайпа вниз.
  2. JS вызывает событие обновления и передает сигнал в 1С через механизм window.location или ПриНажатии.
  3. В коде 1С мы перехватываем это событие и обновляем данные в базе.

Этот способ считается наиболее функциональным, но требует знаний веб-технологий. Разберем пример перехвата события в 1С при использовании HTML:


&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    Если ДанныеСобытия.Свойство("id") И ДанныеСобытия.id = "refresh_trigger" Тогда
        СтандартнаяОбработка = Ложь;
        ОбновитьДанныеНаФорме();
    КонецЕсли;
    
КонецПроцедуры

Специфика работы на Терминалах Сбора Данных (ТСД)

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

Многие ТСД имеют встроенные механизмы перехвата жестов для работы сканера или защищенные оболочки (Kiosk mode). Если стандартный жест pull-to-refresh не срабатывает, рекомендуется использовать альтернативные методы интерфейса. Разберем рекомендации гайдлайнов 1С:

Подводя итог, можно сказать, что реализация обновления по скроллу в 1С вполне возможна при соблюдении технических требований платформы. Мы рекомендуем сначала убедиться в правильности настройки свойств динамического списка и версии платформы, и только при невозможности использования штатного механизма переходить к реализации через HTML-поля или кнопки управления. Для реализации адаптивного интерфейса на базе HTML можно использовать пример динамического подбора товаров в мобильном приложении.

← На главную