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