Как программно активизировать нужную ячейку в таблице на управляемой форме

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

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

Анализ типичных ошибок при попытке фокуса на ячейку

Посмотрим на частые ошибки, с которыми сталкиваются программисты при попытке перевести фокус на ячейку:

  1. Установка свойства ТекущийЭлемент у таблицы, а не у формы: свойство ТекущийЭлемент принадлежит объекту УправляемаяФорма (или контексту ЭтаФорма). Попытка выполнить присвоение вида Элементы.Таблица.ТекущийЭлемент = ... не дает результата или вызывает ошибку, так как у элемента формы ТаблицаФормы нет такого свойства для смены активного поля ввода.
  2. Передача группы вместо конкретного поля ввода: если колонки таблицы сгруппированы, нельзя указывать в качестве активного элемента саму группу (ГруппаФормы). Фокус может быть установлен только на конкретное поле ввода (ПолеФормы).
  3. Попытка адресации строки через порядковый номер: свойство таблицы ТекущаяСтрока ожидает не просто индекс в массиве, а уникальный идентификатор строки данных формы (для коллекций) либо ссылку/ключ записи (для динамических списков).

Пошаговый алгоритм: правильная активация ячейки

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

Разберем по шагам правильный программный код:


// Шаг 1. Находим нужную строку данных формы
Отбор = Новый Структура("Действие", "Отгрузить");
НайденныеСтроки = ТаблицаДоступныхДействийТекущая.НайтиСтроки(Отбор);

Если НайденныеСтроки.Количество() > 0 Тогда
    // Шаг 2. Получаем идентификатор строки и активизируем ее в таблице
    ИдентификаторСтроки = НайденныеСтроки[0].ПолучитьИдентификатор();
    Элементы.ТаблицаДоступныхДействийТекущая.ТекущаяСтрока = ИдентификаторСтроки;
    
    // Шаг 3. Активизируем колонку через свойство формы ТекущийЭлемент
    ТекущийЭлемент = Элементы.ТаблицаДоступныхДействийТекущаяКоличество;
КонецЕсли;

Обратим внимание на ключевой момент: свойству ТекущийЭлемент самой формы мы присваиваем элемент управления колонки, расположенный в коллекции Элементы.

Особенности работы с разными источниками данных

В зависимости от того, какой объект отображает таблица формы, механизм указания свойства ТекущаяСтрока различается:

  1. Табличные части и Таблицы значений (ДанныеФормыКоллекция): в свойство ТекущаяСтрока передается числовой идентификатор, полученный через вызов метода ПолучитьИдентификатор() у строки, либо непосредственно объект ДанныеФормыЭлементКоллекции.
  2. Динамические списки: значением свойства ТекущаяСтрока выступает ссылка на объект базы данных (для справочников и документов) либо КлючЗаписи (для регистров сведений).

Позиционирование при открытии формы через обработчик ожидания

При инициализации формы (в событиях ПриСозданииНаСервере или ПриОткрытии) платформа применяет стандартные правила фокуса интерфейса и значение свойства АктивизироватьПоУмолчанию. Из-за этого программное переключение ячейки, выполненное непосредственно в ПриОткрытии, может сброситься обратно на первую колонку.

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


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

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

Немедленный переход в режим редактирования ячейки

Если требуется не только выделить ячейку, но и сразу перевести ее в режим редактирования (эмулируя нажатие клавиши Enter или двойной клик мыши), после позиционирования вызываем метод таблицы ИзменитьСтроку():


Элементы.ТаблицаДоступныхДействийТекущая.ТекущаяСтрока = ИдентификаторСтроки;
ТекущийЭлемент = Элементы.ТаблицаДоступныхДействийТекущаяКоличество;

// Открываем ячейку для ввода значения
Элементы.ТаблицаДоступныхДействийТекущая.ИзменитьСтроку();

Альтернативный вариант: ввод данных через отдельное поле

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

← На главную