Как в табличной части 1С переходить на следующую строку без лишних нажатий клавиш?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

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

Почему стрелка вниз открывает калькулятор и не переключает строку

Проанализируем механику работы поля ввода в платформе 1С:Предприятие 8.3:

  1. Специфика числовых реквизитов: для элементов формы с числовым типом данных по умолчанию активно свойство КнопкаВыбора. В платформе 1С нажатие на кнопку выбора у чисел жестко связано с вызовом микрокалькулятора. При этом клавиша Стрелка вниз зарезервирована платформой как горячая клавиша открытия окна выбора (аналог F4). Именно поэтому попытка нажать «вниз» во время набора цифр вызывает окно вычислений.
  2. Изоляция активного редактора: когда пользователь активирует ячейку и начинает ввод, фокус захватывается внутренним элементом редактирования. Пока редактирование не завершено фиксацией значения (например, клавишей Enter или потерей фокуса), события навигации не передаются таблице.
  3. Отсутствие низкоуровневых событий: на управляемых формах разработчик не имеет прямого доступа к низкоуровневым событиям клавиатуры (таким как KeyDown или KeyUp), поэтому перехватить нажатие стрелки вниз в момент редактирования текста ячейки штатными средствами невозможно.

Шаг 1. Отключение вызова микрокалькулятора

Чтобы стрелка вниз перестала вызывать калькулятор, достаточно отключить кнопку выбора у колонки. Рассмотрим порядок действий:

  1. Откроем форму документа в конфигураторе.
  2. Перейдем к дереву элементов формы и найдем элемент колонки Количество в нужной табличной части.
  3. В палитре свойств элемента найдем свойство КнопкаВыбора и снимем с него флажок (установим значение Ложь).

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

Шаг 2. Реализация автоперехода на следующую строку по нажатию Enter

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

Разберем реализацию этого механизма по шагам:

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

Посмотрим на пример программного кода обработчика:


&НаКлиенте
Процедура ЗапасыКоличествоПриИзменении(Элемент)

	ТекущиеДанные = Элементы.Запасы.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Определяем индекс текущей строки в коллекции
	ИндексТекущейСтроки = Объект.Запасы.Индекс(ТекущиеДанные);
	
	// Проверяем, есть ли следующая строка в табличной части
	Если ИндексТекущейСтроки < Объект.Запасы.Количество() - 1 Тогда
		
		СледующаяСтрока = Объект.Запасы[ИндексТекущейСтроки + 1];
		
		// Переключаем активную строку таблицы
		Элементы.Запасы.ТекущаяСтрока = СледующаяСтрока.ПолучитьИдентификатор();
		
		// Фиксируем фокус на нужной колонке
		Элементы.Запасы.ТекущаяКолонка = Элементы.ЗапасыКоличество;
		
		// Автоматически открываем ячейку для ввода следующего значения
		Элементы.Запасы.ИзменитьСтроку();
		
	КонецЕсли;

КонецПроцедуры

Рассмотрим подробнее работу методов, использованных в примере:

  1. Метод коллекции Индекс() позволяет точно узнать порядковый номер строки в табличной части Объект.Запасы.
  2. Свойство ТекущаяСтрока элемента таблицы принимает идентификатор строки, который мы получаем через метод ПолучитьИдентификатор().
  3. Свойство ТекущаяКолонка гарантирует, что фокус останется именно в колонке ЗапасыКоличество, а не сместится на начало строки.
  4. Метод таблицы ИзменитьСтроку() переводит новую строку в режим редактирования, избавляя пользователя от необходимости делать двойной клик мыши или нажимать дополнительные клавиши.

Альтернативные способы быстрого заполнения

Если специфика бизнес-процесса требует массового ввода данных без построчного набора, рассмотрим еще два практических варианта:

  1. Вставка данных через буфер обмена: платформа 1С штатно поддерживает пакетную вставку значений. Если количества уже сведены в Excel или блокноте, оператор может скопировать столбец чисел, выделить в таблице 1С верхнюю ячейку колонки «Количество» и нажать сочетание Ctrl + V. Платформа последовательно заполнит ячейки вниз по списку.
  2. Использование внешних утилит переназначения клавиш: если рабочие места операторов строго специализированы, на уровне операционной системы можно настроить программное переназначение клавиш (маппинг), чтобы клавиша со стрелкой вниз на клавиатуре передавала последовательность кодов Enter, а затем Стрелка вниз. Это позволит обойти платформенное ограничение без доработки конфигурации.
← На главную