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