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