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

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

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

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

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

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

Что нужно понимать перед позиционированием

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

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

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

Позиционирование в управляемой форме

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

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

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

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

Если строка уже существует и её нужно найти по условию, используется метод НайтиСтроки(), который возвращает массив подходящих строк:

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

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

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

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

КонецЕсли;

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

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

Позиционирование в обычной форме

В обычном приложении табличное поле работает напрямую со строками табличной части объекта. Свойству ТекущаяСтрока присваивается сама строка:

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

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

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

КонецЕсли;

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

Типовые сценарии использования

После подбора номенклатуры

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

ИндексПервойНовой = Объект.Товары.Количество() - 1;

// ... добавление строк из подбора ...

Если Объект.Товары.Количество() > ИндексПервойНовой + 1 Тогда

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

КонецЕсли;

Позиционирование по переданному параметру

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

Возврат на строку после редактирования в отдельной форме

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

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

Поиск строки для позиционирования

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

Если условие сложнее простого равенства (например, «строка с максимальной суммой» или «пустое количество»), придётся пройти коллекцию циклом и запомнить подходящую строку. После цикла у найденной строки берётся идентификатор и назначается текущей строкой.

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

Проверка результата и типичные ошибки

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

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

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

Ограничения и альтернативные подходы

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

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

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

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

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

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

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

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

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

Данные связанных элементов
Норма

Подчинённые таблицы показывают данные выбранной строки

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

Связанные данные не соответствуют строке

Повторное выполнение кода
Норма

Позиция стабильно воспроизводится

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

Работает через раз — вероятно, устаревает идентификатор

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

Чем идентификатор строки отличается от номера строки?

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

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

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

Можно ли спозиционироваться на строке из серверной процедуры?

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

Как спозиционироваться на строке, если совпадающих строк несколько?

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

Работает ли тот же подход для динамического списка?

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

Итог

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

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