Безудержный танец с бубном или «Как открыть форму незаписанного документа в управляемом приложении»
Вы уже начали работать с управляемым приложением?
А вам уже доводилось открывать форму незаписанного документа (справочника)?
Когда пользователь должен сам принять решение о необходимости его записи.
То, что было просто в обычных формах — превратилось в забавную камасутру в управляемом интерфейсе.
Как легко и по шагам решить поставленную задачу — вы узнаете в данной публикации.
- Описание
- Подробнее
Описание
Во первых: Почему так сложно?
Причина в том, что в обычном приложении и объект и форма живут вместе на протяжении всей жизни формы.
На управляемых формах все несколько иначе. Объект и форма живут совместно совсем непродолжительное время. Например в обработчике «При чтении на сервере». Но данный обработчик вызывается только при открытии уже записанного объекта (далее — документа).
Более подробно «Разработка управляемого интерфейса» В.А.Ажеронок, А.В. Островерх, М.Г.Радченко, Е.Ю.Хрусталева, гл. 3.8 стр. 404
Может возникнуть желание воспользоваться методами Глобального контекста
ПолучитьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>)
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>)
Но, все же, это не наш случай. Вторым параметром необходимо передавать ссылку, а ее то у нас и нет (объект еще не записан в базу данных).
Поэтому, было найдено следующее решение.
План наступления:
1. НА КЛИЕНТЕ:
1.1 Создаем форму нового документа (метод гл. контекста «ПолучитьФорму»)
1. 2 Получаем объект новой формы — это пока лишь основной объект формы (представляет собой универсальную коллекцию).
2. НА СЕРВЕРЕ:
2.1 Вспомогательные действия (не обязательные). Получаем данные для заполнения нового документа.
2.2 Получим документ — объект. Это именно объект информационной базы (Тип — Документ объект)
2.3 Вызовем обработчик заполнения нового документа (ОбработкаЗаполнения)
2.4 Производим обратное преобразование: документ объект — в основной объект формы (универсальную коллекцию)
3. НА КЛИЕНТЕ:
3.1 Теперь в контексте клиента имеем две коллекции основного реквизита:
одна — созданная при создании формы (пока пустая)
вторая — та, которую заполняли на сервере (ее и требуется отобразить)
Поэтому, теперь необходимо подменить основной реквизит созданной на шаге 1.1 формы на заполненный нами (на шаге 2.3). Простое присвоение значения не пройдет. Необхоидимо перезаполнить коллекцию. Удобнее это выполнить с помощью специального метода глобального контекста КопироватьДанныеФормы(<Источник>, <Приемник>)
3.1 Открываем подготовленную форму.
Собственно решение
&НаКлиенте
Процедура ОткрытьФормуНовогоДокумента(Команда)
// 1.1
// Получаем форму нового подчиненного документа
ФормаПодчиненного = ПолучитьФорму(«Документ.ПеревыставлениеТоваровУслуг.ФормаОбъекта»);
// 1.2
// Получим объект формы — это Новый — создаваемый объект
ОбъектФормы = ФормаПодчиненного.Объект;
// 2. Передадим управление на сервер.
ЗаполнитьПодчиненныйДокументПеревыставленияНаСервере(ОбъектФормы, Объект.Ссылка);
// 3.1
// В ранее созданной форме нового документа переопределим объект — документ (подменим его на заполненный документ)
КопироватьДанныеФормы(ОбъектФормы, ФормаПодчиненного.Объект);
// 3.2
ФормаПодчиненного.Модифицированность = Истина; // Чтобы выдавалось сообщение при попытке закрыть документ без сохранения
ФормаПодчиненного.Открыть();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьПодчиненныйДокументПеревыставленияНаСервере(ОбъектФормы, ДокументОснование)
// 2.1
// Подготовим данные для заполнения нового документа
ДанныеДляЗаполнения = Документы.ПоступлениеПеревыставляемыхТоваровУслуг.ПолучитьСтруктуруДанныхЗаполнения();
// 2.2
// Получим документ-объект (для дальнейшего заполнения)
ДокументОбъект = ДанныеФормыВЗначение(ОбъектФормы, Тип(«ДокументОбъект.ПеревыставлениеТоваровУслуг»));
// 2.3
// Вызовем процедуру обработки заполнения
ДокументОбъект.Заполнить(ПараметрыОтбораПеревыставления);
// 2.4
// Преобразуем прикладной объект — в объект формы (коллекцию)
ЗначениеВДанныеФормы(ДокументОбъект, ОбъектФормы);
КонецПроцедуры
Резюме:
Вот собственно и все. Для любителей пофлудить — очередная тема поупрожняться в собственном величии. ))) Если кому помог советом — очень рад. У кого возникнут вопросы по существу — обращайтесь, обсудим.

