При интенсивном вводе документов пользователями часто возникает задача оптимизировать навигацию по табличной части. Если строки документа создаются программно и уже содержат частичные данные, оператору требуется заполнять только определенные незаполненные колонки. При этом нажатие клавиш Tab или Enter должно переводить курсор строго в нужные ячейки, пропуская готовые данные, а в конце строки — автоматически переходить на новую строку.
В обычных формах платформы 1С разработчики часто сталкиваются с ситуацией, когда стандартное свойство колонки ПропускатьПриВводе не срабатывает, а при заполнении последней колонки фокус перескакивает на нижние кнопки формы. Рассмотрим причины такого поведения и разберем способы решения этой задачи.
Выясним, почему стандартные настройки формы 1С не всегда работают так, как ожидает разработчик:
ПропускатьПриВводе из встроенного языка доступно только для чтения. Его нельзя менять программно во время выполнения кода — оно задается в конфигураторе. Кроме того, эта настройка отрабатывает только при последовательном переходе по клавише Enter и не предотвращает выбор ячейки мышью.Самый простой и эффективный способ заставить платформу пропускать колонки при вводе — ограничить возможности их редактирования для пользователя.
Вариант А: Отключение доступности колонки
Если для колонки установить свойство Доступность = Ложь, платформа полностью исключит её из порядка обхода. Фокус будет переходить только по тем колонкам, где редактирование разрешено.
ЭлементыФормы.ТабличнаяЧасть.Колонки.Номенклатура.Доступность = Ложь;
ЭлементыФормы.ТабличнаяЧасть.Колонки.Цена.Доступность = Ложь;
Вариант Б: Использование свойства «ТолькоПросмотр»
Снятие доступности делает текст в ячейках блеклым (серым). Если важно сохранить высокую контрастность текста и возможность выделения или копирования данных пользователем, рекомендуется использовать свойство ТолькоПросмотр = Истина. При таком подходе платформа также автоматически пропускает ячейки при навигации клавишами.
ЭлементыФормы.ТабличнаяЧасть.Колонки.Номенклатура.ТолькоПросмотр = Истина;
Чтобы после заполнения последней колонки фокус не уходил на кнопки формы, а переходил на следующую строку табличной части, проанализируем обработку события ПриИзменении для редактируемой колонки.
Для безопасной смены текущей строки и колонки рекомендуется использовать обработчик ожидания. Прямая смена текущей строки внутри процедуры ПриИзменении может сбрасываться платформой, так как 1С завершает стандартный цикл ввода ячейки. Вызов процедуры с минимальной задержкой позволяет сменить строку уже после того, как платформа завершит обработку текущего события.
Разберем код модуля формы:
Процедура ТабличнаяЧастьКоличествоПриИзменении(Элемент)
// Подключаем однократный обработчик ожидания с минимальным интервалом
ПодключитьОбработчикОжидания("ПерейтиНаСледующуюСтроку", 0.1, Истина);
КонецПроцедуры
Процедура ПерейтиНаСледующуюСтроку() Экспорт
Индекс = ТабличнаяЧасть.Индекс(ЭлементыФормы.ТабличнаяЧасть.ТекущиеДанные);
Если Индекс < ТабличнаяЧасть.Количество() - 1 Тогда
// Переходим на следующую строку
ЭлементыФормы.ТабличнаяЧасть.ТекущаяСтрока = ТабличнаяЧасть[Индекс + 1];
// Устанавливаем фокус на нужную колонку
ЭлементыФормы.ТабличнаяЧасть.ТекущаяКолонка = ЭлементыФормы.ТабличнаяЧасть.Колонки.Количество;
// Активируем режим редактирования ячейки
ЭлементыФормы.ТабличнаяЧасть.ИзменитьСтроку();
КонецЕсли;
КонецПроцедуры
Метод ИзменитьСтроку() позволяет сразу перевести активную ячейку в режим ввода текста, чтобы оператору не приходилось повторно нажимать Enter или делать двойной клик мышью.
На форумах часто встречается решение с эмуляцией нажатия клавиш через COM-объект WScript.Shell. Посмотрим, как выглядит данный код:
Перем WSHShell;
Процедура ТабличнаяЧастьКоличествоПриИзменении(Элемент)
WSHShell.SendKeys("{ENTER}");
Индекс = ЭлементыФормы.ТабличнаяЧасть.ТекущаяСтрока.НомерСтроки;
Если Индекс < ТабличнаяЧасть.Количество() Тогда
ЭлементыФормы.ТабличнаяЧасть.ТекущаяСтрока = ТабличнаяЧасть[Индекс];
ЭлементыФормы.ТабличнаяЧасть.ТекущаяКолонка = ЭлементыФормы.ТабличнаяЧасть.Колонки.Количество;
КонецЕсли;
КонецПроцедуры
WSHShell = Новый COMОбъект("WScript.Shell");
Или еще более простой вариант симуляции нажатий клавиш «Вниз» и «Enter»:
Процедура ТабличнаяЧастьКоличествоПриИзменении(Элемент)
WSHShell.SendKeys("{DOWN}");
WSHShell.SendKeys("{ENTER}");
КонецПроцедуры
Важное предупреждение о рисках эмуляции нажатий:
Использование WScript.Shell и метода SendKeys имеет существенные недостатки, о которых необходимо знать:
Для создания стабильных конфигураций рекомендуется отдавать предпочтение штатным методам платформы (Способы 1 и 2).