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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основной способ: свойство `ТекущиеДанные`

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

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

Свойство ТекущиеДанные возвращает структуру, где:

Этот метод является наиболее предпочтительным, так как он работает на стороне клиента и не требует дополнительного обращения к серверу. Он использует те данные, которые уже загружены и отображены на форме, что делает его очень быстрым.

Разберем по шагам, как это реализовать:

  1. Создайте обработчик события. Чаще всего для этой задачи используют событие динамического списка ПриАктивизацииСтроки. Оно срабатывает каждый раз, когда пользователь перемещает фокус на новую строку. Также можно использовать обработчик нажатия кнопки, если данные нужны по конкретной команде.
  2. Получите данные. В коде обработчика обратитесь к свойству Элементы.ИмяВашегоСписка.ТекущиеДанные.
  3. Проверьте результат. Критически важно всегда проверять, не равны ли полученные данные значению Неопределено. Такая ситуация возникает, если в списке нет ни одной строки или если текущая строка по какой-то причине недоступна (например, список пуст). Попытка обратиться к полям неопределенного значения вызовет ошибку.
  4. Используйте данные. Если проверка прошла успешно, вы можете обращаться к нужным полям структуры по их именам, например, ТекущиеДанные.Номенклатура или ТекущиеДанные.СуммаДокумента.

Практический пример кода

Посмотрим, как это выглядит на практике. Предположим, у нас есть форма со списком документов "РеализацияТоваровУслуг", который называется `Список`, и мы хотим при выборе строки выводить в сообщение ее номер и сумму.

Для этого создадим обработчик события `ПриАктивизацииСтроки` для нашего динамического списка:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)

    // Получаем данные текущей строки. Обращаемся к свойству элемента формы.
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    
    // ОБЯЗАТЕЛЬНО выполняем проверку на Неопределено.
    // Это защитит от ошибок, если список пуст или строка не выбрана.
    Если ТекущиеДанные = Неопределено Тогда
        Возврат; // Выходим из процедуры, если данных нет
    КонецЕсли;
    
    // Теперь мы можем безопасно работать с данными.
    // Имена полей (Номер, СуммаДокумента) должны совпадать с именами колонок
    // в запросе динамического списка.
    НомерДокумента = ТекущиеДанные.Номер;
    СуммаДокумента = ТекущиеДанные.СуммаДокумента;
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Выбран документ №" + НомерДокумента + " на сумму: " + СуммаДокумента;
    Сообщение.Сообщить();
    
КонецПроцедуры

Этот код надежен, быстр и является стандартом для решения подобной задачи в управляемых формах.

Важные нюансы и возможные проблемы

Несмотря на простоту, у этого метода есть особенности, которые нужно учитывать.

1. `ТекущиеДанные` содержит только видимые поля

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

2. Разница между `ТекущиеДанные` и `ТекущаяСтрока`

У динамического списка есть еще одно похожее свойство — ТекущаяСтрока. Важно не путать их:

Альтернативный способ: когда нужны "скрытые" данные

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

Проанализируем этот подход:

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

Этот способ медленнее из-за дополнительного обращения к серверу, поэтому его следует использовать только тогда, когда без этого не обойтись.

Пример кода для получения данных с сервера


&НаКлиенте
Процедура ПолучитьСкрытыеДанныеПоКнопке()
    // 1. Получаем ключ текущей строки
    КлючСтроки = Элементы.Список.ТекущаяСтрока;
    
    // 2. Проверяем, что строка выбрана
    Если ЗначениеЗаполнено(КлючСтроки) Тогда
        // 3. Вызываем серверную функцию
        Ответственный = ПолучитьИмяОтветственногоНаСервере(КлючСтроки);
        Сообщить("Ответственный по документу: " + Ответственный);
    Иначе
        Предупреждение("Сначала выберите документ в списке!");
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьИмяОтветственногоНаСервере(СсылкаНаДокумент)
    // 4. На сервере выполняем запрос к БД
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ответственный.Наименование КАК ИмяОтветственного
        |ИЗ
        |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |    РеализацияТоваровУслуг.Ссылка = &Ссылка";
        
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.ИмяОтветственного;
    КонецЕсли;
    
    Возврат "";
КонецФункции

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

← На главную