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

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

Механика работы свойства ТекущаяСтрока

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

Важно отметить, что тип данных, возвращаемый свойством, полностью соответствует типу данных строки таблицы. Если вы работаете с документом «Реализация товаров и услуг», то Элементы.Товары.ТекущаяСтрока вернет ссылку на строку табличной части «Товары». Это позволяет напрямую читать и записывать реквизиты выбранной строки без необходимости предварительного поиска по ключу или индексу.

Однако существует нюанс: если в табличной части нет ни одной строки или фокус не установлен ни на одном элементе, свойство вернет значение Неопределено. Игнорирование этого факта в коде часто приводит к ошибкам выполнения типа «Объект не найден» при попытке обратиться к полям несуществующей строки. Поэтому проверка на заполненность — обязательный этап перед любыми операциями записи.

💡

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

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

Чтение данных из активной строки

Самый распространенный сценарий использования — получение данных из строки, которую пользователь просматривает или редактирует прямо сейчас. Это часто требуется для динамического обновления других полей формы, проведения расчетов «на лету» или проверки условий доступности кнопок командной панели.

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


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

Если ТекущаяСтрокаТовара <> Неопределено Тогда

Количество = ТекущаяСтрокаТовара.Количество;

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

Сумма = Количество * Цена;

КонецЕсли;

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

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

💡

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

Как программно установить текущую строку

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

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

Рассмотрим алгоритм добавления новой строки и автоматического перехода на неё. Это классический паттерн поведения в пользовательских интерфейсах:

  • 📄 Создается новая строка в коллекции табличной части.
  • ✍️ Заполняются значения по умолчанию (склад, ставка НДС, статья затрат).
  • 🎯 Свойству ТекущаяСтрока присваивается ссылка на созданный объект.
  • 👁️ Интерфейс мгновенно перемещает курсор на новую позицию.

Пример кода для реализации такого сценария:


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

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Услуга");

НоваяСтрока.Количество = 1;

// Установка курсора на новую строку

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

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

☑️ Алгоритм установки строки

Выполнено: 0 / 4

Навигация по списку: первая и последняя строка

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

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

Для перехода к последней строке логика аналогична, но требуется знать количество элементов или использовать обратный цикл. Однако, стоит учитывать, что если табличная часть пуста, попытка получить строку по индексу вызовет ошибку. Поэтому всегда используйте конструкцию Если Количество() > 0 Тогда.

Пример перехода к последней строке:


Если Документ.Товары.Количество() > 0 Тогда

ИндексПоследней = Документ.Товары.Количество() - 1;

ПоследняяСтрока = Документ.Товары.Получить(ИндексПоследней);

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

КонецЕсли;

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

Особенность работы с пустыми списками

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

Обработка событий и изменение выделения

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

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

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

Ниже приведена таблица, описывающая основные события, связанные с навигацией по строкам:

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

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

📊 Как вы чаще всего используете ТекущуюСтроку?
Для чтения данных
Для установки фокуса
Для валидации
Не использую

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

При работе с навигацией по табличным частям разработчики часто допускают ряд типовых ошибок, которые приводят к нестабильной работе конфигурации. Самая частая из них — попытка обратиться к реквизитам строки, когда свойство равно Неопределено. Это классическая ошибка «Object is undefined», которая прерывает выполнение кода.

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

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

⚠️ Внимание: Никогда не сохраняйте ссылку на ТекущуюСтроку в глобальную переменную на длительное время. При перезаписи или перезагрузке формы объект может быть уничтожен, а переменная будет указывать на «мертую» ссылку, что вызовет ошибку при обращении.

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

Особенности работы в управляемых формах

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

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

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


// Пример вызова с клиента

&НаКлиенте

Процедура ПерейтиНаСтроку(СтрокаДанных)

Элементы.Товары.ТекущаяСтрока = СтрокаДанных;

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

⚠️ Внимание: Интерфейс управляемых форм может блокировать установку текущей строки, если элемент формы заблокирован для редактирования или скрыт. Убедитесь, что видимость и доступность элемента позволяют манипулировать фокусом.

Также в УФ важно помнить о производительности. Частая смена текущей строки в цикле на клиенте может вызывать множество перерисовок интерфейса, что «подвешивает» интерфейс. Если требуется обработать много строк, делайте это на сервере без изменения текущей строки, а фокус меняйте только по факту завершения операции.

💡

В управляемых формах для визуального перемещения курсора обязательно выполняйте установку ТекущейСтроки в клиентском модуле формы.

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

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

Свойство ТекущаяСтрока возвращает объект, а не числовой индекс. Чтобы получить индекс, необходимо перебрать коллекцию строк в цикле и сравнить ссылки. Пример: Для Индекс = 0 По Товары.Количество()-1 Цикл Если Товары.Получить(Индекс) = Элементы.Товары.ТекущаяСтрока Тогда ... КонецЕсли; КонецЦикла.

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

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

Почему текущая строка сбрасывается после проведения документа?

При проведении документа часто происходит перезапись объекта или обновление формы из базы данных. В этот момент буфер формы очищается и заполняется заново, поэтому ссылки на старые объекты строк становятся невалидными. Необходимо явно восстанавливать текущую строку в обработчике события ПослеЗаписи или ОбработкаОповещения.

Как выделить несколько строк одновременно?

Свойство ТекущаяСтрока предназначено только для одной активной строки. Для работы с выделенным диапазоном (множественный выбор) используется свойство ВыделенныеСтроки, которое возвращает массив ссылок на объекты. Установка множественного выделения требует присвоения этого массива соответствующему свойству элемента формы.