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