К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

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

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

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

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

Что такое свойство ТекущаяСтрока и где оно находится

У каждого элемента формы типа «Таблица» есть расширение, зависящее от источника данных: расширение динамического списка, расширение табличной части, расширение таблицы значений или дерева значений. У всех них есть свойство ТекущаяСтрока, доступное и для чтения, и для записи.

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

Тип значения, которое принимает свойство, определяется источником данных. Для динамического списка справочника или документа это ссылка. Для табличной части и таблицы значений — целое число, идентификатор строки внутри коллекции. Для динамического списка регистра сведений — объект РегистрСведенийКлючЗаписи.

Позиционирование динамического списка на ссылке

Самый частый сценарий — спозиционировать список справочника или документов на нужном элементе. Например, после создания нового контрагента из формы списка нужно, чтобы курсор встал на него. Код предельно простой:

&НаКлиенте

Процедура УстановитьПозицию(НоваяСсылка)

Элементы.Список.ТекущаяСтрока = НоваяСсылка;

КонецПроцедуры

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

Поэтому перед установкой текущей строки стоит либо сбросить отборы, либо убедиться, что искомый элемент им удовлетворяет. Типовой приём — сначала программно изменить отбор так, чтобы объект в него попадал, и только потом присваивать ТекущаяСтрока.

Порядок действий для динамического списка
  1. 1
    Убедитесь, что искомый объект попадает в выборку списка с текущими отборами
  2. 2
    При необходимости скорректируйте или снимите отбор динамического списка
  3. 3
    Присвойте Элементы.<ИмяТаблицы>.ТекущаяСтрока ссылку на объект
  4. 4
    Проверьте, что курсор встал на нужную строку и она видна на экране

Текущая строка табличной части и таблицы значений

С табличной частью документа или реквизитом формы типа «ТаблицаЗначений» ссылка не подойдёт — у строк нет ссылок. Здесь используется идентификатор строки. Сначала находится нужная строка коллекции, затем у неё вызывается ПолучитьИдентификатор():

&НаКлиенте

Процедура СпозиционироватьНаТоваре(ИскомыйТовар)

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

Если Строки.Количество() > 0 Тогда

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

КонецЕсли;

КонецПроцедуры

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

Обратная операция — получить данные текущей строки — выполняется через Элементы.Товары.ТекущиеДанные на клиенте или Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока) на сервере. Свойство ТекущиеДанные доступно только для чтения, установить строку через него нельзя.

Позиционирование в регистре сведений и дереве значений

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

&НаСервере

Процедура СпозиционироватьНаЗаписи(Организация, Контрагент)

КлючЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьКлючЗаписи(

Новый Структура("Организация, Контрагент", Организация, Контрагент));

Элементы.Список.ТекущаяСтрока = КлючЗаписи;

КонецПроцедуры

Если хотя бы одно измерение в ключе задано неверно или с другим типом, позиционирование не выполнится. Для периодических регистров значение периода должно совпадать точно, вплоть до секунды.

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

Если позиционирование нужно выполнить сразу при открытии формы, делайте это в обработчике ПриОткрытии, а не ПриСозданииНаСервере: в момент создания формы динамический список ещё может быть не заполнен, и присваивание не сработает.
ПЗ
Практическое замечание

Проверка результата и отладка

Признак успешного позиционирования — курсор визуально встал на нужную строку, а Элементы.Список.ТекущиеДанные возвращает её данные. Если после присваивания ТекущаяСтрока читается как Неопределено или содержит прежнее значение — позиционирование не сработало.

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

Контрольные точки

Как проверить результат

Значение ТекущаяСтрока после присваивания
Норма

Равно присвоенной ссылке или идентификатору

Тревожный признак

Неопределено или старое значение

ТекущиеДанные таблицы
Норма

Возвращают данные нужной строки

Тревожный признак

Неопределено или данные другой строки

Видимость строки на экране
Норма

Строка подсвечена и находится в видимой области

Тревожный признак

Строка свёрнута в узле дерева или за пределами прокрутки

Типичные ошибки и ограничения

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

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

Также учитывайте, что установка текущей строки вызывает событие ПриАктивизацииСтроки таблицы. Если в его обработчике выполняется тяжёлый код, программное позиционирование в цикле заметно замедлит форму — в таких случаях обработчик временно отключают или ставят флаг блокировки.

Типичные ошибки
01
Присваивание индекса или НомерСтроки вместо ПолучитьИдентификатор() — ошибка типа или неверная строка
02
Позиционирование списка при отборе, исключающем искомый элемент — присваивание молча игнорируется
03
Установка ТекущаяСтрока в ПриСозданииНаСервере до заполнения динамического списка — позиционирование не срабатывает
04
Обращение к реквизиту формы вместо элемента формы — свойство ТекущаяСтрока не найдено
05
Неверный ключ записи регистра сведений (не все измерения, неточный период) — курсор не перемещается

Выбор подхода под конкретную задачу

Если нужно просто показать пользователю конкретный объект в списке — достаточно присвоить ссылку свойству ТекущаяСтрока. Если задача — открыть объект для редактирования, позиционирование не нужно вовсе: используйте ОткрытьЗначение() или ПоказатьЗначение(). Если требуется подсветить несколько строк, свойство не подходит — оно хранит только одну строку, и нужно обходиться условным оформлением списка.

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

Сравнение вариантов

Присваивание ТекущаяСтрока

Универсальный способ для списков и табличных частей; требует правильного типа значения и наличия строки в данных

Параметр формы ТекущаяСтрока

Подходит при открытии формы списка; не требует кода, но работает только в момент открытия

Условное оформление

Подходит для подсветки нескольких строк; не перемещает курсор и не заменяет позиционирование

Итог

Что важно запомнить

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

Частые вопросы

Почему присваивание ТекущаяСтрока не даёт эффекта и не вызывает ошибку?

Чаще всего искомый объект не входит в выборку динамического списка из-за установленного отбора или строка с таким идентификатором отсутствует в коллекции. Платформа в этом случае просто игнорирует присваивание. Проверьте отборы списка и существование строки.

Как установить текущую строку сразу при открытии формы списка?

Передайте в параметры открытия формы параметр с именем ТекущаяСтрока и ссылкой на объект — платформа спозиционирует список автоматически. Либо присвойте значение в обработчике ПриОткрытии, когда список уже заполнен.

Можно ли установить текущей сразу несколько строк?

Нет, свойство ТекущаяСтрока хранит только одну строку. Для выделения нескольких строк используйте свойство ВыделенныеСтроки таблицы формы — оно возвращает коллекцию, доступную для изменения.

Чем ТекущаяСтрока отличается от ТекущиеДанные?

ТекущаяСтрока — идентификатор строки (ссылка, ключ или число), доступный и для чтения, и для записи. ТекущиеДанные — объект с содержимым строки, доступный только для чтения. Установить позицию через ТекущиеДанные нельзя.

Как спозиционировать список на новом документе, созданном программно?

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

Работает ли этот способ в обычных формах?

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