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

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

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

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

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

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

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

Интерактивное выделение строки в пользовательском режиме

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

Для перехода к конкретной позиции в длинной табличной части удобен поиск: сочетание Ctrl+F открывает диалог поиска по текущей колонке, после нахождения значения курсор встаёт на нужную строку. В управляемых формах также работает начало ввода значения прямо в активной колонке — таблица спозиционируется на первой подходящей строке.

Выделение нескольких строк

Чтобы выделить несколько строк подряд, щелкните первую строку, затем с зажатой клавишей Shift щелкните последнюю — диапазон подсветится целиком. Для выборочного выделения несмежных строк удерживайте Ctrl и щелкайте нужные строки. Те же приёмы работают с клавиатурой: Shift+стрелки расширяют выделение от текущей позиции.

Множественное выделение поддерживается не во всех таблицах: если разработчик формы отключил режим множественного выделения, Ctrl и Shift работать не будут. Это ограничение формы, а не ошибка пользователя.

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

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

Типовой фрагмент кода выглядит так:

&НаКлиенте

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

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

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

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

&НаКлиенте

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

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

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

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

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

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

Как получить идентификатор нужной строки

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

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

&НаКлиенте

Процедура НайтиИВыделить(Команда)

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

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

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

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

КонецЕсли;

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

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

bsl
// Активная строка: данные без поиска по идентификатору
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
    Сообщить(ТекущиеДанные.Номенклатура);
КонецЕсли;

Особенности обычных форм и тонкого клиента

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

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

Сравнение подходов

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

ТекущаяСтрока принимает саму строку данных табличной части; идентификаторы не нужны, но модель устаревшая

Управляемая форма

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

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

Текущая строка определяется ключом записи; программно позиционирование ограничено и делается через отбор или настройки списка

Выделение строк в динамических списках и таблицах значений

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

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

Типичные ошибки и их устранение

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

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

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

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

Проверка результата и FAQ

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

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

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

Подсветка строки в форме
Норма

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

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

Подсвечена другая строка или ни одной

Элементы.Товары.ТекущиеДанные
Норма

Возвращает данные нужной строки

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

Неопределено или чужие данные

Поведение после обновления формы
Норма

Позиция сохраняется

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

Выделение сбрасывается — установка выполнена раньше обновления данных

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

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

Можно ли программно выделить несколько строк табличной части?

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

Почему код Элементы.Товары.ТекущаяСтрока не работает на сервере?

Коллекция Элементы формы доступна только в клиентском контексте, потому что описывает визуальное представление. На сервере работайте с данными (Объект.Товары), а позиционирование передавайте на клиент, например через параметр или вызов клиентской процедуры после серверной обработки.

Как выделить строку сразу после открытия формы документа?

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

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

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

Как узнать номер выделенной строки, видимый пользователю?

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

Итог

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

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