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