Как программно установить текущую строку и фокус в таблице формы 1С 8.3

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

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

Поиск строки и получение её идентификатора

Первым делом проанализируем ситуацию, когда данные находятся в объекте типа ДанныеФормыКоллекция (это может быть табличная часть документа или добавленная на форму таблица значений). Для того чтобы таблица на экране «поняла», какую строку мы хотим сделать активной, нам недостаточно просто найти индекс строки в массиве. Нам необходим её внутренний идентификатор.

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


ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("Номенклатура_Key", ИскомыйТовар);

// Находим строки в коллекции данных формы
НайденныеСтроки = Товары.НайтиСтроки(ПараметрыПоиска);

Если НайденныеСтроки.Количество() > 0 Тогда
    // Получаем первую найденную строку
    ЦелеваяСтрока = НайденныеСтроки[0];
    
    // Получаем идентификатор строки для элемента управления
    ИдентификаторСтроки = ЦелеваяСтрока.ПолучитьИдентификатор();
    
    // Устанавливаем строку текущей в элементе формы
    Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
КонецЕсли;

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

Настройка свойств таблицы для визуального выделения

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

Проанализируем свойство ИспользованиеТекущейСтроки. Для того чтобы строка выделялась цветом и была визуально активна, установите значение Отображение выделения и выбор (в коде это соответствует перечислению ИспользованиеТекущейСтроки.ОтображениеВыделенияИВыбор).

Также, если вы хотите гарантированно «подсветить» строку, можно использовать коллекцию выделенных строк:


// Очищаем текущее выделение и добавляем нашу строку
Элементы.Товары.ВыделенныеСтроки.Очистить();
Элементы.Товары.ВыделенныеСтроки.Добавить(ИдентификаторСтроки);

Программная передача фокуса в конкретную колонку

Когда строка успешно установлена, часто требуется перевести фокус в поле ввода (например, чтобы пользователь сразу мог ввести количество товара) — для этого подойдёт визуализация данных и улучшение интерфейса подбора товаров в таблицах 1С. Для этого используется свойство формы ТекущийЭлемент. Посмотрим, как правильно выстроить иерархию обращения к элементам.

Рассмотрим последовательность действий, которая гарантирует переход фокуса:

  1. Сначала установим ТекущаяСтрока у таблицы.
  2. Затем установим саму таблицу как ТекущийЭлемент формы.
  3. И в завершение установим фокус на конкретное поле (колонку) внутри этой таблицы.

Пример реализации этой логики:


// 1. Устанавливаем строку
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;

// 2. Делаем таблицу активным элементом
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;

// 3. Переводим фокус на конкретное поле ввода (например, "ТоварыФакт")
ЭтаФорма.ТекущийЭлемент = Элементы.ТоварыФакт;

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

Особенности работы на мобильной платформе

На мобильной платформе 1С 8.3 (особенно в версиях 8.3.18 и выше) существуют специфические ограничения — их обходит мобильное приложение для инвентаризации и работы со штрихкодами. Проанализируем ситуацию: часто после сканирования штрихкода срабатывает обработчик оповещения. Если в этом обработчике сразу менять фокус, системные процессы (закрытие окна сканера или обработка ввода) могут «перехватить» фокус обратно.

Если код выше не привел к прокрутке таблицы к нужной строке, выполните следующие рекомендации:

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


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "Штрихкод" Тогда
        // ... поиск идентификатора строки ...
        ПараметрыВызова = Новый Структура("Идентификатор", ИдентификаторСтроки);
        ПодключитьОбработчикОжидания("УстановитьФокусНаСтроку", 0.1, Истина);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФокусНаСтроку(Параметры) Экспорт
    Элементы.Товары.ТекущаяСтрока = Параметры.Идентификатор;
    ЭтаФорма.ТекущийЭлемент = Элементы.ТоварыФакт;
КонецПроцедуры

2. Принудительное изменение строки. Если ваша цель — начать редактирование, можно вызвать метод Элементы.Товары.ИзменитьСтроку(). На мобильных устройствах это автоматически вызывает клавиатуру и прокручивает таблицу к активному полю.

Полный пример решения задачи

Объединим всё вышесказанное в один надежный алгоритм для обработчика сканирования штрихкода — для этого подойдёт автоматизация складских операций со сканером штрихкодов для 1С:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "Штрихкод" Тогда
        
        // Поиск товара в справочнике или ТЗ штрихкодов
        ПараметрыОтбора = Новый Структура("Штрихкод", Параметр);
        СтрокиШК = Штрихкоды.НайтиСтроки(ПараметрыОтбора);
        
        Если СтрокиШК.Количество() = 1 Тогда
            ТоварСсылка = СтрокиШК[0].Номенклатура;
            
            // Ищем строку в основной таблице формы "Товары"
            ПарамПоиска = Новый Структура("Номенклатура", ТоварСсылка);
            НайденныеСтроки = Товары.НайтиСтроки(ПарамПоиска);
            
            Если НайденныеСтроки.Количество() > 0 Тогда
                СтрокаТЗ = НайденныеСтроки[0];
                Ид = СтрокаТЗ.ПолучитьИдентификатор();
                
                // Установка текущей строки
                Элементы.Товары.ТекущаяСтрока = Ид;
                
                // Обновляем данные (например, инкремент факта)
                СтрокаТЗ.Факт = СтрокаТЗ.Факт + 1;
                
                // Сброс и установка выделения
                Элементы.Товары.ВыделенныеСтроки.Очистить();
                Элементы.Товары.ВыделенныеСтроки.Добавить(Ид);
                
                // Установка фокуса на колонку "Факт"
                ЭтаФорма.ТекущийЭлемент = Элементы.ТоварыФакт;
                
                // Для мобильных: гарантируем видимость строки
                Элементы.Товары.ИзменитьСтроку();
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

← На главную