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

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

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

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

Причины проблемы и ограничения платформы

Выясним, почему стандартные настройки формы 1С не всегда работают так, как ожидает разработчик:

  1. Ограничение свойства «ПропускатьПриВводе»: В обычных формах свойство ПропускатьПриВводе из встроенного языка доступно только для чтения. Его нельзя менять программно во время выполнения кода — оно задается в конфигураторе. Кроме того, эта настройка отрабатывает только при последовательном переходе по клавише Enter и не предотвращает выбор ячейки мышью.
  2. Переход фокуса на кнопки формы: Когда строки табличной части уже созданы заранее, платформа при заполнении последней видимой ячейки считает редактирование текущей строки завершенным. Поскольку новая строка автоматически не добавляется, стандартный механизм обхода элементов передает фокус следующему по порядку элементу на форме — обычно это кнопки командной панели.

Способ 1. Отключение доступности или установка режима просмотра

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

Вариант А: Отключение доступности колонки

Если для колонки установить свойство Доступность = Ложь, платформа полностью исключит её из порядка обхода. Фокус будет переходить только по тем колонкам, где редактирование разрешено.


ЭлементыФормы.ТабличнаяЧасть.Колонки.Номенклатура.Доступность = Ложь;
ЭлементыФормы.ТабличнаяЧасть.Колонки.Цена.Доступность = Ложь;

Вариант Б: Использование свойства «ТолькоПросмотр»

Снятие доступности делает текст в ячейках блеклым (серым). Если важно сохранить высокую контрастность текста и возможность выделения или копирования данных пользователем, рекомендуется использовать свойство ТолькоПросмотр = Истина. При таком подходе платформа также автоматически пропускает ячейки при навигации клавишами.

ЭлементыФормы.ТабличнаяЧасть.Колонки.Номенклатура.ТолькоПросмотр = Истина;

Способ 2. Программный переход на новую строку средствами 1С

Чтобы после заполнения последней колонки фокус не уходил на кнопки формы, а переходил на следующую строку табличной части, проанализируем обработку события ПриИзменении для редактируемой колонки.

Для безопасной смены текущей строки и колонки рекомендуется использовать обработчик ожидания. Прямая смена текущей строки внутри процедуры ПриИзменении может сбрасываться платформой, так как 1С завершает стандартный цикл ввода ячейки. Вызов процедуры с минимальной задержкой позволяет сменить строку уже после того, как платформа завершит обработку текущего события.

Разберем код модуля формы:


Процедура ТабличнаяЧастьКоличествоПриИзменении(Элемент)
    // Подключаем однократный обработчик ожидания с минимальным интервалом
    ПодключитьОбработчикОжидания("ПерейтиНаСледующуюСтроку", 0.1, Истина);
КонецПроцедуры

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

Метод ИзменитьСтроку() позволяет сразу перевести активную ячейку в режим ввода текста, чтобы оператору не приходилось повторно нажимать Enter или делать двойной клик мышью.

Способ 3. Переход между строками с помощью WScript.Shell (SendKeys)

На форумах часто встречается решение с эмуляцией нажатия клавиш через COM-объект WScript.Shell. Посмотрим, как выглядит данный код:


Перем WSHShell;

Процедура ТабличнаяЧастьКоличествоПриИзменении(Элемент)
    WSHShell.SendKeys("{ENTER}");
    
    Индекс = ЭлементыФормы.ТабличнаяЧасть.ТекущаяСтрока.НомерСтроки;
    Если Индекс < ТабличнаяЧасть.Количество() Тогда
        ЭлементыФормы.ТабличнаяЧасть.ТекущаяСтрока = ТабличнаяЧасть[Индекс];
        ЭлементыФормы.ТабличнаяЧасть.ТекущаяКолонка = ЭлементыФормы.ТабличнаяЧасть.Колонки.Количество;
    КонецЕсли;
КонецПроцедуры

WSHShell = Новый COMОбъект("WScript.Shell");

Или еще более простой вариант симуляции нажатий клавиш «Вниз» и «Enter»:


Процедура ТабличнаяЧастьКоличествоПриИзменении(Элемент)
    WSHShell.SendKeys("{DOWN}");
    WSHShell.SendKeys("{ENTER}");
КонецПроцедуры

Важное предупреждение о рисках эмуляции нажатий:

Использование WScript.Shell и метода SendKeys имеет существенные недостатки, о которых необходимо знать:

  1. Перехват фокуса сторонними приложениями: Симулированные нажатия отправляются на уровень операционной системы, а не строго в окно 1С. Если во время работы с документами у пользователя открыт мессенджер или всплывает уведомление сторонней программы, фокус может неожиданно переключиться на нее.
  2. Ограничения платформы и ОС: Данный метод работает только в ОС Windows и недоступен при работе под Linux или в веб-клиенте.
  3. Безопасность: В ряде организаций вызов COM-объектов запрещен настройками безопасности или антивирусным ПО.

Для создания стабильных конфигураций рекомендуется отдавать предпочтение штатным методам платформы (Способы 1 и 2).

← На главную