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

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

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

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

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

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

Ниже разобраны рабочие способы установки текущей строки для управляемых и обычных форм, поиск нужной строки по условию, обработка события активизации и типичные ошибки, из-за которых позиционирование «не срабатывает».

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

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

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

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

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

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

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

НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;

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

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

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

Если после установки текущей строки нужно сразу открыть её для редактирования (например, перевести таблицу в режим ввода), дополнительно используют метод Элементы.Товары.ИзменитьСтроку() или устанавливают текущую колонку через Элементы.Товары.ТекущийЭлемент = Элементы.ТоварыКоличество;.

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

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

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

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

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

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

КонецЕсли;

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

Позиционирование в динамических списках и обычных формах

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

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

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

Условие работоспособности — ссылка должна присутствовать в выборке списка с учётом установленных отборов. Если новый документ не проходит по отбору, строка визуально не установится.

Обычные формы

В обычных формах (режим обычного приложения) механика проще: свойство ЭлементыФормы.Товары.ТекущаяСтрока принимает непосредственно строку табличной части:

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

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

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

Управляемая форма, табличная часть

ТекущаяСтрока принимает идентификатор из ПолучитьИдентификатор(). Подходит для реквизитов ДанныеФормыКоллекция.

Управляемая форма, динамический список

ТекущаяСтрока принимает ссылку на объект списка. Работает только если ссылка входит в выборку с текущим отбором.

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

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

Контекст выполнения: клиент и сервер

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

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

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

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

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

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

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

Итог

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

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

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

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

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

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

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

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

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

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

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

Чем установка текущей строки отличается от условного оформления?

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

Работает ли этот приём для таблицы значений на форме?

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