Сказ о том, как мы мобильное приложение писали. Часть 2. Обработка долгого нажатия

17.04.23

Разработка - Мобильная разработка

Делимся опытом, как мы обходим ограничения мобильной платформы.

Скачать файлы

Наименование Файл Версия Размер
Обработка долгого нажатия
.epf 6,81Kb
12
.epf 6,81Kb 12 Скачать

Эта публикация – вторая из цикла статей о создании простого приложения для мобильной торговли - Контейнер (Google Play и App Store). Что такое Контейнер, почему оно так называется и как мы боролись с двойным заголовком, мы рассказали в первой статье:

Сказ о том, как мы мобильное приложение писали. Часть 1. Двойной заголовок

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

Проблема

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

 

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

Не может? Ой, да шо вы говорите!

Решение

Как известно, при обычном нажатии на строку срабатывает событие Выбор, и строка открывается. Если строку просто выделить, то сработает событие ПриАктивизацииЯчейки. Казалось бы – что мешает поместить наш код в это событие? Не всё так просто – оно срабатывает не только при выделении, но и при нажатии. Когда мы нажимаем на строку – она на мгновение выделяется (это можно увидеть невооруженным глазом), а потом уже открывается.

Итак, что мы имеем? При долгом тапе отрабатывает только ПриАктивизацииЯчейки, при коротком – ПриАктивизацииЯчейки и Выбор. Вывод напрашивается сам собой – если сработали оба события – значит это Выбор, если сработала только Активизация – значит это долгий тап.

Как мы будем это определять? Напрашивается простой вариант – у формы завести переменную ДолгийТап с типом булево, в событии ПриАктивизацииЯчейки устаналивать ее в Истину, а в Выборе в Ложь. При этом в Активизации подключить Обработчик ожидания, который через полсекунды проверяет – если ДолгийТап = Истина, тогда показываем пользователю меню, если Ложь – тогда ничего не делаем.
Сказано – сделано. Пишем код:

&НаКлиенте
Перем ДолгийТап;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ДолгийТап = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура КлиентыПриАктивизацииЯчейки(Элемент)
	
	ДолгийТап = Истина;
	ПодключитьОбработчикОжидания("Подключаемый_ПроверитьДолгийТап", 0.5, Истина);
	
КонецПроцедуры


&НаКлиенте
Процедура КлиентыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ДолгийТап = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПроверитьДолгийТап()
	
	Если ДолгийТап Тогда
		Предупреждение("Это долгий тап!");
	КонецЕсли;
	
КонецПроцедуры

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

Впрочем, даже в таком варианте этим пользоваться можно. Но “можно” нас не устраивает, поэтому мы продолжаем эксперименты.

Если присмотреться, то корень обеих проблем кроется в выделенной строке. Значит, сделаем так – будем очищать выделенные строки везде, кроме обработчика Активизации, а в обработчике ожидания поставим проверку на выделенные строки. Если выделенные строки есть – значит, Активизации сработала, а Выбор – нет, следовательно, это долгий тап. Пишем алгоритм:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Элементы.Клиенты.ВыделенныеСтроки.Очистить();
	
КонецПроцедуры

&НаКлиенте
Процедура КлиентыПриАктивизацииЯчейки(Элемент)
	
	ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыделенныеСтроки", 0.5, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура КлиентыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Элементы.Клиенты.ВыделенныеСтроки.Очистить();
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПроверитьВыделенныеСтроки()
	
	Если Элементы.Клиенты.ВыделенныеСтроки.Количество() <> 0 Тогда
		Предупреждение("Это долгий тап!");
		Элементы.Клиенты.ВыделенныеСтроки.Очистить();
	КонецЕсли;
	
КонецПроцедуры

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

Зато вторая проблема решилась – несмотря на то, что после открытия формы строки сама строка визуально остается выделенной, повторный тап по ней срабатывает и выполняется наш обработчик.

