Каталог решений - Безудержный танец с бубном или «Как открыть форму незаписанного документа в управляемом приложении»

Безудержный танец с бубном или «Как открыть форму незаписанного документа в управляемом приложении»

Безудержный танец с бубном или «Как открыть форму незаписанного документа в управляемом приложении»

В наличии

Вы уже начали работать с управляемым приложением?
А вам уже доводилось открывать форму незаписанного документа (справочника)?
Когда пользователь должен сам принять решение о необходимости его записи.
То, что было просто в обычных формах — превратилось в забавную камасутру в управляемом интерфейсе.

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

Категория:

Описание

Во первых: Почему так сложно?

Причина в том, что в обычном приложении и объект и форма живут вместе на протяжении всей жизни формы.

На управляемых формах все несколько иначе. Объект и форма живут совместно совсем непродолжительное время. Например в обработчике «При чтении на сервере». Но данный обработчик вызывается только при открытии уже записанного объекта (далее — документа).

Более подробно «Разработка управляемого интерфейса» В.А.Ажеронок, А.В. Островерх, М.Г.Радченко, Е.Ю.Хрусталева, гл. 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
    // Преобразуем прикладной объект — в объект формы (коллекцию)
   
ЗначениеВДанныеФормы(ДокументОбъект, ОбъектФормы);

КонецПроцедуры


Резюме:

Вот собственно и все. Для любителей пофлудить — очередная тема поупрожняться в собственном величии. ))) Если кому помог советом — очень рад. У кого возникнут вопросы по существу — обращайтесь, обсудим.

has been added to your cart:
Оформление заказа