При разработке мобильных решений для терминалов сбора данных (ТСД) на базе Android программисты часто сталкиваются с тем, что стандартное поведение интерфейса 1С не подходит для складских операций. Одной из наиболее острых проблем является обработка нажатия на строку списка или табличной части. По умолчанию мобильная платформа настроена так, что одиночный тап (нажатие) часто интерпретируется как выбор, что приводит к немедленному открытию документа. Это неудобно, если оператору нужно просто выделить строку для последующего сканирования штрихкода в неё или выполнения групповой обработки.
В этой статье мы подробно разберем, как изменить поведение табличных частей, обеспечив удобную навигацию на сенсорном экране ТСД, и рассмотрим программные методы управления активностью строк.
Проанализируем базовый механизм мобильной платформы, который отвечает за поведение выделения. Ключевым параметром здесь является свойство ИспользованиеТекущейСтроки. В мобильном приложении логика работы с фокусом существенно отличается от настольной версии.
Разберем возможные значения этого свойства:
Для того чтобы настроить корректное выделение, выполним следующие шаги в конфигураторе:
Выделим элемент формы (таблицу), перейдем в палитру свойств и найдем раздел Использование. Установим ИспользованиеТекущейСтроки в значение Использовать. Это позволит системе фиксировать фокус на строке при нажатии.
Часто одной настройки свойства ИспользованиеТекущейСтроки недостаточно, так как платформа продолжает открывать форму объекта при нажатии. Чтобы этого избежать, нам нужно настроить событие Выбор и свойства самой таблицы.
Рассмотрим ситуацию: нам нужно, чтобы одинарный тап только выделял строку, а открытие происходило, например, по специальной кнопке или двойному клику (хотя двойной клик на ТСД — вещь нестабильная). Выполним следующие действия:
Выбор. Если мы хотим полностью контролировать процесс открытия, нам нужно перехватить стандартную обработку.Посмотрим на пример кода в модуле формы:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартное открытие формы документа
СтандартнаяОбработка = Ложь;
// Если нужно, чтобы открытие все же происходило при определенных условиях:
// ПоказатьВопрос(Новый ОписаниеОповещения("ЗавершитьВыбор", ЭтотОбъект), "Открыть документ?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
На многих моделях ТСД стандартная подсветка активной строки в 1С едва заметна (тонкая рамка или слабый серый фон). В условиях склада это приводит к ошибкам. Выясним, как сделать выделение максимально наглядным с помощью Условного оформления.
Разберем по шагам алгоритм создания «яркого» выделения:
Число для табличной части или ЛюбаяСсылка для динамического списка). Назовем его ТекущийИдентификаторСтроки.ПриАктивизацииСтроки.В этом событии будем обновлять наш реквизит:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущаяСтрокаДанных = Элемент.ТекущаяСтрока;
Если ТекущаяСтрокаДанных <> Неопределено Тогда
ТекущийИдентификаторСтроки = ТекущаяСтрокаДанных;
КонецЕсли;
КонецПроцедуры
Теперь перейдем на вкладку Условное оформление формы и добавим новое правило:
Объект.Товары.НомерСтроки (или ссылка) Равно ТекущийИдентификаторСтроки.Таким образом, при каждом нажатии на строку она будет окрашиваться в выбранный цвет, давая оператору четкое понимание, с какой строкой он работает. Для быстрой программной генерации соответствующих настроек подойдёт конструктор кода условного оформления для табличных частей документов.
Часто пользователи жалуются, что после сканирования штрихкода активность строки «сбрасывается» или перемещается. Это происходит из-за того, что при получении данных от сканера форма обновляется или фокус переходит в поле ввода.
Проанализируем, как программно вернуть фокус на нужную строку. Рассмотрим пример использования метода ПолучитьИдентификатор() и установки ТекущаяСтрока. Важно помнить, что в мобильной платформе установка текущей строки может не сработать мгновенно, если данные еще загружаются.
&НаКлиенте
Процедура ОбработатьСканирование(Штрихкод)
// Допустим, мы нашли товар в таблице по штрихкоду
НайденныеСтроки = Объект.Товары.НайтиСтроки(Новый Структура("Штрихкод", Штрихкод));
Если НайденныеСтроки.Количество() > 0 Тогда
Идентификатор = НайденныеСтроки[0].ПолучитьИдентификатор();
// Устанавливаем активность строки
Элементы.Товары.ТекущаяСтрока = Идентификатор;
// Обязательно возвращаем фокус на саму таблицу,
// чтобы последующие нажатия кнопок ТСД работали корректно
ТекущийЭлемент = Элементы.Товары;
КонецЕсли;
КонецПроцедуры
Иногда проблема кроется не в коде 1С, а в настройках самого устройства Android. Большинство ТСД имеют встроенную утилиту обработки сканирования (например, DataWedge на Zebra). Если сканер настроен так, что после передачи штрихкода он отправляет символ ENTER (перевод строки), мобильная платформа 1С воспринимает это как команду Выбор.
Выясним, как это исправить:
\n или \r, удалите его.ВнешнееСобытие.Это позволит вам программно управлять тем, что происходит после сканирования, не вызывая автоматического «проваливания» в документ или перехода на следующую строку без вашего ведома. При необходимости можно воспользоваться набором мобильных конфигураций с примерами работы со встроенными сканерами ТСД различных производителей.
Мы рассмотрели комплексный подход к управлению табличными частями на ТСД. Помните, что интерфейс мобильного приложения должен быть максимально «плоским». Если задача позволяет, старайтесь выносить действия (редактирование, удаление) в отдельные кнопки на командной панели, оставляя саму таблицу только для навигации и визуального подтверждения выбора. Сочетание свойства ИспользованиеТекущейСтроки = Использовать и грамотного Условного оформления делает работу пользователя ТСД быстрой и безошибочной.