При интенсивной работе с документами операторы часто сталкиваются с задачей быстрого заполнения колонок. Классический сценарий: в табличную часть уже добавлены строки с номенклатурой, и пользователю необходимо быстро проставить количество сверху вниз. В табличных редакторах вроде Microsoft Excel для этого достаточно ввести число и нажать клавишу со стрелкой вниз. Однако в управляемых формах 1С при попытке нажать клавишу со стрелкой вниз в числовом поле вместо перехода на следующую позицию открывается встроенный калькулятор, либо курсор блокируется в текущей ячейке. Выясним причину такого поведения платформы и разберем проверенные способы оптимизации ввода данных.
Проанализируем механику работы поля ввода в платформе 1С:Предприятие 8.3:
КнопкаВыбора. В платформе 1С нажатие на кнопку выбора у чисел жестко связано с вызовом микрокалькулятора. При этом клавиша Стрелка вниз зарезервирована платформой как горячая клавиша открытия окна выбора (аналог F4). Именно поэтому попытка нажать «вниз» во время набора цифр вызывает окно вычислений.Enter или потерей фокуса), события навигации не передаются таблице.KeyDown или KeyUp), поэтому перехватить нажатие стрелки вниз в момент редактирования текста ячейки штатными средствами невозможно.Чтобы стрелка вниз перестала вызывать калькулятор, достаточно отключить кнопку выбора у колонки. Рассмотрим порядок действий:
КнопкаВыбора и снимем с него флажок (установим значение Ложь).После этой настройки калькулятор перестанет появляться. Однако, как отмечают разработчики, стрелка вниз внутри активной строки все равно не переведет курсор на строку ниже до тех пор, пока значение не зафиксировано. Поэтому для реального ускорения ввода применим альтернативный подход.
Наиболее удобным и эргономичным решением для операторов является ввод с дополнительной цифровой клавиатуры (NumPad). Пользователь набирает количество одной рукой и нажимает Enter. Наша задача — перехватить фиксацию значения, автоматически перевести текущую позицию таблицы на следующую строку в ту же колонку и сразу открыть ячейку для редактирования.
Разберем реализацию этого механизма по шагам:
ПриИзменении и нажмем кнопку с лупой для создания клиентского обработчика.Посмотрим на пример программного кода обработчика:
&НаКлиенте
Процедура ЗапасыКоличествоПриИзменении(Элемент)
ТекущиеДанные = Элементы.Запасы.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Определяем индекс текущей строки в коллекции
ИндексТекущейСтроки = Объект.Запасы.Индекс(ТекущиеДанные);
// Проверяем, есть ли следующая строка в табличной части
Если ИндексТекущейСтроки < Объект.Запасы.Количество() - 1 Тогда
СледующаяСтрока = Объект.Запасы[ИндексТекущейСтроки + 1];
// Переключаем активную строку таблицы
Элементы.Запасы.ТекущаяСтрока = СледующаяСтрока.ПолучитьИдентификатор();
// Фиксируем фокус на нужной колонке
Элементы.Запасы.ТекущаяКолонка = Элементы.ЗапасыКоличество;
// Автоматически открываем ячейку для ввода следующего значения
Элементы.Запасы.ИзменитьСтроку();
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее работу методов, использованных в примере:
Индекс() позволяет точно узнать порядковый номер строки в табличной части Объект.Запасы.ТекущаяСтрока элемента таблицы принимает идентификатор строки, который мы получаем через метод ПолучитьИдентификатор().ТекущаяКолонка гарантирует, что фокус останется именно в колонке ЗапасыКоличество, а не сместится на начало строки.ИзменитьСтроку() переводит новую строку в режим редактирования, избавляя пользователя от необходимости делать двойной клик мыши или нажимать дополнительные клавиши.Если специфика бизнес-процесса требует массового ввода данных без построчного набора, рассмотрим еще два практических варианта:
Ctrl + V. Платформа последовательно заполнит ячейки вниз по списку.Enter, а затем Стрелка вниз. Это позволит обойти платформенное ограничение без доработки конфигурации.