При разработке мобильных приложений 1С для терминалов сбора данных (ТСД) разработчики часто сталкиваются с неприятной особенностью интерфейса: когда кладовщик или кладовщица сканирует штрихкод товара, система успешно находит позицию в таблице и меняет значение свойства ТекущаяСтрока, однако экран мобильного устройства не прокручивается к найденной строке. В результате строка с измененным количеством остается за пределами видимости на экране, и пользователю приходится вручную листать список вниз, чтобы убедиться в успешной обработке.
Рассмотрим подробнее, почему происходит такое поведение в мобильной платформе 1С, и разберем все доступные способы решения этой задачи — от настройки свойств формы до программных обходов и оптимизации UI.
Проанализируем механику работы мобильного клиента и мобильной платформы 1С. Настольное управляемое приложение при установке свойства Элементы.Таблица.ТекущаяСтрока = ИдентификаторСтроки автоматически сдвигает видимую область таблицы так, чтобы активная строка оказалась в центре экрана. Однако на мобильных устройствах с сенсорным управлением логика взаимодействия построена иначе:
ДанныеФормыКоллекция), но мобильный рендерер UI не всегда генерирует событие визуального перезапуска позиции скролла для элемента таблицы.ОбработкаОповещения может вызывать подвисания интерфейса на слабых ТСД под управлением Android.ИспользованиеТекущейСтроки = Авто, при котором платформа может игнорировать постоянную визуальную фокусировку.Рассмотрим по шагам несколько эффективных способов решения этой проблемы.
Перед тем как переписывать логику формы, проверим настройки самого элемента таблицы. На мобильной платформе механизм автоскроллинга работает намного стабильнее, если перевести таблицу в режим списка и явно передать фокус на элемент.
Разберем последовательность действий:
Таблица на значение Список или Иерархический список. Поведение списка в мобильной платформе отличается от классической таблицы и лучше поддерживает автоматическое позиционирование.Отображение выделения и выбор вместо значения Авто.
&НаКлиенте
Процедура ОбработатьСканированиеТовара(ИдентификаторНайденнойСтроки)
// 1. Устанавливаем текущую строку таблицы
Элементы.ТаблицаТовары.ТекущаяСтрока = ИдентификаторНайденнойСтроки;
// 2. Явно обновляем коллекцию выделенных строк
Элементы.ТаблицаТовары.ВыделенныеСтроки.Очистить();
Элементы.ТаблицаТовары.ВыделенныеСтроки.Добавить(ИдентификаторНайденнойСтроки);
// 3. Передаем фокус на элемент формы
ЭтаФорма.ТекущийЭлемент = Элементы.ТаблицаТовары;
КонецПроцедуры
Если особенности прошивки ТСД или версии мобильной платформы не позволяют добиться стабильного скроллинга, наиболее эргономичным и рекомендуемым решением для ТСД является создание информационного блока над табличной частью.
При потоковом сканировании оператору некорректно каждый раз отвлекаться на прокрутку всей таблицы. Гораздо удобнее выводить данные последней сканированной позиции в крупном текстовом поле в верхней части экрана.
Разберем пример реализации:
ИнформацияОПоследнемТоваре.
&НаКлиенте
Процедура ПослеСканированияТовара(СтрокаТаблицы)
// Позиционируем строку в данных
Элементы.ТаблицаТовары.ТекущаяСтрока = СтрокаТаблицы.ПолучитьИдентификатор();
// Формируем наглядную информацию для оператора ТСД
ШаблонТекста = "№ %1 | %2 | Изменено: +1 (%3 %4)";
ИнформацияОПоследнемТоваре = СтрШаблон(
ШаблонТекста,
СтрокаТаблицы.НомерСтроки,
СтрокаТаблицы.Номенклатура,
СтрокаТаблицы.Количество,
СтрокаТаблицы.ЕдиницаИзмерения
);
КонецПроцедуры
Рассмотрим оригинальный подход: если пользователь всегда должен видеть актуальную измененную строку, мы можем динамочески перемещать обработанные товары в начало таблицы. В этом случае последняя сканированная позиция всегда будет находиться на первой строчке и точно попадет в видимую область экрана без скроллинга.
Посмотрим на пример кода реализации данного алгоритма:
&НаКлиенте
Процедура ПоднятьСтрокуНаверх(НайденнаяСтрока)
// Добавляем служебную колонку Сортировка (Число) в ТЧ
// При каждом сканировании сбрасываем индекс или присваиваем текущее время/счетчик
Идентификатор = НайденнаяСтрока.ПолучитьИдентификатор();
// Присваиваем максимальный приоритет сканируемой строке
МаксимальныйИндекс = Объект.Товары.Итог("ИндексСортировки") + 1;
НайденнаяСтрока.ИндексСортировки = МаксимальныйИндекс;
// Сортируем коллекцию по убыванию
Объект.Товары.Сортировать("ИндексСортировки Убыв");
// Устанавливаем текущую строку на первую позицию
Элементы.ТаблицаТовары.ТекущаяСтрока = Идентификатор;
КонецПроцедуры
Если строка находится в зоне видимости или рядом с ней, пользователю важно сразу заметить изменения. На мобильных экранах мелкий курсор выделения 1С бывает плохо различим. Дополним установку текущей строки цветовым выделением через Условное оформление.
ЭтоПоследнийСканированный (Тип: Булево).ЭтоПоследнийСканированный = Истина, то цвет фона ячейки или строки становится ярко-зеленым или желтым.
&НаКлиенте
Процедура ПодсветитьСканированнуюСтроку(ТекущаяСтрокаТЧ)
// Сбрасываем подсвечивание для всех строк
Для Каждого СтрокаИз СписокТоваров Цикл
СтрокаИз.ЭтоПоследнийСканированный = Ложь;
КонецЦикла;
// Устанавливаем подсвечивание для текущей
ТекущаяСтрокаТЧ.ЭтоПоследнийСканированный = Истина;
Элементы.ТаблицаТовары.ТекущаяСтрока = ТекущаяСтрокаТЧ.ПолучитьИдентификатор();
КонецПроцедуры
Сравнительная характеристика представленных подходов для мобильных решений на базе 1С:
1. Настройка свойств элемента (Иерархический список + Выделение)
Плюсы: Нативное решение без изменения структуры данных.
Минусы: Может зависеть от версии мобильной платформы и прошивки ТСД.
2. Информационное поле над таблицей
Плюсы: Высокая скорость работы, стопроцентная надежность, удобство оператора.
Минусы: Занимает место на небольших экранах мобильных устройств.
3. Сортировка таблицы по приоритету
Плюсы: Измененный товар всегда на виду в верхней части экрана.
Минусы: Изменяет привычный порядок строк документа.
4. Комбинация с Условным оформлением
Плюсы: Наглядность для пользователя при ручной прокрутке.
Минусы: Требует дополнительных обходов коллекции в коде.
Проанализировав все способы, для массовой разработки под ТСД наиболее эффективной комбинацией является использование информационного поля над таблицей совместно с подсветкой текущей строки условным оформлением.