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

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

1С: программная установка текущей строки табличной части

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

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

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

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

Как устроено свойство ТекущаяСтрока

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

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

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

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

Базовый сценарий: есть ссылка на строку коллекции Объект.Товары, нужно сделать её текущей. Код выглядит так:

&НаКлиенте

Процедура УстановитьТекущуюСтроку(СтрокаТаблицы)

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

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

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

Если строка известна по индексу, а не по ссылке на объект, сначала получите строку из коллекции:

&НаКлиенте

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

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

Строка = Объект.Товары[0];

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

КонецЕсли;

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

bsl
// Позиционирование на строке по индексу
Строка = Объект.Товары[ИндексСтроки];
Элементы.Товары.ТекущаяСтрока = Строка.ПолучитьИдентификатор();

Спозиционироваться после добавления новой строки

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

&НаКлиенте

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

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

НоваяСтрока.Номенклатура = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка");

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

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

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

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

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

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

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

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

Строка = Объект.Товары[0];

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

КонецЕсли;

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

Поиск строки по условию и позиционирование

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

&НаКлиенте

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

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

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

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

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

Иначе

ПоказатьПредупреждение(, "Строка с указанной номенклатурой не найдена");

КонецЕсли;

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

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

Поиск по идентификатору: обратная задача

Обратное преобразование — получить строку по известному идентификатору — выполняется методом НайтиПоИдентификатору(). Это полезно, когда идентификатор пришёл извне, например из параметра события выбора:

&НаКлиенте

Процедура ОбработатьВыборСтроки(ИдентификаторСтроки)

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

Если Строка <> Неопределено Тогда

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

КонецЕсли;

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

Таблица значений на форме и динамический список

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

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

&НаКлиенте

Процедура СпозиционироватьВСписке(СсылкаНаДокумент)

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

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

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

Табличная часть объекта

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

Таблица значений (реквизит формы)

Тот же механизм идентификаторов, код идентичен табличной части.

Динамический список

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

Обычная форма

ЭлементыФормы.Товары.ТекущаяСтрока = сама строка табличной части, без идентификатора.

Установка текущей строки в обычной форме

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

Процедура СпозиционироватьОбычнаяФорма()

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

ЭлементыФормы.Товары.ТекущаяСтрока = Товары[0];

КонецЕсли;

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

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

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

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

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

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

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

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

Нужная строка подсвечена как активная

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

Выделена другая строка или выделения нет

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

Свойство вернуло тот же идентификатор, что присваивали

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

Свойство вернуло Неопределено или другое число

Активная колонка
Норма

Курсор стоит в заданной ячейке (ТекущийЭлемент)

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

Активна первая колонка по умолчанию

Ограничения и нюансы

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

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

Итог

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

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

Часто задаваемые вопросы

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

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

Почему позиционирование не срабатывает после серверного вызова?

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

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

Напрямую — нет, свойство принимает только идентификатор. Но номер строки связан с индексом: Индекс = НомерСтроки - 1. Получите строку как Объект.Товары[НомерСтроки - 1] и возьмите у неё идентификатор.

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

Установите ТекущаяСтрока, затем задайте активную колонку через Элементы.Товары.ТекущийЭлемент = Элементы.<ИмяКолонки>. Для перехода в режим редактирования ячейки дополнительно можно вызвать Элементы.Товары.ИзменитьСтроку().

Работает ли ТекущаяСтрока для динамического списка?

Да, но по-другому: свойству присваивается не идентификатор, а ссылка на объект (для списков справочников и документов) или значение ключа записи (для регистров сведений). Метод ПолучитьИдентификатор() к динамическим спискам не применяется.

Что делать, если строка есть в табличной части, но не видна на форме?

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