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