Разработка и Конфигурация · 12 мин
Как сделать строку текущей в табличной части 1С
Как программно установить текущую строку табличной части в 1С: свойство ТекущаяСтрока, идентификаторы строк, работа с динамическими списками и типичные ошибки.
Задача сделать строку табличной части текущей возникает у разработчиков 1С постоянно: после добавления новой строки нужно переместить на неё курсор, при обработке подбора — спозиционироваться на найденной позиции, при открытии формы — показать пользователю конкретную запись. Во всех этих случаях работа ведётся не с самими данными, а с элементом формы, отображающим таблицу.
Ключевой момент, который нужно понять сразу: «текущая строка» — это свойство элемента формы (таблицы формы), а не табличной части объекта. Данные в табличной части не имеют понятия «текущей строки» — это визуальное состояние интерфейса. Поэтому установка выполняется через свойство ТекущаяСтрока элемента формы, а значение зависит от типа данных, которые таблица отображает.
Для табличных частей (объектов, документов) значением служит идентификатор строки коллекции данных формы, а для динамических списков — ссылка на объект. Путаница между этими двумя случаями — главный источник ошибок, когда код «молча» не работает: платформа просто не находит строку с переданным значением и оставляет позицию без изменений.
Как устроена текущая строка в управляемой форме
В управляемых формах табличная часть объекта при выводе на форму преобразуется в коллекцию данных формы (обычно типа «ДанныеФормыКоллекция»). Каждая строка этой коллекции получает уникальный идентификатор — число, которое платформа назначает автоматически. Именно этот идентификатор используется для связи интерфейса с данными.
Элемент формы «Таблица» (свойство Элементы.ИмяТаблицы) имеет свойство ТекущаяСтрока, доступное и для чтения, и для записи на клиенте. Записав в него идентификатор строки, вы заставляете форму активировать эту строку: она подсвечивается, становится видимой (при необходимости таблица прокручивается) и получает фокус ввода.
Важно различать идентификатор строки и номер строки. Номер строки (НомерСтроки) — это порядковый номер в табличной части, который может меняться при сортировке и удалении. Идентификатор (ПолучитьИдентификатор()) — стабильная связь с конкретной строкой данных формы. Для свойства ТекущаяСтрока нужен именно идентификатор.
Установка текущей строки табличной части документа или справочника
Самый частый сценарий — спозиционироваться на строке, которую только что добавили программно. После вызова Добавить() у коллекции новая строка уже существует, и у неё есть идентификатор. Достаточно передать его в свойство ТекущаяСтрока элемента формы.
&НаКлиенте
Процедура ДобавитьСтроку(Команда)
НоваяСтрока = Объект.Товары.Добавить();
Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
КонецПроцедуры
Если нужно активировать строку, найденную по условию, сначала выполняется поиск в данных формы, затем у найденной строки берётся идентификатор. Метод НайтиСтроки() возвращает массив строк, из которого обычно берётся первый элемент.
&НаКлиенте
Процедура НайтиИАктивировать(Команда)
Отбор = Новый Структура("Номенклатура", ИскомаяНоменклатура);
НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока =
НайденныеСтроки[0].ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
Обратите внимание: присваивание выполняется на клиенте. Если поиск выполняется на сервере, идентификатор нужно вернуть в клиентскую процедуру и установить текущую строку уже там — серверный контекст не управляет состоянием интерфейса напрямую.
- 1Получите строку коллекции данных формы: добавьте новую или найдите существующую через НайтиСтроки()
- 2Вызовите у строки метод ПолучитьИдентификатор()
- 3Присвойте идентификатор свойству Элементы.ИмяТаблицы.ТекущаяСтрока в клиентской процедуре
- 4При необходимости вызовите Элементы.ИмяТаблицы.ТекущийЭлемент, чтобы активировать конкретную колонку для ввода
Текущая строка в динамическом списке
Когда таблица формы отображает динамический список (список документов, справочников, регистра), механика другая. Здесь нет коллекции данных формы и идентификаторов строк — значением свойства ТекущаяСтрока служит ключ записи: для ссылочных списков это ссылка на объект, для регистров сведений — ключ записи регистра.
&НаКлиенте
Процедура ПоказатьДокумент(Команда)
// СсылкаНаДокумент — ссылка на нужный документ
Элементы.Список.ТекущаяСтрока = СсылкаНаДокумент;
КонецПроцедуры
Этот приём часто применяют в обработках оповещения: после записи нового элемента из формы списка вызывается оповещение, и форма списка позиционируется на созданном объекте. Для этого удобно использовать стандартный механизм — ОповеститьОбИзменении(Ссылка), после которого списки сами обновляются и активизируют изменённую строку.
Ограничение динамического списка: позиционирование срабатывает, только если искомая строка удовлетворяет текущему отбору списка. Если объект отфильтрован настройками или отбором формы, платформа не сможет его активировать — строка физически отсутствует в выборке. В таких случаях сначала сбрасывают или корректируют отбор.
Позиционирование при открытии формы
Отдельный сценарий — открыть форму так, чтобы нужная строка уже была активной. Для формы списка это решается параметром открытия: в структуру параметров ОткрытьФорму() добавляется ключ ТекущаяСтрока со ссылкой на объект.
&НаКлиенте
Процедура ОткрытьСписокСПозиционированием(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТекущаяСтрока", СсылкаНаЭлемент);
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);
КонецПроцедуры
Для табличной части открываемого объекта такого стандартного параметра нет. Позиционирование выполняется в обработчике ПриОткрытии() формы объекта: там уже доступны данные формы, и можно найти строку и установить её идентификатор. Если критерий поиска приходит извне, его передают через произвольный параметр формы и обрабатывают в ПриСозданииНаСервере() с сохранением в реквизит формы.
Учтите, что в ПриСозданииНаСервере() устанавливать ТекущаяСтрока бессмысленно для клиентского позиционирования — форма ещё не отображена. Надёжное место — ПриОткрытии() на клиенте, когда данные уже загружены и элементы формы доступны.
Сравнение вариантов
Подходит для табличных частей объектов. Требует вызова ПолучитьИдентификатор() у строки данных формы. Не работает для динамических списков.
Подходит для списков документов и справочников. Срабатывает только если строка проходит текущий отбор списка.
Подходит для позиционирования формы списка сразу при открытии. Не применим к табличным частям объектов.
Активация колонки и переход в режим редактирования
Установка текущей строки подсвечивает её, но не всегда переводит фокус в нужную ячейку. Если цель — чтобы пользователь сразу начал вводить данные в конкретную колонку, дополнительно задаётся свойство ТекущийЭлемент таблицы формы, ссылающееся на элемент-колонку.
Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
Элементы.Товары.ТекущийЭлемент = Элементы.ТоварыКоличество;
Для перевода строки в режим редактирования (как при нажатии Enter или двойного клика) используется метод ИзменитьСтроку() элемента таблицы. Сочетание трёх действий — текущая строка, текущий элемент, изменить строку — даёт поведение, полностью аналогичное ручному добавлению строки пользователем.
Если таблица работает в режиме редактирования «в диалоге» или добавление строк запрещено настройками, программная активация всё равно сработает для позиционирования, но редактирование откроется по правилам формы. Проверяйте свойства СпособРедактирования и ИзменятьСоставСтрок, если поведение отличается от ожидаемого.
Типичные ошибки и их диагностика
Самая распространённая ошибка — передача в ТекущаяСтрока номера строки или самой строки данных вместо идентификатора. Платформа в этом случае обычно не выдаёт исключение, а просто не находит строку, и позиция остаётся прежней. Признак — код выполняется без ошибок, но визуально ничего не происходит.
Вторая частая ситуация — попытка позиционирования до того, как данные загружены в форму. Например, установка текущей строки в ПриСозданииНаСервере() для табличной части не даст эффекта, потому что идентификаторы строк коллекции данных формы на этом этапе ещё могут быть не назначены или изменятся при отрисовке.
Третья группа проблем связана с динамическими списками: объект существует в базе, но отбор списка его исключает. Диагностируется просто — временно снимите отбор и проверьте, появилась ли строка и активировалась ли она. Если да, корректируйте отбор или логику позиционирования.
Проверка результата и границы применения
Проверить, что строка действительно стала текущей, можно двумя способами. Визуально: строка выделена, таблица прокручена к ней, при вводе с клавиатуры данные попадают в активную ячейку. Программно: прочитать Элементы.Товары.ТекущаяСтрока и сравнить с ожидаемым идентификатором, либо прочитать Элементы.Товары.ТекущиеДанные и проверить значения полей.
Есть сценарии, где программная установка текущей строки не применима. В обычных формах (толстый клиент, устаревший интерфейс) механика другая — там используется свойство ТекущаяСтрока табличного поля, но значением служит сама строка табличной части, а не идентификатор. В веб-клиенте и мобильной платформе управляемые формы работают по тем же правилам, но поведение прокрутки и фокуса может отличаться визуально.
Также не стоит злоупотреблять позиционированием в массовых обработках: установка текущей строки — это операция интерфейса, и в цикле по сотням строк она бессмысленна и замедляет форму. Для пакетной логики работайте с данными напрямую, а текущую строку устанавливайте один раз — на итоговом результате.
Как проверить результат
Нужная строка подсвечена, таблица прокручена к ней
Выделение осталось на прежней строке — проверьте тип передаваемого значения
Возвращаются данные именно целевой строки
Возвращаются данные другой строки или Неопределено
Строка активируется при снятом отборе
Строка не активируется даже без отбора — проверьте, что передана ссылка правильного типа
Частые вопросы
Почему присваивание ТекущаяСтрока выполняется без ошибки, но строка не активируется?
Чаще всего передано значение не того типа: номер строки или сама строка данных вместо идентификатора. Для табличной части всегда используйте СтрокаДанных.ПолучитьИдентификатор(), для динамического списка — ссылку на объект. Также убедитесь, что код выполняется на клиенте.
Как сделать текущей первую строку табличной части?
Проверьте, что коллекция не пуста, возьмите строку по индексу ноль и передайте её идентификатор: Элементы.Товары.ТекущаяСтрока = Объект.Товары[0].ПолучитьИдентификатор(). При пустой табличной части обращение по индексу вызовет ошибку, поэтому проверка Количество() > 0 обязательна.
Можно ли установить текущую строку на сервере?
Нет. Свойство ТекущаяСтрока элемента формы управляет состоянием интерфейса и доступно для записи только на клиенте. Серверная процедура может найти строку и вернуть её идентификатор, но присваивание должно выполняться в клиентском контексте.
Как спозиционировать список на только что созданном документе?
После записи документа вызовите ОповеститьОбИзменении(Ссылка) — открытые формы списков обновятся и активируют эту строку автоматически. Альтернатива — вручную присвоить Элементы.Список.ТекущаяСтрока = Ссылка, убедившись, что документ проходит текущий отбор списка.
Чем ТекущаяСтрока отличается от ТекущиеДанные?
ТекущаяСтрока — это идентификатор (число или ссылка), указывающий, какая строка активна; его можно и читать, и записывать. ТекущиеДанные — это сами данные активной строки в виде структуры данных формы; свойство доступно только для чтения. Чтобы сменить активную строку, работайте с ТекущаяСтрока.
Работает ли этот подход в обычных формах?
В обычных формах механика отличается: у табличного поля свойство ТекущаяСтрока принимает саму строку табличной части, а не идентификатор, то есть присваивается непосредственно строка коллекции. Метод ПолучитьИдентификатор() там не используется.
Что важно запомнить
Текущая строка устанавливается через свойство ТекущаяСтрока элемента формы на клиенте: для табличной части передаётся идентификатор строки (ПолучитьИдентификатор()), для динамического списка — ссылка на объект. Если позиционирование не срабатывает, проверяйте тип значения, клиентский контекст и отбор списка.