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