К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как установить текущую строку в динамическом списке 1С

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

Динамический список — основной способ показа табличных данных на формах 1С: списки документов, справочников, регистров сведений. Частая задача разработчика — после открытия формы, добавления нового элемента или выполнения команды спозиционировать курсор на нужной строке, чтобы пользователю не приходилось искать её вручную.

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

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

Как устроено свойство ТекущаяСтрока

У элемента формы типа «Таблица», отображающего динамический список, есть свойство ТекущаяСтрока. Его тип зависит от основной таблицы списка: для справочника или документа это ссылка на объект, для регистра сведений — ключ записи (объект типа РегистрСведенийКлючЗаписи), для регистра накопления — ключ с регистратором и номером строки.

Чтение свойства возвращает идентификатор текущей активной строки, запись — пытается спозиционировать список на переданном значении. Присваивание выполняется на клиенте, но фактическое позиционирование происходит с учётом данных на сервере: платформа ищет строку в текущей выборке динамического списка.

&НаКлиенте

Процедура УстановитьТекущуюСтроку(СсылкаНаЭлемент)

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

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

Если переданное значение имеет неверный тип (например, ссылка на справочник другого вида), платформа либо проигнорирует присваивание, либо вызовет ошибку — поведение зависит от контекста, поэтому тип значения стоит контролировать явно.

Установка текущей строки при открытии формы

Классический сценарий — открыть форму списка так, чтобы курсор сразу стоял на нужном элементе. Для этого у формы списка есть стандартный параметр ТекущаяСтрока, который передаётся при открытии:

&НаКлиенте

Процедура ОткрытьСписокСПозиционированием(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ТекущаяСтрока", НужнаяСсылка);

ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);

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

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Если Параметры.Свойство("ТекущаяСтрока")

И ЗначениеЗаполнено(Параметры.ТекущаяСтрока) Тогда

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

КонецЕсли;

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

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

Позиционирование после записи нового объекта

Частая задача: пользователь создал элемент из формы списка через свою команду или программно, и после записи нужно спозиционироваться на нём. Для этого используют оповещение о записи или прямую установку после закрытия формы элемента.

Первый способ — обработчик оповещения. Форма элемента при записи генерирует оповещение Запись_<ИмяОбъекта> или вы передаёте своё имя события через Оповестить. В форме списка ловите оповещение и устанавливаете строку:

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ЗаписанаНоваяНоменклатура" Тогда

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

КонецЕсли;

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

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

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

Порядок действий при позиционировании после записи
  1. 1
    Запишите объект и получите его ссылку
  2. 2
    Вызовите Элементы.Список.Обновить() или дождитесь оповещения о записи
  3. 3
    Присвойте Элементы.Список.ТекущаяСтрока = Ссылка
  4. 4
    Проверьте, что строка попадает под текущие отборы списка
  5. 5
    Визуально убедитесь, что курсор встал на нужную строку

Работа с регистрами и ключами записей

Для динамического списка по регистру сведений значение ТекущаяСтрока — это не ссылка, а ключ записи. Ключ формируется на сервере по значениям измерений (и периоду для периодического регистра):

&НаСервере

Функция ПолучитьКлючЗаписи(Период, Номенклатура)

ЗначенияКлюча = Новый Структура;

ЗначенияКлюча.Вставить("Период", Период);

ЗначенияКлюча.Вставить("Номенклатура", Номенклатура);

Возврат РегистрыСведений.ЦеныНоменклатуры

.СоздатьКлючЗаписи(ЗначенияКлюча);

КонецФункции

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

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

Установка строки по условию: поиск нужной ссылки

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

&НаСервере

Функция НайтиСсылкуДляПозиционирования(Контрагент)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1 Док.Ссылка КАК Ссылка

|ИЗ Документ.РеализацияТоваровУслуг КАК Док

|ГДЕ Док.Контрагент = &Контрагент

|УПОРЯДОЧИТЬ ПО Док.Дата УБЫВ";

