При работе с мобильной платформой 1С разработчики и пользователи часто сталкиваются с проблемой неудобного ввода данных, особенно числовых значений, непосредственно в поля табличной части формы. Стандартное поведение платформы на мобильных устройствах часто приводит к необходимости совершать несколько лишних действий: нажать на поле, дождаться открытия системной формы редактирования строки или специализированного редактора ввода значения, ввести данные и затем подтвердить ввод. Такой подход замедляет работу и снижает пользовательский комфорт, особенно когда требуется быстрый и массовый ввод.
Рассмотрим, почему возникает эта проблема и как можно реализовать более прямой и быстрый ввод, максимально приближенный к желаемому, несмотря на особенности мобильной платформы 1С.
Прежде чем перейти к решению, выясним причину затруднений с прямым вводом. На мобильной платформе 1С:
НачатьРедактированиеЭлемента: Метод НачатьРедактированиеЭлемента, предназначенный для программной установки фокуса ввода, на мобильной платформе 1С часто работает некорректно или не работает вовсе для элементов, расположенных внутри табличных полей. Он более применим для обычных полей формы, а не для элементов, являющихся частью табличной структуры. Попытки использовать его для непосредственного запуска ввода в ячейке таблицы, как правило, не дают желаемого результата.ВвестиЧисло и ПоказатьВводЧисла: Эти методы могут быть использованы для вызова окна ввода числового значения. Однако, они все равно открывают дополнительное окно, что противоречит изначальному желанию пользователя избежать лишних нажатий и работать непосредственно с формой. Кроме того, ВвестиЧисло может вызывать ошибки, связанные с модальными окнами в определенных режимах, а ПоказатьВводЧисла требует дополнительной обработки завершения ввода через параметр ОписаниеОповещенияОЗавершении.Таким образом, прямое и интуитивно понятное редактирование непосредственно в ячейке таблицы, как это часто реализовано на десктопных версиях 1С, на мобильной платформе затруднено из-за архитектурных особенностей и адаптации под сенсорные экраны.
Поскольку прямые методы ограничены, рассмотрим одно из наиболее распространенных обходных решений, которое позволяет существенно сократить количество кликов и обеспечить более быстрый ввод данных в табличную часть. Это решение, хотя и является своего рода "костылем", широко применяется на практике и доказало свою эффективность.
Идея заключается в том, чтобы при нажатии на строку табличной части (или на конкретную ячейку) программно перехватить событие и вместо стандартного системного редактора вызвать панель ввода чисел для специального, скрытого поля формы. После ввода значения в это скрытое поле, мы перенесем его в нужную строку табличной части.
Прежде всего, нам потребуется создать на форме новый реквизит. Этот реквизит будет выполнять роль "посредника" для ввода чисел.
КоличествоВвод.Этот реквизит не будет использоваться напрямую в логике бизнес-процесса, его единственная задача – служить точкой для вызова числовой панели ввода.
Чтобы обходное решение работало корректно, созданный реквизит КоличествоВвод должен быть размещен на форме как элемент управления. Однако, чтобы он не мешал пользовательскому интерфейсу и не был виден, нам потребуется его максимально "замаскировать".
КоличествоВвод из дерева реквизитов на форму. Желательно разместить его в области, которая либо редко используется, либо вообще не видна пользователю. Опытные разработчики часто размещают такие "технические" поля поверх существующих, но неинтерактивных элементов (например, под полем с номером документа или датой), или в углу формы.КоличествоВвод следующим образом для максимальной незаметности:
Ложь (хотя в некоторых случаях может потребоваться временная установка Истина, о чем мы поговорим ниже).Белый).Белый или цвет фона.ОтображениеЗаголовка = Никогда).1.Цель маскировки – сделать поле невидимым или практически незаметным для пользователя, но при этом оно должно присутствовать на форме как элемент управления, чтобы его можно было программно активировать.
Теперь нам нужно перехватить момент, когда пользователь нажимает на строку табличной части, чтобы вместо стандартного поведения вызвать ввод для нашего скрытого поля.
Выбор (это событие срабатывает при активации строки или выборе элемента в строке). Создайте обработчик этого события, если его еще нет.Выбор в первую очередь отключите стандартную обработку, чтобы система не открывала свою форму редактирования строки:
СтандартнаяОбработка = Ложь;
КоличествоВвод и запустить его редактирование. Это вызовет числовую панель ввода на мобильном устройстве. Также крайне важно зафиксировать идентификатор или индекс текущей строки табличной части, чтобы после ввода числа мы знали, куда его поместить.
// Предполагаем, что у вас есть элемент формы 'МояТаблица'
// и реквизит формы 'ИдентификаторТекущейСтроки' для хранения ссылки
// на данные текущей строки.
Если ЭтаФорма.Элементы.МояТаблица.ТекущиеДанные <> Неопределено Тогда
ЭтаФорма.ИдентификаторТекущейСтроки = ЭтаФорма.Элементы.МояТаблица.ТекущиеДанные.Ссылка;
// Или если табличная часть не имеет ссылочных данных:
// ЭтаФорма.ИндексТекущейСтроки = ЭтаФорма.Элементы.МояТаблица.ТекущаяСтрока;
КонецЕсли;
ЭтаФорма.ТекущийЭлемент = Элементы.КоличествоВвод;
НачатьРедактированиеЭлемента();
Важный момент с видимостью: В некоторых случаях (особенно на старых версиях платформы или специфических устройствах) для того, чтобы НачатьРедактированиеЭлемента() корректно сработало и открыло панель ввода, элемент должен быть видимым в момент вызова. В таком случае, можно применить следующий подход:
// Сохраняем ссылку или индекс текущей строки
Если ЭтаФорма.Элементы.МояТаблица.ТекущиеДанные <> Неопределено Тогда
ЭтаФорма.ИдентификаторТекущейСтроки = ЭтаФорма.Элементы.МояТаблица.ТекущиеДанные.Ссылка;
КонецЕсли;
// Временно делаем поле видимым
Элементы.КоличествоВвод.Видимость = Истина;
ЭтаФорма.ТекущийЭлемент = Элементы.КоличествоВвод;
НачатьРедактированиеЭлемента();
// Сразу после вызова редактирования, можно снова сделать поле невидимым.
// Платформа уже "запомнила", что нужно открыть панель для этого элемента.
Элементы.КоличествоВвод.Видимость = Ложь;
Этот "фокус-костылюс" (как его называют разработчики) позволяет вызвать панель ввода чисел для невидимого поля, а затем снова скрыть его, поддерживая чистоту интерфейса. Однако, всегда проводите тестирование, так как поведение может немного отличаться на разных версиях платформы и устройствах.
После того как пользователь введет число на появившейся панели и нажмет "Готово" (или аналогичную кнопку), значение будет записано в наш реквизит КоличествоВвод. Теперь нам нужно перенести это значение в соответствующую строку табличной части.
КоличествоВвод создайте обработчик события ПриИзменении.Элементы.КоличествоВвод.Значение и присвоит его соответствующему полю в строке табличной части, которую мы зафиксировали на Шаге 3.
// Предполагаем, что у вас есть реквизит формы 'ИдентификаторТекущейСтроки',
// который был заполнен в обработчике 'Выбор' таблицы.
Если ЗначениеЗаполнено(ЭтаФорма.ИдентификаторТекущейСтроки) Тогда
// Находим нужную строку в табличной части
Для Каждого СтрокаТЧ Из Объект.МояТаблица Цикл // 'Объект.МояТаблица' - это ваша табличная часть
Если СтрокаТЧ.Ссылка = ЭтаФорма.ИдентификаторТекущейСтроки Тогда
СтрокаТЧ.Количество = Элементы.КоличествоВвод.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
// Очищаем вспомогательный реквизит, чтобы быть готовыми к следующему вводу
Элементы.КоличествоВвод.Значение = 0; // Или Неопределено, в зависимости от логики
ЭтаФорма.ИдентификаторТекущейСтроки = Неопределено;
// Опционально: можно вернуть фокус на таблицу, если это необходимо
// ЭтаФорма.ТекущийЭлемент = Элементы.МояТаблица;
// Если вы использовали индекс строки
// Если ЭтаФорма.ИндексТекущейСтроки <> Неопределено Тогда
// Объект.МояТаблица[ЭтаФорма.ИндексТекущейСтроки].Количество = Элементы.КоличествоВвод.Значение;
// Элементы.КоличествоВвод.Значение = 0;
// ЭтаФорма.ИндексТекущейСтроки = Неопределено;
// КонецЕсли;
КонецЕсли;
Таким образом, мы добиваемся желаемого эффекта: пользователь нажимает на строку таблицы, сразу появляется цифровая клавиатура (панель ввода чисел), вводит число, и оно без лишних действий записывается в нужную ячейку. Это значительно ускоряет процесс ввода данных.
Данное обходное решение с использованием скрытого поля и программной активации фокуса является одним из наиболее эффективных способов ускорить ввод числовых данных в табличные части на мобильной платформе 1С. Хотя оно и требует некоторой программной реализации и настройки интерфейса, преимущества в скорости и удобстве работы для пользователя могут быть значительными.
При реализации рекомендуем:
Помните, что адаптация интерфейсов под особенности мобильных устройств – это ключ к созданию удобных и эффективных решений на платформе 1С.