Подумаем над первой проблемой. Здесь есть несколько вариантов обхода, но мы остановились на следующей реализации: заведем переменную формы ЛожноеВыделение с типом булево и при открытии будем присваивать ей Истину, а в событии Активизации пропишем, что если это ложное выделение – то выделенные строки очищаются и ничего не происходит. Пробуем:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ЛожноеВыделение = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура КлиентыПриАктивизацииЯчейки(Элемент)
	
	Если ЛожноеВыделение Тогда
		Элементы.Клиенты.ВыделенныеСтроки.Очистить();
		ЛожноеВыделение = Ложь;
	Иначе
		ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыделенныеСтроки", 0.5, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура КлиентыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Элементы.Клиенты.ВыделенныеСтроки.Очистить();
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПроверитьВыделенныеСтроки()
	
	Если Элементы.Клиенты.ВыделенныеСтроки.Количество() <> 0 Тогда
		Предупреждение("Это долгий тап!");
		Элементы.Клиенты.ВыделенныеСтроки.Очистить();
	КонецЕсли;
	
КонецПроцедуры

Запускаем на телефоне – работает!

Причем обратите внимание – можно не только определить свой обработчик долгого тапа, но и установить время задержки перед его срабатываем (второй параметр процедуры ПодключитьОбработчикОжидания).

Ну и чтобы вам два раза не вставать, к этой статье мы прикладываем обработку, в которой реализован простенький обработчик долгого тапа – можно тапнуть по строке и выбрать, что с ней сделать – переместить вверх, вниз, или удалить.

Вывод

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

Пример реализации приведен в обработке, прикрепленной к статье. В описанном алгоритме также можно задать длительность задержки, после которой срабатывает обработчик. Метод одинаково работает на Android и iOS.

Послесловие

Я не удивлюсь, если первым комментарием к этой статье будет фраза “Мсье знает толк...” А что поделаешь – именно так выглядит программирование под мобильную платформу 1С, если хочется выжать из нее немножко больше, чем 100%. Впрочем мы уверены, что оно того стоит, и наше приложение Контейнер – тому пример.

Мы не прощаемся, и в следующей статье расскажем про наши прекрасные диаграммы расходов и платежей. Оставайтесь с нами!

См. также

"Штрихкод-информер" - мобильный ТСД и прайс-чекер в смартфоне

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

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

2880 руб.

03.12.2018    54615    137    102    

161

SALE! 25%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    33278    80    157    

174

"Мобильный ТСД" - инвентаризация и сбор штрихкодов для iOS и Android

Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Платформа 1С v8.3 Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Простой мобильный терминал сбора данных для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    91945    511    186    

293

Магазин 15 - приемка товара по штрихкодам или инвентаризация в торговом зале

Логистика, склад и ТМЦ Мобильная разработка Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

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

12950 руб.

30.05.2023    3388    2    0    

4

Работа с графикой в браузере (SimpleWEB). Векторный редактор

Мобильная разработка WEB-интеграция Мобильная платформа Абонемент ($m)

В SimpleWEB добавились средства для работы с графикой и отслеживание событий мыши, в онлайн редактор https://seditor.ru:1555/ добавился «Векторный редактор» на этом API. Теперь можно нарисовать схемы складов на ПК, сделать карты (*.sug-файлы) для мобильной платформы SimpleUI, выводить данные из 1С в графическом виде. Таким образом, API для работы с векторными файлами теперь есть и в веб- и в мобильной платформе, а также средства для создания и редактирования векторных файлов есть тоже в обеих платформах.

1 стартмани

20.03.2024    1471    0    informa1555    1    

39

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    6856    ROk_dev    56    

37

JavaScript в Simple

Мобильная разработка Бесплатно (free)

В SimpleUI и SimpleWEB, наряду с обработчиками на python и онлайн (1С и т.д.) добавляется интерпретатор JavaScript. В андроид платформе он скорее играет на поле python, т.к. является оффлайновым решением для самостоятельной обработки и расширяет аудиторию разработчиков для разработки самостоятельных решений. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

12.02.2024    1628    informa1555    0    

