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

17.04.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка долгого нажатия
.epf 6,81Kb
12
12 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

Проблема

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

 

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

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

Решение

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывод

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

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

Послесловие

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

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

См. также

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

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

13200 руб.

27.12.2021    38198    108    161    

201

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

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

3000 руб.

03.12.2018    59291    192    103    

172

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

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

2000 руб.

22.04.2019    97226    586    189    

321

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

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

3450 руб.

28.04.2023    9470    15    0    

9

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Финансовые услуги, инвестиции Управленческий учет Платные (руб)

Мобильное приложение и конфигурация 1С для автоматической торговли на бирже через API Тинькофф банка. Достаточно задать настройки, нажать «Пуск», и робот сам торгует ежедневно.

7000 руб.

25.05.2022    4644    1    0    

6

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

Экспериментальный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между устройствами Simple и между Simple и бек-системами (например 1С). По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок для поддержки стабильного постоянного соединения, докачки больших файлов и работе в фоне. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

23.08.2024    1217    6    informa1555    1    

13

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

В этом релизе собрано много нового из области интерфейса, связи, хранения и важные новые способы управления. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

25.06.2024    2607    29    informa1555    0    

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

А как нибудь можно редактировать таблицу значений в списке?
ну т.е. вообще не открывать форму для редактирования строки, а изменять количество сразу в таблице?
9. rhtr 92 28.10.16 12:51 Сейчас в теме
10. rhtr 92 29.10.16 20:47 Сейчас в теме
На 8.3.9 сломали, вылетает приложение при ДолгийТап
11. azhilichev 214 14.09.17 04:48 Сейчас в теме
Мсье знает толк в том, как обходить глупые ограничения платформы :)
12. kasadaga 8 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 18 13.07.20 17:21 Сейчас в теме
(13)
Из документации...
Работа с текущей строкой
Поведение текущей строки в таблице определяется свойством таблицы Использование текущей строки (ИспользованиеТекущейСтроки):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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