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

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

Как сделать строку текущей в табличной части 1С

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

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

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

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

Как устроена текущая строка в управляемой форме

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

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

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

Установка текущей строки табличной части документа или справочника

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

&НаКлиенте

Процедура ДобавитьСтроку(Команда)

НоваяСтрока = Объект.Товары.Добавить();

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

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

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

&НаКлиенте

Процедура НайтиИАктивировать(Команда)

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

НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);

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

Элементы.Товары.ТекущаяСтрока =

НайденныеСтроки[0].ПолучитьИдентификатор();

КонецЕсли;

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

Обратите внимание: присваивание выполняется на клиенте. Если поиск выполняется на сервере, идентификатор нужно вернуть в клиентскую процедуру и установить текущую строку уже там — серверный контекст не управляет состоянием интерфейса напрямую.

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

Текущая строка в динамическом списке

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

&НаКлиенте

Процедура ПоказатьДокумент(Команда)

// СсылкаНаДокумент — ссылка на нужный документ

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

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

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

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

Позиционирование при открытии формы

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

&НаКлиенте

Процедура ОткрытьСписокСПозиционированием(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ТекущаяСтрока", СсылкаНаЭлемент);

ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);

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

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

Учтите, что в ПриСозданииНаСервере() устанавливать ТекущаяСтрока бессмысленно для клиентского позиционирования — форма ещё не отображена. Надёжное место — ПриОткрытии() на клиенте, когда данные уже загружены и элементы формы доступны.

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

Идентификатор строки (табличная часть)

Подходит для табличных частей объектов. Требует вызова ПолучитьИдентификатор() у строки данных формы. Не работает для динамических списков.

Ссылка (динамический список)

Подходит для списков документов и справочников. Срабатывает только если строка проходит текущий отбор списка.

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

Подходит для позиционирования формы списка сразу при открытии. Не применим к табличным частям объектов.

Активация колонки и переход в режим редактирования

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

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

Элементы.Товары.ТекущийЭлемент = Элементы.ТоварыКоличество;

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

Если таблица работает в режиме редактирования «в диалоге» или добавление строк запрещено настройками, программная активация всё равно сработает для позиционирования, но редактирование откроется по правилам формы. Проверяйте свойства СпособРедактирования и ИзменятьСоставСтрок, если поведение отличается от ожидаемого.

Типичные ошибки и их диагностика

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

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

Третья группа проблем связана с динамическими списками: объект существует в базе, но отбор списка его исключает. Диагностируется просто — временно снимите отбор и проверьте, появилась ли строка и активировалась ли она. Если да, корректируйте отбор или логику позиционирования.

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

Проверка результата и границы применения

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

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

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

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

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

Визуальное выделение строки
Норма

Нужная строка подсвечена, таблица прокручена к ней

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

Выделение осталось на прежней строке — проверьте тип передаваемого значения

Чтение ТекущиеДанные после установки
Норма

Возвращаются данные именно целевой строки

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

Возвращаются данные другой строки или Неопределено

Поведение динамического списка
Норма

Строка активируется при снятом отборе

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

Строка не активируется даже без отбора — проверьте, что передана ссылка правильного типа

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

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

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

Как сделать текущей первую строку табличной части?

Проверьте, что коллекция не пуста, возьмите строку по индексу ноль и передайте её идентификатор: Элементы.Товары.ТекущаяСтрока = Объект.Товары[0].ПолучитьИдентификатор(). При пустой табличной части обращение по индексу вызовет ошибку, поэтому проверка Количество() > 0 обязательна.

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

Нет. Свойство ТекущаяСтрока элемента формы управляет состоянием интерфейса и доступно для записи только на клиенте. Серверная процедура может найти строку и вернуть её идентификатор, но присваивание должно выполняться в клиентском контексте.

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

После записи документа вызовите ОповеститьОбИзменении(Ссылка) — открытые формы списков обновятся и активируют эту строку автоматически. Альтернатива — вручную присвоить Элементы.Список.ТекущаяСтрока = Ссылка, убедившись, что документ проходит текущий отбор списка.

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

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

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

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

Итог

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

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