25
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 05.02.15 15:39
Сообщение было скрыто модератором.
...
2. flyer 231 05.02.15 17:36 Сейчас в теме
хорошо что такие статьи пошли с опытом по моб.платформе. жду еще от вас интересных фишек. может вскоре сделаете слайд влево или вправо. по таблице.
3. DitriX 2091 05.02.15 23:40 Сейчас в теме
(2) тут уже ква :) Ждите новый интерфейс. То что тут описано - это стандартное поведение стационарной 1С, за исключением того, что мобильная эмулирует как бы двойной щелчек мыши.
А слайды уже не отловить, хотя не, вру. Отловить их в принципе реально, но делать это надо не в 1с, а в 1с передавать только событие слайда :)
4. dj_serega 390 06.02.15 12:48 Сейчас в теме
Нужно было такое дело. А времени поэкспериментировать не было.
Спасибо за то что проделали огромную работу :)
5. gigapevt 25 11.02.15 17:36 Сейчас в теме
Спасибо ! Нужная фишка !
6. Широкий 692 16.04.15 10:42 Сейчас в теме
Программную активацию клавиатуры удалось реализовать?
7. vv22 526 17.04.15 11:41 Сейчас в теме
(6) Широкий, нет. Даже в 8.3.6 такой возможности не дают, что очень странно.
8. Seeker 16.05.16 13:17 Сейчас в теме
добрый день,

А как нибудь можно редактировать таблицу значений в списке?
ну т.е. вообще не открывать форму для редактирования строки, а изменять количество сразу в таблице?
9. rhtr 90 28.10.16 12:51 Сейчас в теме
10. rhtr 90 29.10.16 20:47 Сейчас в теме
На 8.3.9 сломали, вылетает приложение при ДолгийТап
11. azhilichev 213 14.09.17 04:48 Сейчас в теме
Мсье знает толк в том, как обходить глупые ограничения платформы :)
12. kasadaga 9 05.08.18 12:05 Сейчас в теме
При выборе ячейки все равно выполняется код как будто это долгий тап, а мне нужно чтобы это был именно выбор ячейки. как сделать?
13. Shaldryn 09.11.18 12:47 Сейчас в теме
Кстати, да, а можно ли настроить табличную часть документа, чтобы при нажатии на строку она просто выделялась, а не открывалась для редактирования, а двойное нажатие открывало бы, такой функционал существует?
DigitalMan; Laretyn; +2 Ответить
14. Laretyn 26.05.20 11:12 Сейчас в теме
(13)
при нажатии на строку она просто выделялась, а не открывалась для редактирования, а двойное нажатие открывало бы

Не нашли ответ на свой вопрос?
16. join2us 15 13.07.20 17:21 Сейчас в теме
(13)
Из документации...
Работа с текущей строкой
Поведение текущей строки в таблице определяется свойством таблицы Использование текущей строки (ИспользованиеТекущейСтроки):

● Значение Выбор. В этом случае свойства ТекущаяСтрока, ТекущийЭлемент, ТекущиеДанные определены только во время выполнения:

● обработчика контекстной команды;

● событий активизации строки или ячейки;

● событий редактирования строки.

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

В списке текущая строка визуально определяется кратковременно, во время нажатия на строку.

Если текущая строка устанавливается из встроенного языка, то установленное значение сохраняется до окончания выполнения метода встроенного языка верхнего уровня (вызванного системой из интерфейса, а не из другого метода встроенного языка).

Данное значение рекомендуется использовать для таблиц, логически не связанных с какими-то другими данными (в том числе и табличными).

● Значение ОтображениеВыделения. В этом случае текущая строка существует всегда, если таблица содержит хотя-бы одну строку.

В списке текущая строка визуально определяется всегда.

Данное значение рекомендуется использовать для таблиц, которые логически связанны с какими-то другими данными (в том числе и табличными).

● Значение ОтображениеВыделенияИВыбор. В этом случае текущая строка существует всегда, если таблица содержит хотя-бы одну строку.

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

● Значение Авто. Данное значение трактуется как значение Выбор и на мобильной платформе и в мобильном клиенте.

Свойство ТекущийРодитель определено в следующих случаях:

● в иерархических списках – всегда;

● при отображении дерева – только в тех случаях, когда определено свойство ТекущаяСтрока.
Показать


т.е., если выбрать режим "ОтображениеВыделенияИВыбор", строка будет выделена и через доп.кнопку можно будет перейти к редактированию.
DigitalMan; +1 Ответить
15. user602678_maxipunchik 95 26.06.20 10:36 Сейчас в теме
С долгим тапом есть один нюанс. Если строка на момент нажатия уже активна, то код не сработает
Оставьте свое сообщение