Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 12:32

Как в управляемом приложении создать новый документ, заполнить его ТЧ и открыть его форму без записи в базу?

Автор Истребитель, 23 июл 2015, 15:26

0 Пользователей и 1 гость просматривают эту тему.

Истребитель

Сабж.

Я перепробовал много интуитивных решений, но все они не подходхят.

Я знаю, что можно использовать ОткрытьФорму, чтобы на клиенте создать новый_документ, открыть его форму и передать структуру, которая будет обработана методом "обработка заполнения", но в этом случае мне придется править конфигурацию, чтобы добавить свой код в обработку заполнения типового документа, понятное дело, что этого делать нельзя.

Если создать документ на сервере, я не знаю как его без сохранения передать на клиент. Ссылку передать нельзя т.к. её не существует до того, как документ сохранен, а объект передать нельзя, потому что при передаче валится с ошибкой.

Истребитель

Похоже, решение найдено:
http://infostart.ru/public/189390/

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

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

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

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

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

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

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

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

Резюме:

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


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск