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