Разработчики, создающие решения для мобильной платформы 1С, часто сталкиваются с проблемой избыточности интерфейса. Стандартный сценарий ввода числовых данных (например, количества товара) в мобильной табличной части выглядит довольно громоздко. Пользователю приходится совершать несколько кликов: сначала активировать строку, затем нажимать на поле ввода, после чего открывается промежуточное окно редактирования, и только потом появляется системный калькулятор или клавиатура. Если ежедневно требуется вводить по 100 и более строк (например, при проведении инвентаризации на складе или оформлении заказов торговым представителем), этот процесс начинает отнимать слишком много времени и вызывать раздражение у пользователей.
В этой статье мы подробно разберем, как оптимизировать юзабилити мобильного приложения, избавиться от лишних промежуточных окон и вызывать калькулятор ввода количества мгновенно при клике на строку табличной части. Мы проанализируем различные подходы — от обходных маневров с временными реквизитами до изящных современных асинхронных методов платформы.
Рассмотрим первый практический способ, который позволяет обойти стандартный многошаговый ввод платформы. Суть метода заключается в программном перенаправлении фокуса на отдельный скрытый реквизит формы при выборе строки в табличной части.
Пошаговый алгоритм реализации метода:
Количество (тип данных — Число, длина 5, точность 0 или 3 в зависимости от ваших потребностей).Ложь, чтобы он изначально не загромождал экран.Выбор у нашей табличной части (например, ТЧ Товары).Посмотрим на пример реализации кода для модуля формы:
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отключаем стандартный переход платформы к редактированию строки
СтандартнаяОбработка = Ложь;
// Делаем временный реквизит видимым
ЭтаФорма.Элементы.Количество.Видимость = Истина;
// Передаем фокус ввода на этот элемент
ЭтаФорма.ТекущийЭлемент = ЭтаФорма.Элементы.Количество;
// Инициируем вызов клавиатуры/калькулятора на мобильном устройстве
#Если МобильноеПриложениеКлиент Тогда
ЭтаФорма.НачатьРедактированиеЭлемента();
#КонецЕсли
КонецПроцедуры
После того как пользователь введет число в появившемся калькуляторе и нажмет кнопку «Готово», нам нужно перенести это значение обратно в строку табличной части и снова скрыть временное поле. Для этого используем обработчик события ОбработкаВыбора у нашего реквизита Количество:
&НаКлиенте
Процедура КоличествоОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Переносим введенное значение в текущую строку нашей ТЧ
ТекущиеДанные = ЭтаФорма.Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ТекущиеДанные.Количество = ВыбранноеЗначение;
КонецЕсли;
// Скрываем временный реквизит ввода назад в невидимку
ЭтаФорма.Элементы.Количество.Видимость = Ложь;
КонецПроцедуры
При таком подходе пользователь кликает по строке с товаром и сразу видит желтый системный калькулятор 1С. После ввода числа калькулятор закрывается, а данные моментально сохраняются в табличной части.
Несмотря на свою простоту, данный метод имеет существенный недостаток. Если пользователь передумает вводить число, нажмет кнопку «Назад» на мобильном устройстве, выберет «Отмена» на клавиатуре или просто сотрет значение в ноль, стандартные события изменения и обработки выбора элемента Количество могут не сработать. Мобильная операционная система просто свернет клавиатуру, а элемент формы Количество так и останется висеть в состоянии Видимость = Истина, перекрывая важные части интерфейса. Попытки отловить это поведение через события активации других полей не всегда приносят стабильный результат из-за специфики работы фокуса в мобильной платформе 1С.
Ниже мы рассмотрим гораздо более надежные и профессиональные подходы, которые лишены этой проблемы.
Для того чтобы гарантированно получать отклик от интерфейса как при успешном вводе, так и при отмене операции, в платформе 1С реализованы специальные асинхронные методы. Метод ПоказатьВводЧисла напрямую вызывает системный числовой калькулятор. При этом, если пользователь нажимает кнопку «Отмена», платформа все равно возвращает управление в код, передавая в качестве результата значение Неопределено.
Рассмотрим, как реализовать этот подход на практике:
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Блокируем стандартное открытие строки ТЧ
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Подготавливаем структуру для сохранения контекста строки ТЧ в обработчик оповещения
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ТекущаяСтрока", ТекущиеДанные);
// Создаем описание оповещения, которое сработает после закрытия калькулятора
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаКоличества", ЭтотОбъект, ДополнительныеПараметры);
// Вызываем напрямую системный калькулятор без промежуточных окон
ПоказатьВводЧисла(ОписаниеОповещения, ТекущиеДанные.Количество, "Введите количество:", 10, 3);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаКоличества(ПолученноеЧисло, ДополнительныеПараметры) Экспорт
// Если пользователь закрыл калькулятор кнопкой "Отмена"
Если ПолученноеЧисло = Неопределено Тогда
// Здесь мы можем обработать отмену, например, вывести сообщение или просто выйти из процедуры
Возврат;
КонецЕсли;
// Ввод выполнен успешно (включая ввод нуля)
СтрокаТаблицы = ДополнительныеПараметры.ТекущаяСтрока;
СтрокаТаблицы.Количество = ПолученноеЧисло;
// При необходимости вызываем пересчет сумм или скидок для строки ТЧ
// РассчитатьСуммуСтроки(СтрокаТаблицы);
КонецПроцедуры
Этот способ является крайне надежным, так как полностью опирается на штатные механизмы платформы 1С для работы с мобильными операционными системами и не требует создания «костыльных» невидимых элементов на форме.
Если вы ведете разработку на современных версиях платформы 1С (начиная с версии 8.3.18), вы можете избавиться от необходимости создавать громоздкие отдельные процедуры для обработки оповещений. Конструкция Асинх / Ждать позволяет писать код линейно и последовательно, что значительно улучшает его читаемость и упрощает последующую поддержку.
Проанализируем пример реализации с использованием метода ВвестиЧислоАсинх:
&НаКлиенте
Асинх Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Код приостанавливает выполнение на время работы калькулятора, интерфейс при этом не зависает
РезультатВвода = Ждать ВвестиЧислоАсинх(ТекущиеДанные.Количество, "Введите количество товара:", 10, 3);
// Проверяем результат выполнения операции
Если РезультатВвода <> Неопределено Тогда
// Число успешно введено или отредактировано
ТекущиеДанные.Количество = РезультатВвода;
// Выполняем сопутствующие расчеты в этой же процедуре
Иначе
// Отрабатываем сценарий, когда пользователь нажал "Отмена"
// Никаких дополнительных действий по скрытию элементов производить не нужно
КонецЕсли;
КонецПроцедуры
Использование ВвестиЧислоАсинх — это наиболее передовой и чистый с точки зрения архитектуры способ быстрого ввода данных в мобильных приложениях на платформе 1С.
Если специфика вашего проекта все же требует использования Варианта 1 (с временным реквизитом на форме) и вы столкнулись с тем, что калькулятор на мобильном устройстве открывается нестабильно или «залипает», воспользуйтесь проверенным лайфхаком мобильных разработчиков 1С.
Мобильная платформа иногда теряет фокус, если свойство видимости элемента меняется непосредственно перед его программной активацией. Операционная система устройства (особенно Android) физически не успевает перерисовать интерфейс до вызова метода НачатьРедактированиеЭлемента. Чтобы исправить этот баг-фикс, примените быстрое «передергивание» видимости:
// Принудительно сбрасываем состояние видимости для обновления кэша отрисовки ОС
ЭтаФорма.Элементы.Количество.Видимость = Ложь;
ЭтаФорма.Элементы.Количество.Видимость = Истина;
// Явно переназначаем текущий активный элемент формы
ЭтаФорма.ТекущийЭлемент = ЭтаФорма.Элементы.Количество;
// Запускаем редактирование
#Если МобильноеПриложениеКлиент Или МобильныйКлиент Тогда
ЭтаФорма.НачатьРедактированиеЭлемента();
#КонецЕсли
Этот простой прием заставляет операционную систему смартфона или ТСД гарантированно инициализировать поле ввода и мгновенно выводить виртуальную клавиатуру калькулятора на экран в 100% случаев.