Как настроить фокус на нужное поле при добавлении строки в табличную часть 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке интерфейсов в 1С:Предприятие 8 часто возникает задача повышения удобства ввода данных (UX). Типичный сценарий: пользователь нажимает кнопку Добавить в табличной части, и система автоматически переводит курсор в первую колонку или в поле, которое платформа считает приоритетным. Однако бизнес-процесс может требовать, чтобы ввод начинался, например, с даты или конкретной номенклатуры, а не с количества. Рассмотрим, как программно и интерактивно управлять фокусом при создании новой строки.

Способ 1. Программная установка фокуса через событие «ПриНачалеРедактирования»

Проанализируем ситуацию: стандартная кнопка «Добавить» — это системная команда, встроенная в элемент формы типа Таблица. Мы не можем напрямую изменить код этой кнопки, но платформа предоставляет нам «хуки» (обработчики событий), которые срабатывают в ответ на действия пользователя. Наиболее подходящим событием здесь является ПриНачалеРедактирования.

Разберем этот метод по шагам:

  1. Перейдем в редактор формы и выберем элемент Таблица (вашу табличную часть).
  2. В палитре свойств найдем список событий и нажмем на лупу рядом с событием ПриНачалеРедактирования.
  3. Создадим процедуру на клиенте.

В этом обработчике нам доступны параметры НоваяСтрока и Копирование. Если НоваяСтрока имеет значение Истина, значит, пользователь нажал «Добавить» или «Инсерт». Если при этом Копирование равно Ложь, то это именно ввод новых данных с нуля. Именно в этот момент мы должны перехватить управление фокусом.

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


&НаКлиенте
Процедура ТвояТаблицаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    
    // Проверяем, что это создание новой строки, а не редактирование старой
    Если НоваяСтрока И НЕ Копирование Тогда
        
        // Устанавливаем фокус на конкретное поле
        // ВАЖНО: Указываем имя ЭЛЕМЕНТА формы (колонки), а не реквизита данных
        Элементы.ТвояТаблица.ТекущийЭлемент = Элементы.ТвояТаблицаДатаЗаправки;
        
    КонецЕсли;
    
КонецПроцедуры

В данном коде мы обращаемся к свойству ТекущийЭлемент самой таблицы. Обратите внимание, что мы указываем элемент Элементы.ТвояТаблицаДатаЗаправки. Программисту важно помнить, что имя колонки в дереве элементов формы может отличаться от имени реквизита в объекте метаданных.

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

Если мы хотим избежать написания программного кода, проанализируем настройки самих элементов формы. У каждой колонки (поля ввода) в таблице есть специфическое свойство — Пропускать при вводе (в конфигураторе это флажок в палитре свойств). Для быстрой проверки и настройки свойств элементов формы в пользовательском сеансе подойдёт обработка для редактирования свойств элементов форм в режиме 1С:Предприятие.

Выясним, как это работает: когда пользователь нажимает «Добавить», платформа ищет первую колонку, доступную для редактирования и не помеченную этим флагом. Если у вас в таблице первыми идут поля «Номер строки» или «Склад», которые заполняются автоматически, логично установить им признак ПропускатьПриВводе.

Преимущества этого метода:

Способ 3. Переопределение стандартной команды «Добавить»

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

Рассмотрим алгоритм действий:

  1. В свойствах командной панели таблицы снимем флажок Автозаполнение.
  2. Добавим собственную команду формы, назовем ее КомандаДобавитьСтроку.
  3. Выведем ее на командную панель таблицы, назначив ей стандартную картинку «Добавить» и сочетание клавиш (например, Insert).

Проанализируем программную реализацию такой команды:


&НаКлиенте
Процедура КомандаДобавитьСтроку(Команда)
    
    // 1. Добавляем новую строку в данные
    НоваяСтрока = Объект.ТвояТЧ.Добавить();
    
    // 2. Устанавливаем фокус на таблицу, чтобы платформа понимала, где идет работа
    ТекущийЭлемент = Элементы.ТвояТаблица;
    
    // 3. Устанавливаем курсор на нужную строку (последнюю добавленную)
    Элементы.ТвояТаблица.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
    
    // 4. Активизируем нужную колонку
    Элементы.ТвояТаблица.ТекущийЭлемент = Элементы.ТвояТаблицаДатаЗаправки;
    
КонецПроцедуры

Этот метод дает максимальный контроль. Например, мы можем программно проверить остатки или права доступа перед тем, как вообще разрешить добавление строки. Для ускорения программного добавления элементов и команд формы можно воспользоваться готовым модулем для программного изменения форм.

Способ 4. Настройка порядка обхода и режима редактирования

Выясним причину, почему фокус может «улетать» не туда, даже если код написан верно. Большое значение имеет свойство таблицы РежимРедактирования. В 1С существует два основных режима:

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

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

Резюме и рекомендации

Подведем итог. Для решения задачи наиболее «чистым» способом считается Способ 1 (использование события ПриНачалеРедактирования). Он не ломает стандартное поведение платформы, но позволяет точечно вмешаться в момент создания записи.

Важные замечания:

  1. Всегда проверяйте, что вы обращаетесь к элементам через коллекцию Элементы, а не пытаетесь присвоить значение реквизиту объекта.
  2. Помните про различие между управляемыми и обычными формами. В обычных формах (толстый клиент) вместо ТекущийЭлемент используется свойство ТекущаяКолонка у элемента ТабличноеПоле.
  3. Если в вашей таблице много колонок, установка свойства ПропускатьПриВводе для нередактируемых полей значительно ускорит работу оператора, так как ему не придется лишний раз нажимать Enter для перехода к следующей значащей ячейке.

Применяя эти методы, мы делаем интерфейс программы более отзывчивым и профессиональным, минимизируя лишние клики мышкой для пользователя.

← На главную