Запрос.УстановитьПараметр("Контрагент", Контрагент);

Выборка = Запрос.Выполнить().Выбрать();

Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);

КонецФункции

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

Если запрос ничего не нашёл, обработайте это явно: сообщите пользователю, что подходящей записи нет, вместо молчаливого отсутствия реакции. Иначе возникает ощущение, что кнопка «не работает».

Типичные ошибки
01
Установка ТекущаяСтрока в ПриСозданииНаСервере — список ещё не готов, присваивание игнорируется; переносите код в ПриОткрытии
02
Позиционирование на строку, исключённую отбором — курсор остаётся на первой строке без какого-либо сообщения
03
Передача значения неверного типа (например, структуры вместо ссылки) — ошибка или молчаливый отказ
04
Установка строки сразу после записи без обновления списка — новая запись ещё не попала в выборку
05
Ручная сборка ключа записи регистра с неполным набором измерений — ключ не соответствует ни одной записи

Проверка результата и отладка

После присваивания полезно убедиться, что позиционирование действительно произошло. Простейшая проверка — сразу после установки прочитать Элементы.Список.ТекущаяСтрока и сравнить с переданным значением. Если свойство не изменилось, значит строка не найдена в выборке.

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

Ещё один приём — проверить значение Элементы.Список.ТекущиеДанные. Если после установки строки ТекущиеДанные равны Неопределено, список не спозиционировался. Это надёжный индикатор, который можно использовать в автотестах и отладочных сообщениях.

Контрольные точки

Как проверить результат

Значение Элементы.Список.ТекущаяСтрока после присваивания
Норма

Равно переданной ссылке или ключу

Тревожный признак

Осталось прежним или Неопределено

Элементы.Список.ТекущиеДанные
Норма

Содержит данные нужной строки

Тревожный признак

Неопределено — строка в выборке не найдена

Поведение при снятых отборах
Норма

Позиционирование работает — проблема была в отборе

Тревожный признак

Не работает даже без отборов — проверяйте тип и существование записи

Альтернативные подходы и ограничения

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

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

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

Сравнение вариантов

Установка ТекущаяСтрока

Подходит, когда нужно показать строку в общем контексте списка. Ограничение: медленно на очень больших выборках и не работает при противоречащих отборах

Отбор по ссылке

Подходит, когда важна сама запись, а не её место в списке. Быстро и надёжно, но скрывает остальные строки

ВыделенныеСтроки

Подходит для выделения нескольких записей одновременно. Не перемещает курсор и не гарантирует видимость строк на экране

Итог

Что важно запомнить

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

Частые вопросы

Почему присваивание ТекущаяСтрока не даёт эффекта?

Чаще всего строка не попадает в выборку из-за отбора, присваивание выполнено слишком рано (в ПриСозданииНаСервере) или передано значение неверного типа. Проверьте отборы, перенесите код в ПриОткрытии и убедитесь, что передаёте ссылку нужного вида.

Можно ли установить текущую строку по номеру строки?

Нет. Динамический список не поддерживает позиционирование по порядковому номеру — только по идентификатору строки (ссылке или ключу записи). Если известен только номер, сначала найдите ссылку запросом с соответствующей сортировкой.

Как спозиционироваться на группе справочника?

Точно так же — присвойте ТекущаяСтрока ссылку на группу. Условие: список должен отображать иерархию (у таблицы формы включён режим отображения дерева или списка с группами), иначе группа не попадёт в выборку.

Работает ли установка строки в мобильном клиенте и веб-клиенте?

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

Как снять выделение или сбросить текущую строку?

Присвойте ТекущаяСтрока значение Неопределено. Курсор будет сброшен, хотя визуально список может остаться на той же позиции прокрутки — это нормальное поведение.

Нужно ли обновлять список после установки текущей строки?

Нет, наоборот: обновление вызывают до установки, чтобы гарантировать, что нужная запись уже есть в выборке. После успешного присваивания список сам отобразит позиционирование.