При разработке мобильных приложений на платформе 1С, особенно для терминалов сбора данных (ТСД), разработчики часто сталкиваются с неприятной особенностью: программная установка свойства ТекущаяСтрока выделяет нужную строку, но визуально таблица к ней не прокручивается. Если позиция находится за пределами видимости экрана, пользователь просто не видит изменений, что критично при потоковом сканировании товаров. В рамках данной статьи мы детально разберем, почему это происходит и как заставить мобильную платформу корректно отображать выбранный элемент.
Рассмотрим стандартную ситуацию: мы добавляем новую строку в табличную часть или ищем существующую по штрихкоду, после чего пытаемся сфокусировать на ней интерфейс. Стандартный код Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки; отрабатывает на уровне логики, но графическая оболочка мобильного клиента часто игнорирует команду на прокрутку (скроллинг). Это связано с особенностями рендеринга интерфейса, где мобильная платформа старается минимизировать перерисовки экрана ради производительности.
Выясним причины, по которым автоматический скролл может не срабатывать:
ТекущийЭлемент).Проанализируем наиболее эффективные способы решения этой задачи, от простых настроек свойств до программных обходных путей.
Как показывает практика и опыт разработчиков, наиболее стабильным решением является изменение настроек отображения элемента формы "Таблица". По умолчанию свойство ВариантУправленияВысотой установлено в значение Авто. В мобильном приложении это часто приводит к тому, что область прокрутки определяется некорректно.
Рассмотрим по шагам, что нужно изменить в свойствах таблицы:
Товары).В строках таблицы (или В строках формы, в зависимости от компоновки элементов на экране).Авто (например, Всегда), чтобы подсветка была явно видна пользователю.Важно: Установка значения В строках таблицы заставляет движок платформы более жестко привязывать визуальный ряд к индексам строк, что активирует механизм автоматического скроллинга при программном изменении текущей строки.
Еще одним интересным и проверенным методом является изменение режима отображения данных. Замечено, что в режиме "Список" прокрутка в мобильной платформе иногда "засыпает", в то время как иерархическое представление заставляет систему постоянно пересчитывать видимые области.
Посмотрим, как это настроить:
Иерархический список.Даже если ваша таблица не содержит иерархии (простая таблица значений или табличная часть), этот режим может "вылечить" проблему прокрутки. В некоторых случаях помогает даже простая манипуляция: переключить режим в "Иерархический список" и обратно в "Список" — это сбрасывает внутренние кэши визуализации элемента в конфигураторе.
Если настройки свойств не помогают (что случается на специфических версиях платформы или конкретных моделях ТСД), проанализируем программный метод принудительного обновления экрана. Суть заключается в том, чтобы сначала сместить фокус на другую строку, а затем мгновенно вернуть его на нужную. Это инициирует событие обновления видимой области.
Рассмотрим пример кода, который можно использовать при добавлении или изменении строки:
// Допустим, НоваяСтрока - это объект строки, которую мы добавили
ИдентификаторНужнойСтроки = НоваяСтрока.ПолучитьИдентификатор();
// Сначала позиционируемся на нужную строку
Элементы.Товары.ТекущаяСтрока = ИдентификаторНужнойСтроки;
// Если в таблице больше одной строки, делаем кратковременное смещение фокуса
Если Объект.Товары.Количество() > 1 Тогда
// Пытаемся "дернуть" фокус на соседнюю строку (например, вторую по счету)
Элементы.Товары.ТекущаяСтрока = Объект.Товары[1].ПолучитьИдентификатор();
// И тут же возвращаем на нашу актуальную строку
Элементы.Товары.ТекущаяСтрока = ИдентификаторНужнойСтроки;
КонецЕсли;
// Обязательно делаем таблицу текущим элементом формы
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
Такой подход заставляет платформу перерисовать таблицу. Хотя это выглядит как "костыль", в мобильной разработке это часто единственный способ гарантировать результат на старых версиях платформы (например, 8.3.18).
Разберем еще одну ситуацию: прокрутка не срабатывает, потому что код выполняется в одном потоке с обновлением интерфейса. Программа уже назначила новую строку, но таблица еще не знает, что ее размер изменился. В этом случае поможет использование ПодключитьОбработчикОжидания.
Рассмотрим, как это реализовать. Вместо прямого назначения строки в основной процедуре, мы выносим это в отдельный метод:
&НаКлиенте
Процедура ПослеСканированияШтрихкода()
// ... логика поиска/добавления строки ...
// Сохраняем ID строки в переменную модуля или реквизит формы
ИдентификаторДляПозиционирования = НоваяСтрока.ПолучитьИдентификатор();
// Вызываем прокрутку с минимальной задержкой
ПодключитьОбработчикОжидания("УстановитьПозициюВТаблице", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПозициюВТаблице()
Элементы.Товары.ТекущаяСтрока = ИдентификаторДляПозиционирования;
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
КонецПроцедуры
Задержка всего в 0.1 секунды дает мобильному приложению время завершить отрисовку новых данных, после чего команда ТекущаяСтрока отрабатывает по уже готовой визуальной сетке.
Проанализировав все способы, можно составить чек-лист для разработчика мобильного приложения 1С:
В строках таблицы для списков товаров.Да или Авто. Если таблица "зажата" в контейнере с фиксированной высотой, скролл может блокироваться.ЭтаФорма.ТекущийЭлемент = Элементы.ВашаТаблица; сразу после смены строки. Без активного фокуса на элементе мобильная платформа часто не считает нужным прокручивать содержимое.Резюмируем: Проблема отсутствия прокрутки в мобильной 1С решается в 90% случаев простым изменением настроек высоты элемента в конфигураторе. В оставшихся 10% помогают программные методы управления фокусом и использование небольших пауз в выполнении кода для корректного обновления UI-потока.