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

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

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

Причина ошибки: индекс строки против идентификатора

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

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

Способ 1. Получение идентификатора через перебор строк

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


Для Каждого Стр Из Объект.Начисления Цикл
    Если Стр.Начисление = ИскомоеНачисление Тогда
        ИдентификаторСтроки = Стр.ПолучитьИдентификатор();
        Элементы.Начисления.ТекущаяСтрока = ИдентификаторСтроки;
        Прервать;
    КонецЕсли;
КонецЦикла;

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

Способ 2. Оптимизированный поиск через метод НайтиСтроки

Посмотрим на более компактный и производительный вариант. Вместо полного перебора коллекции циклом Для Каждого воспользуемся методом НайтиСтроки(), который доступен у коллекций данных формы:


ПараметрыОтбора = Новый Структура("Начисление", ИскомоеНачисление);
НайденныеСтроки = Объект.Начисления.НайтиСтроки(ПараметрыОтбора);

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

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

СтрокаКоллекции = Объект.Начисления.НайтиПоИдентификатору(ИдентификаторСтроки);

Особенности установки текущей строки для разных типов источников данных

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

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

Важные нюансы при программной активизации строк

Разберем дополнительные тонкости работы клиентского контекста, с которыми часто сталкиваются разработчики:

  1. Передача визуального фокуса: присвоение значения свойству ТекущаяСтрока лишь выделяет строку внутри таблицы, но не перемещает фокус ввода на сам элемент управления. Чтобы пользователь сразу мог работать с таблицей с клавиатуры, необходимо активизировать элемент формы:
    
    Элементы.Начисления.ТекущаяСтрока = ИдентификаторСтроки;
    ТекущийЭлемент = Элементы.Начисления;
    
  2. Клиентский контекст: свойство ТекущиеДанные таблицы доступно исключительно на клиенте и предназначено только для чтения. Установку ТекущаяСтрока при открытии формы надежнее выполнять в клиентском обработчике ПриОткрытии, так как на сервере при инициализации формы позиционирование может сбрасываться платформой.
  3. Вызов обработчиков событий: избегайте прямого программного вызова процедур-обработчиков событий формы (например, НачисленияНачислениеПриИзменении). События формы рассчитаны на интерактивные действия пользователя. Логику пересчета или заполнения данных следует выносить в отдельные служебные процедуры и вызывать их явно, передавая строку или ее данные в качестве параметров.
← На главную