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

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

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

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

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

Ключевой нюанс: у динамического списка «текущая строка» — это не строка табличной части и не выборка запроса, а ключ записи (ссылка или структура ключевых полей регистра). Как именно её получить, зависит от того, что отображает список: справочник, документ или регистр сведений. Ниже разобраны рабочие приёмы для каждого случая.

Как устроена текущая строка динамического списка

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

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

Получение ссылки через ТекущаяСтрока

Самый простой сценарий — список справочника или документов. В обработчике команды или события формы достаточно обратиться к элементу таблицы:

&НаКлиенте

Процедура ОткрытьТекущийЭлемент(Команда)

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

Если ТекСсылка = Неопределено Тогда

Возврат;

КонецЕсли;

ПоказатьЗначение(, ТекСсылка);

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

Обязательна проверка на Неопределено: если список пуст или позиционирование ещё не выполнено, свойство вернёт Неопределено, и обращение к объекту вызовет ошибку. Дополнительно полезно проверить тип значения функцией ТипЗнч(), если команда должна работать только с определёнными объектами.

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

Получение данных строки через ТекущиеДанные

Когда нужны не только ссылка, но и реквизиты — например, наименование, дата, контрагент — используют ТекущиеДанные:

&НаКлиенте

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

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

Если Данные = Неопределено Тогда

Возврат;

КонецЕсли;

Сообщить("Документ: " + Данные.Номер + " от " + Данные.Дата);

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

Важное ограничение: в ТекущиеДанные попадают только те поля, которые есть в запросе динамического списка. Если реквизит не выбран в запросе, обращение к нему вызовет ошибку «Поле не найдено». Решение — добавить поле в запрос списка (его можно не выводить в колонку) либо получить значение на сервере по ссылке.

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

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

&НаСервере

Функция ПолучитьДанныеЗаписи(КлючЗаписи)

Менеджер = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();

ЗаполнитьЗначенияСвойств(Менеджер, КлючЗаписи);

Менеджер.Прочитать();

Если Менеджер.Выбран() Тогда

Возврат Менеджер.Цена;

КонецЕсли;

Возврат Неопределено;

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

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

Событие ПриАктивизацииСтроки и программное позиционирование

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

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Порядок действий
  1. 1
    Определите, что отображает список: справочник, документы или регистр
  2. 2
    Для ссылки используйте Элементы.Список.ТекущаяСтрока с проверкой на Неопределено
  3. 3
    Для реквизитов строки используйте Элементы.Список.ТекущиеДанные на клиенте
  4. 4
    Для серверной логики передайте ссылку или ключ записи в серверную процедуру
  5. 5
    Проверьте результат на пустом списке и при активной группе иерархии

Выделенные строки вместо одной текущей

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

&НаКлиенте

Процедура ОбработатьВыделенные(Команда)

Для Каждого Строка Из Элементы.Список.ВыделенныеСтроки Цикл

// Строка — ссылка или ключ записи

ОбработатьНаСервере(Строка);

КонецЦикла;

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

Команды массовой обработки корректнее строить именно на ВыделенныеСтроки, а не на ТекущаяСтрока: иначе обработается только одна запись из выделенных, что вводит пользователя в заблуждение.

Типичные ошибки
01
Отсутствие проверки на Неопределено — ошибка при пустом списке
02
Обращение к полю, которого нет в запросе динамического списка, — ошибка «Поле не найдено»
03
Передача ТекущиеДанные в серверную процедуру — ошибка преобразования
04
Ожидание ссылки от списка регистра сведений, хотя возвращается ключ записи
05
Использование ТекущаяСтрока при множественном выборе вместо ВыделенныеСтроки

Проверка результата и ограничения

После внедрения кода проверьте поведение в граничных ситуациях: пустой список, отбор без результатов, активная строка-группа, список с динамическим считыванием больших объёмов. Убедитесь, что команда корректно отключается, когда строка не выбрана — для этого у кнопки можно настроить свойство ИзменяетДанные или управлять доступностью программно.

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

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

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

Пустой список
Норма

Команда завершается без ошибки

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

Ошибка обращения к Неопределено

Реквизит из ТекущиеДанные
Норма

Значение выводится корректно

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

Ошибка «Поле не найдено» — поля нет в запросе

Список регистра сведений
Норма

Получен ключ записи и прочитана запись

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

Код ожидает ссылку и падает при приведении типов

Итог

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

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

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

Почему ТекущаяСтрока возвращает Неопределено?

Список пуст, отбор не дал результатов или строка ещё не спозиционирована после открытия формы. Всегда добавляйте проверку Если ТекСсылка = Неопределено Тогда Возврат; перед использованием значения.

Как получить реквизит, которого нет в колонках списка?

Добавьте поле в запрос динамического списка — выводить его в колонку необязательно, оно станет доступно в ТекущиеДанные. Альтернатива — на сервере получить значение по ссылке через объект или запрос.

Можно ли передать ТекущиеДанные на сервер?

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

Что возвращает ТекущаяСтрока для регистра сведений?

Значение типа РегистрСведенийКлючЗаписи, содержащее измерения и период. Для чтения самой записи создайте менеджер записи, заполните его свойствами ключа и вызовите Прочитать().

Как обработать несколько выделенных строк?

Переберите коллекцию Элементы.Список.ВыделенныеСтроки в цикле. Каждый элемент — ссылка или ключ записи, который можно передать в серверную процедуру обработки.

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

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