При разработке интерфейсов в 1С:Предприятие 8.3 часто возникает задача максимально ускорить работу оператора. Типичный сценарий: пользователь выбирает значение в одной колонке, система автоматически рассчитывает данные в других, и фокус должен мгновенно переместиться в ту ячейку, которую пользователю необходимо заполнить вручную. В этой статье мы подробно разберем, как реализовать такой переход, чтобы ячейка была не просто подсвечена, а сразу готова к вводу значения без лишних кликов мышью.
Для начала разберем основную ошибку начинающих разработчиков. Часто пытаются использовать свойство ТекущаяКолонка самой таблицы, передавая туда имя реквизита. Однако в управляемых формах работа идет с элементами формы, а не напрямую с данными. Проанализируем правильный синтаксис установки фокуса:
Чтобы переместить курсор в нужную колонку, необходимо обратиться к свойству ТекущийЭлемент таблицы и присвоить ему конкретный элемент формы, который соответствует этой колонке.
Пример правильного обращения:
// ТабличнаяЧасть1 — это имя таблицы на форме
// ТабличнаяЧасть1ПоказаниеСчетчика — это имя элемента (ПоляВвода) в этой таблице
Элементы.ТабличнаяЧасть1.ТекущийЭлемент = Элементы.ТабличнаяЧасть1ПоказаниеСчетчика;
Важно помнить: имя элемента колонки на форме часто формируется платформой автоматически как комбинация ИмяТаблицы + ИмяРеквизита. Проверьте точное имя в свойствах элемента управления на закладке "Элементы" в конфигураторе.
Просто переместить фокус недостаточно, если мы хотим, чтобы оператор сразу начал набирать цифры. По умолчанию ячейка может выделиться рамкой, но требовать нажатия Enter или двойного клика для начала редактирования. Выясним, как этого избежать.
Рассмотрим два способа настройки автоматической активации:
ИзменитьСтроку().Посмотрим на примере, как это выглядит в обработчике события ПриИзменении:
&НаКлиенте
Процедура ТабличнаяЧасть1АдресПриИзменении(Элемент)
СтрокаТЧ = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
// Выполняем расчеты
Если СтрокаТЧ.ТипАбонента = ПредопределенноеЗначение("Перечисление.ТипыАбонентов.ЧастноеЛицо") Тогда
СтрокаТЧ.Тариф = 100;
// Устанавливаем фокус на колонку с показаниями
Элементы.ТабличнаяЧасть1.ТекущийЭлемент = Элементы.ТабличнаяЧасть1ПоказаниеСчетчика;
// Принудительно включаем режим редактирования строки
Элементы.ТабличнаяЧасть1.ИзменитьСтроку();
КонецЕсли;
КонецПроцедуры
Иногда программисты сталкиваются с тем, что код написан верно, но фокус все равно перескакивает в следующую колонку или остается на месте. Проанализируем причину: это происходит потому, что после выполнения вашего кода ПриИзменении платформа выполняет свои стандартные действия по обходу элементов управления. Стандартный порядок обхода может "перебить" ваш программный перенос фокуса.
В таких случаях рекомендуется использовать "отложенный" вызов через обработчик ожидания. Разберем по шагам, как это реализовать:
&НаКлиенте
Процедура ТабличнаяЧасть1ЛокацияПриИзменении(Элемент)
// ... ваш код расчетов ...
// Если нужно передать фокус, делаем это через небольшую паузу
ПодключитьОбработчикОжидания("УстановитьФокусНаПоказания", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФокусНаПоказания()
Элементы.ТабличнаяЧасть1.ТекущийЭлемент = Элементы.ТабличнаяЧасть1Qов;
Элементы.ТабличнаяЧасть1.ИзменитьСтроку();
КонецПроцедуры
Для ускорения работы оператора, когда в таблице много колонок, а заполнять нужно лишь некоторые, полезно использовать свойство ПропускатьПриВводе. Если для колонок, которые рассчитываются автоматически, установить этот флаг в истину, то при нажатии клавиши Tab или Enter курсор будет автоматически перепрыгивать через эти поля, останавливаясь только там, где требуется ручное участие.
Резюмируем ключевые моменты для реализации быстрого ввода:
Элементы.ИмяТаблицы.ТекущийЭлемент для указания конкретного поля ввода.ТекущаяСтрока, если фокус передается программно при создании новых записей.ПодключитьОбработчикОжидания.Такой комплексный подход позволяет сократить время обработки одного документа в несколько раз, что критически важно для высоконагруженных участков учета, таких как расчеты с абонентами или розничные продажи.