Как получить данные из выбранной строки динамического списка и заполнить ими форму документа?

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

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

Способ 1. Получение данных через свойство ТекущиеДанные и возврат через ОповеститьОВыборе

Рассмотрим стандартный механизм работы форм выбора. На клиенте данные активной строки таблицы формы можно прочитать через свойство ТекущиеДанные. Оно возвращает объект ДанныеФормыЭлементКоллекции, содержащий значения всех колонок, отображаемых в таблице.

Посмотрим на пример обработки события выбора строки в форме списка или выбора. В событии таблицы Выбор или в обработчике кнопки выбора формируем структуру с необходимыми полями и вызываем метод ОповеститьОВыборе:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    СтрокаДанных = Элементы.Список.ТекущиеДанные;
    Если СтрокаДанных = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ДанныеДляЗаполнения = Новый Структура;
    ДанныеДляЗаполнения.Вставить("Кошелек", СтрокаДанных.Кошелек);
    ДанныеДляЗаполнения.Вставить("Отправитель", СтрокаДанных.Отправитель);
    ДанныеДляЗаполнения.Вставить("Сумма", СтрокаДанных.Сумма);
    
    ОповеститьОВыборе(ДанныеДляЗаполнения);
КонецПроцедуры

Теперь выясним, как принять эти данные в форме документа. В форме документа настраиваем обработчик события поля или формы ОбработкаВыбора:


&НаКлиенте
Процедура ПолеДокументаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(Объект, ВыбранноеЗначение);
    КонецЕсли;
КонецПроцедуры

Способ 2. Программное открытие формы с описанием оповещения

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

Разберем пример вызова формы выбора из формы документа с использованием объекта ОписаниеОповещения:


&НаКлиенте
Процедура ВыбратьДанныеНажатие(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("РежимВыбора", Истина);
    ПараметрыФормы.Вставить("ЗакрыватьПослеВыбора", Истина);
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтаФорма);
    ОткрытьФорму("Обработка.ПодборПлатежей.Форма.ФормаВыбора", ПараметрыФормы, ЭтаФорма, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораИзСписка(РезультатВыбора, ДополнительныеПараметры) Экспорт
    Если РезультатВыбора = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если ТипЗнч(РезультатВыбора) = Тип("Структура") Тогда
        Объект.Кошелек = РезультатВыбора.Кошелек;
        Объект.Отправитель = РезультатВыбора.Отправитель;
        Объект.СуммаДокумента = РезультатВыбора.Сумма;
    КонецЕсли;
КонецПроцедуры

Способ 3. Получение ссылки и дочитка данных на сервере

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

Если часть данных не выведена в интерфейс, правильнее получить ссылку на выбранный объект через ТекущаяСтрока и прочитать остальные реквизиты на сервере:


&НаКлиенте
Процедура СписокВыборСтроки(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ТекущаяСсылка = Элементы.Список.ТекущаяСтрока;
    Если ЗначениеЗаполнено(ТекущаяСсылка) Тогда
        Данные = ПолучитьДанныеНаСервере(ТекущаяСсылка);
        ОповеститьОВыборе(Данные);
    КонецЕсли;
КонецПроцедуры

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

Важные особенности работы с динамическими списками

  1. Перенос данных в структуру: Не передавайте объект ДанныеФормыЭлементКоллекции напрямую между формами. Создавайте отдельный объект Структура, чтобы избежать ошибок привязки к контексту исходной формы.
  2. Работа с регистрами: Если список построен по регистру сведений без регистратора, свойство ТекущаяСтрока возвращает КлючЗаписиРегистраСведений. Его можно передать на сервер для точечного чтения ресурсных полей.
  3. Множественный выбор: При установленном свойстве таблицы МножественныйВыбор = Истина используйте массив из Элементы.Список.ВыделенныеСтроки, чтобы обработать все выделенные пользователем строки, а не только последнюю активную.
← На главную