В типовых конфигурациях 1С на обычных формах (например, в УПП или УТ 10.3) поведение клавиши Enter в табличных частях часто вызывает вопросы у пользователей. По умолчанию нажатие Enter завершает редактирование строки или ячейки. Однако для ускорения ввода данных, например, при заполнении цен и количества, пользователям гораздо удобнее, чтобы система вела себя как в Excel или при использовании клавиши Tab: переводила фокус в соседнюю ячейку. Рассмотрим подробнее, как реализовать такой функционал программными средствами.
Это один из самых стабильных и рекомендуемых способов для обычных форм. Основная сложность заключается в том, что в момент изменения значения в ячейке (событие ПриИзменении) платформа еще занята обработкой данных текущей ячейки, и попытка немедленно передать фокус в другую колонку может быть проигнорирована или привести к ошибкам отрисовки интерфейса.
Проанализируем ситуацию: нам нужно дождаться завершения стандартных процедур платформы и только потом программно перекинуть курсор. Для этого идеально подходит метод ПодключитьОбработчикОжидания с минимальным интервалом.
Разберем реализацию по шагам. Допустим, нам нужно перейти из колонки Цена в колонку Количество:
// В модуле формы документа
Процедура ТоварыЦенаПриИзменении(Элемент)
// Условие: подключаем обработчик на 0.1 секунды, чтобы дать платформе закончить текущее действие
ПодключитьОбработчикОжидания("ВыполнитьПереходНаКоличество", 0.1, Истина);
КонецПроцедуры
Процедура ВыполнитьПереходНаКоличество()
// Устанавливаем нужную колонку в табличном поле
ЭлементыФормы.Товары.ТекущаяКолонка = ЭлементыФормы.Товары.Колонки.Количество;
// Важный момент: чтобы ячейка сразу открылась для ввода, вызываем метод ИзменитьСтроку()
ЭлементыФормы.Товары.ИзменитьСтроку();
КонецПроцедуры
В данном примере метод ИзменитьСтроку() принудительно переводит ячейку в режим редактирования, что избавляет пользователя от необходимости лишний раз нажимать клавиши или использовать мышь.
Если вы хотите, чтобы переход происходил максимально естественно, "как по Табу", можно воспользоваться возможностями операционной системы Windows для имитации нажатия клавиш. Это позволит не завязываться на конкретные имена колонок, а просто имитировать переход к следующему элементу в порядке обхода.
Выясним, как это работает. Мы создаем COM-объект WScript.Shell и отправляем команду нажатия клавиши Tab. Рассмотрим пример кода:
Процедура ТоварыЦенаПриИзменении(Элемент)
Попытка
ОбъектWsh = Новый COMОбъект("WScript.Shell");
// Имитируем нажатие клавиши Tab
ОбъектWsh.SendKeys("{TAB}");
Исключение
// В случае ошибки (например, ограничения прав) ничего не делаем
КонецПопытки;
КонецПроцедуры
Преимущества: этот способ универсален и не требует написания отдельных процедур для каждой колонки. Недостатки: зависимость от внешнего компонента Windows и возможные нюансы работы в терминальных сессиях (RDP).
Существует специфический способ, позволяющий переопределить действие клавиши Enter для всей формы или конкретной командной панели. Для этого используется скрытая кнопка с назначенным сочетанием клавиш.
Посмотрим на пример реализации через "быстрый вызов":
// Функция для формирования внутреннего представления кода клавиши
Функция ПолучитьКодКлавишиEnter()
// Недокументированная возможность формирования структуры клавиши
Возврат ЗначениеИзСтрокиВнутр("{""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1,{0,13,0}}");
КонецФункции
Процедура ПриОткрытии()
// Назначаем кнопке командной панели сочетание клавиш Enter
ЭлементыФормы.ОсновныеДействияФормы.Кнопки.КнопкаПерехода.СочетаниеКлавиш = ПолучитьКодКлавишиEnter();
КонецПроцедуры
Процедура ОсновныеДействияФормыКнопкаПерехода(Кнопка)
// Здесь описываем логику: если текущая колонка "Цена", переходим на "Количество"
Если ЭлементыФормы.Товары.ТекущаяКолонка = ЭлементыФормы.Товары.Колонки.Цена Тогда
ЭлементыФормы.Товары.ТекущаяКолонка = ЭлементыФормы.Товары.Колонки.Количество;
ЭлементыФормы.Товары.ИзменитьСтроку();
КонецЕсли;
КонецПроцедуры
Внимание: данный метод следует использовать с осторожностью. Перехват клавиши 13 (Enter) может блокировать стандартное поведение кнопок "ОК" и "Записать". Используйте его только в том случае, если другие методы не подходят.
Иногда задача решается без программирования, если пользователям нужно такое поведение во всей системе. В платформе 1С:Предприятие 8 предусмотрена настройка, меняющая логику работы клавиши Enter.
Рассмотрим, где она находится:
Если установить этот флаг, то во всех формах нажатие Enter будет аналогично нажатию Tab. Но помните, что это повлияет на работу всех документов и справочников для данного пользователя, что не всегда удобно.
Хотя исходный вопрос касался обычных форм, полезно знать, как эта задача решается в современном интерфейсе Такси. В управляемых формах для элемента типа "Таблица" существует стандартное свойство "Переходить по Enter" (EnterMovesToNextField).
Проанализируем его работу: если установить это свойство в значение Да, платформа сама будет переводить фокус на следующую ячейку без написания кода. Если же требуется сложная логика (например, перепрыгнуть через одну колонку), используется свойство ТекущийЭлемент формы в событии ПриИзменении, но также часто в связке с обработчиком ожидания для корректного завершения транзакции изменения данных.
При реализации программного перехода обратите внимание на следующие моменты:
ПриИзменении, переход сработает только если пользователь действительно поменял цену. Если же он просто нажал Enter на старом значении, фокус останется на месте. Для гарантированного перехода лучше использовать событие ПриОкончанииРедактирования табличного поля.ТекущиеДанные не равны Неопределено, чтобы избежать ошибок при пустой таблице.ОбработкаВыбора табличного поля.Таким образом, самым гибким и надежным способом для УПП и других конфигураций на обычных формах остается комбинация обработчика ожидания и метода ИзменитьСтроку(). Это позволяет сохранить стабильность системы и обеспечить комфортную работу пользователя.