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