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