В управляемых формах появилась очевидная проблема: Как открыть форму с объектом который я программно заполнил, но не сохранил еще в базу?
ОТВЕТ: По умолчанию — никак.
Единственное что можно заставить сделать систему по умолчанию, при открытии формы, это выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.
Сначала небольшой кусок кода чтобы не забыть что какие ключи надо передавать при открытии формы.
Данные = Новый Структура();
Данные.Вставить("Наименование", "ТЕСТ НАИМЕНОВАНИЯ");
Данные.Вставить("Комментарий", "ТЕСТ");
Данные.Вставить("Артикул", "ТЕСТ");
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", Данные);
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);
Собственно что здесь важно:
- Данные — структура в которую мы пишем наименования полей открываемого объекта и их значения
- ПараметрыФормы — тоже структура с ключом «ЗначенияЗаполнения» — это предопределенный ключ для параметров передаваемых в форму. Платформа при получении этого ключа выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.
ПРИМЕЧАНИЕ:
В открывшейся форме все данные которые вы ей передадите будут так же лежать в переменной Параметры.ЗначенияЗаполнения в модуле формы объекта
У переменной Параметры, есть еще несколько предопределенных ключей
- Ключ — сюда ложим ссылку если хотим открыть форму существующего объекта
- ЗакрыватьПриВыборе — для форм списков, что написано то и делает, после двойного щелчка по строке списка закрывает форму выбора
- ЗакрыватьПриЗакрытииВладельца — если форма А владелец формы Б, то при закрытии А, закроется и Б.
- ЗначениеКопирования — ссылка на объект копию которого мы хотим открыть. копия будет не сохранена.
- ЗначенияЗаполнения — Это мы отобразили в самом начале. Структура с данными заполнения
- Основание — ссылка на объект основание
- ПараметрыВыбора — Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
- РежимВыбора — Если Истина, открывает форму в режиме выбора.
Передавать можно несколько параметров одновременно.
ДОПОЛНИТЕЛЬНЫЙ ХАК
Если по каким-то причинам, нет желания пихать логику заполнения в сам объект. Вот идея и немного кода для облегчения жизни:
В функцию ОбработкаЗаполнения все равно придется написать немного своего кода, хорошо то что он может быть универсальный и его можно запихать в расширение (очень полезно для стандартных конфигураций)
Порядок действий:
- Создадим объект (например так: ДокТМП = Документы.ЗаказКлиента.СоздатьДокумент();)
- ДокТМП — заполним так как считаем нужным (реквизиты и таб части)
- Отправим его в функцию ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)
Функция ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных) СтруктураДанныхОбъекта = Новый Структура(); Для каждого Реквизит ИЗ Метаданные.Документы.ЗаказКлиента.Реквизиты Цикл СтруктураДанныхОбъекта.Вставить(Реквизит.Имя, ОбъектДанных[Реквизит.Имя]); КонецЦикла; ТблТМП = Новый ТаблицаЗначений; ТблТМП.Колонки.Добавить("Имя"); ТблТМП.Колонки.Добавить("Адрес"); Для каждого ТабЧасть ИЗ Метаданные.Документы.ЗаказКлиента.ТабличныеЧасти Цикл Если ОбъектДанных[ТабЧасть.Имя].Количество() = 0 Тогда Продолжить; КонецЕсли; СтрТМП = ТблТМП.Добавить(); СтрТМП.Имя = ТабЧасть.Имя; СтрТМП.Адрес = ПоместитьВоВременноеХранилище(ОбъектДанных[ТабЧасть.Имя].Выгрузить(),Новый УникальныйИдентификатор()); КонецЦикла; Если НЕ ТблТМП.Количество() = 0 Тогда СтруктураДанныхОбъекта.Вставить("АдресОписаниеТабЧастей", ПоместитьВоВременноеХранилище(ТблТМП,Новый УникальныйИдентификатор())); КонецЕсли; Возврат СтруктураДанныхОбъекта; КонецФункции
- Полученную структуру передаем открываемую форму:
ПараметрыЗаполнения = Новый Структура("ЗначенияЗаполнения", СтруктураДанныхОбъекта); ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыЗаполнения, ЭтаФорма, ЭтаФорма.УникальныйИдентификатор);
- В открываемом объекте нужно обработать полученные данные:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения); Если ТипДанныхЗаполнения = Тип("Структура") Тогда ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения); Если ДанныеЗаполнения.Свойство("АдресОписаниеТабЧастей") Тогда ОписаниеТабЧастей = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.АдресОписаниеТабЧастей); Для каждого ОписаниеТабЧасти Из ОписаниеТабЧастей Цикл ТблТМП = ПолучитьИзВременногоХранилища(ОписаниеТабЧасти.Адрес); ЭтотОбъект[ОписаниеТабЧасти.Имя].Загрузить(ТблТМП); КонецЦикла; КонецЕсли; СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры