При работе с управляемыми формами в 1С часто возникает задача: получить данные из строки, которую пользователь только что выбрал в динамическом списке. Это может быть необходимо для заполнения других полей, выполнения проверок или вывода дополнительной информации. На первый взгляд, задача кажется простой, но есть несколько нюансов, которые могут ввести в заблуждение начинающего разработчика. Рассмотрим, как правильно и эффективно получить доступ к данным выделенной строки.
Самый правильный и производительный способ получить данные текущей строки динамического списка — это использовать свойство ТекущиеДанные (CurrentData). Проанализируем ключевые моменты этого подхода.
Важный момент: доступ к этому свойству осуществляется через коллекцию элементов формы Элементы, а не Items, как можно было бы предположить из старых версий платформы или по аналогии с другими объектами. Правильный синтаксис выглядит так: Элементы.ИмяСписка.ТекущиеДанные.
Свойство ТекущиеДанные возвращает структуру, где:
Этот метод является наиболее предпочтительным, так как он работает на стороне клиента и не требует дополнительного обращения к серверу. Он использует те данные, которые уже загружены и отображены на форме, что делает его очень быстрым.
Разберем по шагам, как это реализовать:
ПриАктивизацииСтроки. Оно срабатывает каждый раз, когда пользователь перемещает фокус на новую строку. Также можно использовать обработчик нажатия кнопки, если данные нужны по конкретной команде.Элементы.ИмяВашегоСписка.ТекущиеДанные.Неопределено. Такая ситуация возникает, если в списке нет ни одной строки или если текущая строка по какой-то причине недоступна (например, список пуст). Попытка обратиться к полям неопределенного значения вызовет ошибку.ТекущиеДанные.Номенклатура или ТекущиеДанные.СуммаДокумента.Посмотрим, как это выглядит на практике. Предположим, у нас есть форма со списком документов "РеализацияТоваровУслуг", который называется `Список`, и мы хотим при выборе строки выводить в сообщение ее номер и сумму.
Для этого создадим обработчик события `ПриАктивизацииСтроки` для нашего динамического списка:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
// Получаем данные текущей строки. Обращаемся к свойству элемента формы.
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
// ОБЯЗАТЕЛЬНО выполняем проверку на Неопределено.
// Это защитит от ошибок, если список пуст или строка не выбрана.
Если ТекущиеДанные = Неопределено Тогда
Возврат; // Выходим из процедуры, если данных нет
КонецЕсли;
// Теперь мы можем безопасно работать с данными.
// Имена полей (Номер, СуммаДокумента) должны совпадать с именами колонок
// в запросе динамического списка.
НомерДокумента = ТекущиеДанные.Номер;
СуммаДокумента = ТекущиеДанные.СуммаДокумента;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Выбран документ №" + НомерДокумента + " на сумму: " + СуммаДокумента;
Сообщение.Сообщить();
КонецПроцедуры
Этот код надежен, быстр и является стандартом для решения подобной задачи в управляемых формах.
Несмотря на простоту, у этого метода есть особенности, которые нужно учитывать.
1. `ТекущиеДанные` содержит только видимые поля
Структура ТекущиеДанные будет содержать только те поля, которые выбраны в запросе динамического списка и выведены на форму в виде колонок. Если какое-то поле (например, Ответственный) есть в таблице-источнике, но его нет в списке колонок динамического списка, то в структуре ТекущиеДанные вы его не найдете. Попытка обратиться к ТекущиеДанные.Ответственный приведет к ошибке "Поле объекта не обнаружено".
2. Разница между `ТекущиеДанные` и `ТекущаяСтрока`
У динамического списка есть еще одно похожее свойство — ТекущаяСтрока. Важно не путать их:
Элементы.ИмяСписка.<strong>ТекущиеДанные</strong> — возвращает структуру с данными всех видимых колонок. Работает на клиенте, быстро.Элементы.ИмяСписка.<strong>ТекущаяСтрока</strong> — возвращает уникальный идентификатор (ключ) строки. Обычно это ссылка на объект базы данных (например, ДокументСсылка.РеализацияТоваровУслуг). Чтобы получить из этого идентификатора какие-либо данные (кроме тех, что есть в представлении), потребуется дополнительный запрос к серверу.Что делать, если вам нужно получить значение поля, которого нет в колонках списка? В этом случае как раз и пригодится свойство ТекущаяСтрока в паре с серверным вызовом.
Проанализируем этот подход:
КлючСтроки = Элементы.Список.ТекущаяСтрока;Неопределено).Этот способ медленнее из-за дополнительного обращения к серверу, поэтому его следует использовать только тогда, когда без этого не обойтись.
&НаКлиенте
Процедура ПолучитьСкрытыеДанныеПоКнопке()
// 1. Получаем ключ текущей строки
КлючСтроки = Элементы.Список.ТекущаяСтрока;
// 2. Проверяем, что строка выбрана
Если ЗначениеЗаполнено(КлючСтроки) Тогда
// 3. Вызываем серверную функцию
Ответственный = ПолучитьИмяОтветственногоНаСервере(КлючСтроки);
Сообщить("Ответственный по документу: " + Ответственный);
Иначе
Предупреждение("Сначала выберите документ в списке!");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьИмяОтветственногоНаСервере(СсылкаНаДокумент)
// 4. На сервере выполняем запрос к БД
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ответственный.Наименование КАК ИмяОтветственного
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.ИмяОтветственного;
КонецЕсли;
Возврат "";
КонецФункции
Подведем итог: для большинства повседневных задач используйте быстрый и эффективный метод через Элементы.ИмяСписка.ТекущиеДанные. Если же требуются данные, не выведенные в список, прибегайте к получению ключа через ТекущаяСтрока и последующему запросу к серверу.