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

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

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

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

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

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

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

Как устроено позиционирование динамического списка

Динамический список на управляемой форме — это реквизит типа ДинамическийСписок, связанный с таблицей формы. Пользователь видит таблицу, а платформа управляет выборкой данных, отборами и текущей позицией. Текущая строка хранится в свойстве ТекущаяСтрока элемента формы (таблицы), а не в самом реквизите списка.

Тип значения ТекущаяСтрока определяется основной таблицей списка:

  • справочник, документ, план видов характеристик — ссылка на объект (СправочникСсылка, ДокументСсылка);
  • регистр сведений — значение типа РегистрСведенийКлючЗаписи;
  • регистр накопления или бухгалтерии — ключ записи соответствующего типа;
  • произвольный запрос без основной таблицы — позиционирование по ссылке невозможно, доступны только обходные приёмы.

Понимание этого механизма важно, потому что большинство проблем связано именно с несоответствием типа присваиваемого значения или с тем, что искомая строка отсутствует в текущей выборке из-за отбора.

Установка текущей строки для списка справочника или документа

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

&НаКлиенте

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

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

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

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

Типовой пример — позиционирование после записи нового элемента из формы элемента. В форме элемента после записи вызывается оповещение, а форма списка его обрабатывает:

&НаКлиенте

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

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

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

КонецЕсли;

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

Стандартные формы записи объектов сами генерируют оповещение о записи, и платформа обычно позиционирует список автоматически. Ручная установка нужна, когда сценарий нестандартный: запись выполнена фоновым заданием, объект создан программно из другой формы или требуется спозиционироваться на элементе, который пользователь не открывал.

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

Установка текущей строки для регистра сведений

Для динамического списка по регистру сведений ссылка отсутствует — строка идентифицируется ключом записи. Ключ формируется структурой значений измерений (и периода для периодического регистра) и преобразуется в объект РегистрСведенийКлючЗаписи на сервере:

&НаСервере

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

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

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

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

Возврат РегистрыСведений.ЦеныНоменклатуры.СоздатьКлючЗаписи(ЗначенияКлюча);

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

&НаКлиенте

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

Ключ = ПолучитьКлючЗаписи(ТекущаяДата, ВыбраннаяНоменклатура);

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

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

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

Для подчинённого регистра сведений (с регистратором) в ключ дополнительно включается поле Регистратор. Состав полей удобно посмотреть в конфигураторе или получить программно через метаданные.

Позиционирование при открытии формы и через параметры

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

&НаКлиенте

Процедура ОткрытьСписокСПозицией(Ссылка)

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

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

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

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

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

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

Сравнение подходов

Параметр ТекущаяСтрока

Подходит для разового позиционирования при открытии типовой формы; не работает, если строка отфильтрована

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

Гибкий способ из любого клиентского кода формы; требует, чтобы строка была в текущей выборке

Отбор через параметры формы

Надёжен, когда нужно показать конкретные записи; меняет состав списка, что не всегда желательно

Почему позиционирование не срабатывает и как это исправить

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

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

Третья группа проблем — тип значения. Для иерархического справочника с отображением в виде дерева позиционирование на элементе внутри свёрнутой группы может не раскрыть ветку автоматически; иногда требуется дополнительно развернуть родительские строки. Для списка с произвольным запросом без основной таблицы позиционирование по ссылке в принципе недоступно — используйте отбор или переход через СтандартнаяОбработка открытия объекта.

Типичные ошибки
01
Присваивание значения неподходящего типа — позиционирование молча не выполняется
02
Установка строки при активном отборе, исключающем нужную запись — строка не найдена в выборке
03
Присваивание в серверной процедуре без контекста элемента формы — свойство недоступно или игнорируется
04
Формирование ключа записи регистра с неполным набором измерений — ошибка при создании ключа
05
Ожидание автоматического раскрытия дерева — элемент остаётся скрытым в свёрнутой ветке

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

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

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

Если присваивание выполняется, но пользователь «не видит» строку, убедитесь, что таблица формы имеет фокус и строка попадает в видимую область. В большинстве случаев платформа прокручивает список автоматически, но при нестандартной компоновке формы это стоит проверить вручную.

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

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

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

Совпадает с переданной ссылкой или ключом

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

Осталось прежним или пустое — тип значения неверен

Видимость строки на экране
Норма

Строка подсвечена и находится в видимой области

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

Строка вне выборки из-за отбора или в свёрнутой ветке

Состав отборов списка
Норма

Искомый объект удовлетворяет всем условиям отбора

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

Отбор исключает объект — снимите или скорректируйте условие

FAQ

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

Да, присваивание Элементы.Список.ТекущаяСтрока работает и в серверных процедурах формы, например в ПриСозданииНаСервере. Однако визуальное обновление происходит на клиенте, поэтому для позиционирования «на лету» надёжнее использовать клиентский контекст.

Почему после присваивания ТекущаяСтрока ничего не происходит?

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

Как спозиционировать список с произвольным запросом?

Если у динамического списка не задана основная таблица, позиционирование по ссылке невозможно. Используйте программный отбор по ключевым полям или откройте сам объект в отдельной форме вместо позиционирования.

Как установить текущую строку в иерархическом списке?

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

Нужно ли вызывать Обновить() после установки текущей строки?

Обычно нет — платформа обновляет отображение сама. Вызов Элементы.Список.Обновить() оправдан, если данные изменились вне формы (например, записаны фоновым заданием) и нужно одновременно обновить выборку и позицию.

Чем отличается ТекущаяСтрока от ТекущиеДанные?

ТекущаяСтрока — идентификатор строки (ссылка или ключ), доступный для записи. ТекущиеДанные — объект с полями строки, доступный только для чтения; присвоить ему значение для позиционирования нельзя.

Итог

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

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