Как программно прокрутить список к текущей строке на мобильном клиенте или мобильной платформе 1С?

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

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

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

В чем причина такого поведения мобильной платформы?

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

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

Давайте разберем по шагам несколько эффективных способов решения этой проблемы — от официальных настроек свойств формы до неочевидных обходных путей (workarounds).

Решение 1. Настройка свойства «Использование текущей строки»

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

По умолчанию это свойство установлено в значение Авто. В мобильном клиенте режим Авто трактуется платформой как Выбор. Это означает, что текущая строка существует и определяется платформой только в моменты интерактивного редактирования, клика или выбора строки. В остальное время фокус может программно сбрасываться в Неопределено.

Чтобы решить эту проблему, выполните следующие действия:

  1. Откройте форму в конфигураторе и выберите нужную таблицу (например, Товары).
  2. В панели свойств найдите поле Использование текущей строки.
  3. Принудительно измените значение с Авто на Отображение выделения (или Отображение выделения и выбор).

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

Решение 2. Принудительная активизация элемента формы

Простое присвоение идентификатора в ТекущаяСтрока не всегда инициирует обновление интерфейса мобильного приложения. Платформе необходимо явно указать, куда именно переместить фокус ввода. Для этого сразу после позиционирования строки мы должны переопределить свойство формы ТекущийЭлемент.

Рассмотрим пример кода, который решает эту задачу:


&НаКлиенте
Процедура ПерепрыгнутьНаСтроку(ИдентификаторСтроки)
    
    // 1. Устанавливаем текущую строку в табличной части
    Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
    
    // 2. Явно переносим фокус на саму таблицу
    ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
    
КонецПроцедуры

Если фокус на таблицу в целом не помогает выполнить автоматическую прокрутку, можно применить более агрессивный метод: направить фокус на конкретное поле (колонку) внутри этой таблицы. Это заставит платформу принудительно отобразить ячейку на экране:


&НаКлиенте
Процедура ПерепрыгнутьНаСтрокуСФокусомЯчейки(ИдентификаторСтроки)
    
    Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
    
    // Передаем фокус на конкретное поле ввода внутри выделенной строки
    ЭтаФорма.ТекущийЭлемент = Элементы.ТоварыНоменклатура;
    
КонецПроцедуры

Решение 3. Синхронизация с коллекцией «ВыделенныеСтроки»

В некоторых версиях мобильной платформы (особенно на операционной системе Android) позиционирование срабатывает корректно только в том случае, если строка не просто назначена текущей, но и добавлена в коллекцию выделенных элементов таблицы.

Давайте реализуем этот подход программно:


&НаКлиенте
Процедура АктивизироватьИВыделитьСтроку(ИдентификаторСтроки)

    // Указываем текущую строку
    Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
    
    // Очищаем коллекцию выделенных строк и добавляем туда нашу строку
    Элементы.Товары.ВыделенныеСтроки.Очистить();
    Элементы.Товары.ВыделенныеСтроки.Добавить(ИдентификаторСтроки);
    
    // Обновляем текущий элемент формы
    ЭтаФорма.ТекущийЭлемент = Элементы.Товары;

КонецПроцедуры

Решение 4. Обходной путь через перезаполнение таблицы на сервере

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

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

Проанализируем реализацию этого метода:


&НаСервере
Процедура ОбновитьТоварыНаСервере()
    
    // Выгружаем данные табличной части во временную Таблицу Значений
    ТаблицаТовары = Товары.Выгрузить();
    
    // Очищаем исходную табличную часть
    Товары.Очистить();
    
    // Загружаем данные обратно, инициируя полную перерисовку на клиенте
    Товары.Загрузить(ТаблицаТовары);
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПозиционированиеНаСтроке(ИдентификаторСтроки)
    
    // Вызываем серверную процедуру обновления данных
    ОбновитьТоварыНаСервере();
    
    // Теперь установка текущей строки гарантированно прокрутит список
    Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
    ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
    
КонецПроцедуры

Важное примечание: Этот метод является ресурсоемким, так как гоняет данные между клиентом и сервером. Используйте его только в том случае, если другие методы оптимизации интерфейса не принесли желаемого результата, а объем строк в табличной части относительно невелик (до 100-200 строк).

Решение 5. Смена режима отображения таблицы

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

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

Влияние верстки и компоновки элементов формы

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

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

← На главную