Как обеспечить вертикальную прокрутку к текущей строке в таблице мобильного приложения 1С

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

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

Анализ проблемы позиционирования в мобильной платформе

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

Выясним причины, по которым автоматический скролл может не срабатывать:

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

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

Решение 1. Настройка управления высотой таблицы

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

Рассмотрим по шагам, что нужно изменить в свойствах таблицы:

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

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

Решение 2. Переключение режима просмотра (Иерархический список)

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

Посмотрим, как это настроить:

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

Решение 3. Программная манипуляция фокусом и "Двойной прыжок"

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

Рассмотрим пример кода, который можно использовать при добавлении или изменении строки:


// Допустим, НоваяСтрока - это объект строки, которую мы добавили
ИдентификаторНужнойСтроки = НоваяСтрока.ПолучитьИдентификатор();

// Сначала позиционируемся на нужную строку
Элементы.Товары.ТекущаяСтрока = ИдентификаторНужнойСтроки;

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

// Обязательно делаем таблицу текущим элементом формы
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;

Такой подход заставляет платформу перерисовать таблицу. Хотя это выглядит как "костыль", в мобильной разработке это часто единственный способ гарантировать результат на старых версиях платформы (например, 8.3.18).

Решение 4. Использование обработчика ожидания

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

Рассмотрим, как это реализовать. Вместо прямого назначения строки в основной процедуре, мы выносим это в отдельный метод:


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

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

Задержка всего в 0.1 секунды дает мобильному приложению время завершить отрисовку новых данных, после чего команда ТекущаяСтрока отрабатывает по уже готовой визуальной сетке.

Рекомендации для стабильной работы на ТСД

Проанализировав все способы, можно составить чек-лист для разработчика мобильного приложения 1С:

  1. Всегда устанавливайте Вариант управления высотой в В строках таблицы для списков товаров.
  2. Убедитесь, что Растягивать по вертикали у таблицы и всех её родительских групп стоит в значении Да или Авто. Если таблица "зажата" в контейнере с фиксированной высотой, скролл может блокироваться.
  3. Используйте ЭтаФорма.ТекущийЭлемент = Элементы.ВашаТаблица; сразу после смены строки. Без активного фокуса на элементе мобильная платформа часто не считает нужным прокручивать содержимое.
  4. Если вы используете мобильный клиент (а не автономное приложение), помните о сетевых задержках. В этом случае использование Обработчика ожидания становится практически обязательным условием для визуальных манипуляций.

Резюмируем: Проблема отсутствия прокрутки в мобильной 1С решается в 90% случаев простым изменением настроек высоты элемента в конфигураторе. В оставшихся 10% помогают программные методы управления фокусом и использование небольших пауз в выполнении кода для корректного обновления UI-потока.

← На главную