Как настроить уникальный порядок перехода между колонками в табличной части на обычных формах?

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

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

Анализируем причину проблемы: конфликт штатных механизмов и кода

Выясним, почему код вида ЭлементыФормы.ИмяТаблицы.ТекущаяКолонка = ЭлементыФормы.ИмяТаблицы.Колонки.ИмяКолонки не всегда отрабатывает корректно. Проблема кроется в цикле событий платформы. Когда пользователь заканчивает редактирование ячейки (например, нажатием клавиши Enter), последовательно запускаются следующие процессы:

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

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

Способ 1. Использование обработчика ожидания (Самый надежный вариант)

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

Разберем по шагам, как это реализовать:

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

Рассмотрим пример кода:


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

Процедура УстановитьФокусНаХарактеристику() Экспорт
    // К этому моменту 1С уже завершила стандартный переход
    // и мы принудительно ставим курсор туда, куда нам нужно
    ЭлементыФормы.Товары.ТекущаяКолонка = ЭлементыФормы.Товары.Колонки.ХарактеристикаНоменклатуры;
КонецПроцедуры

Использование параметра Истина в методе подключения гарантирует, что обработчик выполнится только один раз. Это решение исправляет проблему «перескакивания» фокуса даже при добавлении новых строк.

Способ 2. Управление свойством «Пропускать при вводе»

Рассмотрим альтернативный вариант, который предложил один из участников обсуждения. Если вам нужно, чтобы курсор вообще не попадал в определенные колонки при последовательном нажатии клавиши Enter или Tab, можно воспользоваться стандартным свойством колонки ПропускатьПриВводе.

Проанализируем ситуацию: пользователь может настроить порядок колонок «под себя», перетащив их мышкой. Если при этом программная логика завязана на жесткие индексы, ввод может стать неудобным. Чтобы настроить уникальный путь обхода:

  1. Установите флаг ПропускатьПриВводе (в палитре свойств или программно) для всех колонок, кроме тех, которые участвуют в быстром вводе (например, Номенклатура, Характеристика, Количество).
  2. Платформа будет автоматически перескакивать через «ненужные» поля, следуя визуальному порядку расположения колонок.

Однако помните, что этот метод не позволяет реализовать переход «назад» (к колонке, которая стоит левее текущей), если пользователь изменил визуальный порядок так, что следующая логическая колонка оказалась сзади. В таких случаях поможет только Способ 1.

Способ 3. Работа с событием «ПриОкончанииРедактирования»

Посмотрим на ситуацию с точки зрения событий табличной части. У таблицы есть событие ПриОкончанииРедактирования. Оно срабатывает в момент, когда пользователь пытается покинуть строку или завершить ввод в ячейке.

В некоторых случаях установку ТекущаяКолонка целесообразно делать именно здесь. Важно помнить, что если в таблице включена «Автоматическая фиксация», поведение фокуса может быть более агрессивным. Проанализируем пример использования события:


Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    Если НоваяСтрока Тогда
        // Специальная логика для позиционирования в первой важной колонке новой строки
        ЭлементыФормы.Товары.ТекущаяКолонка = ЭлементыФормы.Товары.Колонки.Артикул;
    КонецЕсли;
КонецПроцедуры

Важные нюансы при работе с новыми строками

Выясним, почему именно в новых строках проблема проявляется острее. Когда строка только создана, она считается «незафиксированной». Платформа 1С стремится провести пользователя по всем обязательным для заполнения полям. Если вы программно переводите фокус, но в строке есть незаполненные реквизиты, помеченные как ПроверкаЗаполнения = ВыдаватьОшибку, система может попытаться вернуть фокус в незаполненное поле.

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

Резюме

Для создания качественного механизма перехода между колонками в 1С на обычных формах рекомендуется комбинировать подходы:

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

← На главную