Открыть форму нового объекта с заполнением

В управляемых формах появилась очевидная проблема: Как открыть форму с объектом который я программно заполнил, но не сохранил еще в базу?
ОТВЕТ: По умолчанию — никак.

Единственное что можно заставить сделать систему по умолчанию, при открытии формы, это выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.

Сначала небольшой кусок кода чтобы не забыть что какие ключи надо передавать при открытии формы.

Данные = Новый Структура();
Данные.Вставить("Наименование", "ТЕСТ НАИМЕНОВАНИЯ");
Данные.Вставить("Комментарий", "ТЕСТ");
Данные.Вставить("Артикул", "ТЕСТ");
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", Данные);
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);

Собственно что здесь важно:

  • Данные — структура в которую мы пишем наименования полей открываемого объекта и их значения
  • ПараметрыФормы — тоже структура с ключом «ЗначенияЗаполнения» — это предопределенный ключ для параметров передаваемых в форму. Платформа при получении этого ключа выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.

ПРИМЕЧАНИЕ:

В открывшейся форме все данные которые вы ей передадите будут так же лежать в переменной Параметры.ЗначенияЗаполнения в модуле формы объекта

У переменной Параметры, есть еще несколько предопределенных ключей

  • Ключ — сюда ложим ссылку если хотим открыть форму существующего объекта
  • ЗакрыватьПриВыборе — для форм списков, что написано то и делает, после двойного щелчка по строке списка закрывает форму выбора
  • ЗакрыватьПриЗакрытииВладельца — если форма А владелец формы Б, то при закрытии А, закроется и Б.
  • ЗначениеКопирования — ссылка на объект копию которого мы хотим открыть. копия будет не сохранена.
  • ЗначенияЗаполнения — Это мы отобразили в самом начале. Структура с данными заполнения
  • Основание — ссылка на объект основание
  • ПараметрыВыбора — Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
  • РежимВыбора — Если Истина, открывает форму в режиме выбора.

Передавать можно несколько параметров одновременно.

ДОПОЛНИТЕЛЬНЫЙ ХАК

Если по каким-то причинам, нет желания пихать логику заполнения в сам объект. Вот идея и немного кода для облегчения жизни:

В функцию ОбработкаЗаполнения все равно придется написать немного своего кода, хорошо то что он может быть универсальный и его можно запихать в расширение (очень полезно для стандартных конфигураций)

Порядок действий:

  1. Создадим объект (например так: ДокТМП = Документы.ЗаказКлиента.СоздатьДокумент();)
  2. ДокТМП — заполним так как считаем нужным (реквизиты и таб части)
  3. Отправим его в функцию ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)
    Функция ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)
    	СтруктураДанныхОбъекта = Новый Структура();
    	Для каждого Реквизит ИЗ Метаданные.Документы.ЗаказКлиента.Реквизиты Цикл
    		СтруктураДанныхОбъекта.Вставить(Реквизит.Имя, ОбъектДанных[Реквизит.Имя]);
    	КонецЦикла;
    	
    	ТблТМП = Новый ТаблицаЗначений;
    	ТблТМП.Колонки.Добавить("Имя");
    	ТблТМП.Колонки.Добавить("Адрес");
    	Для каждого ТабЧасть ИЗ Метаданные.Документы.ЗаказКлиента.ТабличныеЧасти Цикл
    		Если ОбъектДанных[ТабЧасть.Имя].Количество() = 0 Тогда 
    			Продолжить;
    		КонецЕсли;
    		
    		СтрТМП = ТблТМП.Добавить();
    		СтрТМП.Имя	 = ТабЧасть.Имя;
    		СтрТМП.Адрес = ПоместитьВоВременноеХранилище(ОбъектДанных[ТабЧасть.Имя].Выгрузить(),Новый УникальныйИдентификатор());
    	КонецЦикла;
    	
    	Если НЕ ТблТМП.Количество() = 0 Тогда 
    		СтруктураДанныхОбъекта.Вставить("АдресОписаниеТабЧастей", ПоместитьВоВременноеХранилище(ТблТМП,Новый УникальныйИдентификатор()));
    	КонецЕсли;
    	
    	Возврат СтруктураДанныхОбъекта;
    КонецФункции
    
  4. Полученную структуру передаем открываемую форму:
    	ПараметрыЗаполнения = Новый Структура("ЗначенияЗаполнения", СтруктураДанныхОбъекта);
    	ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыЗаполнения, ЭтаФорма, ЭтаФорма.УникальныйИдентификатор);
    
  5. В открываемом объекте нужно обработать полученные данные:
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
      ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
      Если ТипДанныхЗаполнения = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
          Если ДанныеЗаполнения.Свойство("АдресОписаниеТабЧастей") Тогда
            ОписаниеТабЧастей = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.АдресОписаниеТабЧастей);
            Для каждого ОписаниеТабЧасти Из ОписаниеТабЧастей Цикл
              ТблТМП = ПолучитьИзВременногоХранилища(ОписаниеТабЧасти.Адрес);
              ЭтотОбъект[ОписаниеТабЧасти.Имя].Загрузить(ТблТМП);
            КонецЦикла;
          КонецЕсли;
    
          СтандартнаяОбработка = Ложь;
        КонецЕсли;
    КонецПроцедуры