Как программно активировать и позиционироваться на строке таблицы в управляемой форме 1С?

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

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

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

В чем разница между индексом строки и её идентификатором?

Разберем типичную проблему: если попытаться установить текущую строку в элементе формы через индекс коллекции, можно столкнуться с некорректным позиционированием. Свойство ТекущаяСтрока элемента формы, отображающего коллекцию (реквизит типа ДанныеФормыКоллекция), ожидает именно числовой идентификатор строки, а не ее порядок или индекс.

Проанализируем особенности работы идентификаторов строк в 1С:

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

Шаг 1. Получение идентификатора строки и позиционирование

Выясним правильный алгоритм работы. Чтобы корректно спозиционироваться на найденной строке, нужно сначала найти строку в объекте ДанныеФормыКоллекция, а затем вызвать метод ПолучитьИдентификатор() у самой строки.

Посмотрим на пример клиентской процедуры поиска документа по штрихкоду:


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

Шаг 2. Передача визуального фокуса на таблицу

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

Рассмотрим итоговый фрагмент кода с активизацией элемента:


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

// Переносим визуальный фокус на таблицу формы
ТекущийЭлемент = Элементы.ТаблицаДокументов;

Полезные методы для работы со строками таблицы

Рассмотрим еще несколько полезных приемов при работе с коллекциями данных формы:

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