Передача реквізитів об'єкта з основної форми в додаткову і назад на керованих формах

Напевно, багато хто стикався з ситуацією, коли в якогось редагованого об'єкта (довідник, документ, зовнішня обробка) крім основної форми потрібно зробити парочку додаткових, щоб частина реквізитів заповнювати в них, а потім повертати заповнені значення в основну форму і в сам об'єкт. І якби йшлося про звичайні формах, то проблеми б і не було. Але в керованих формах з цим виникає проблема, а в разі відмови від модальності вона стає трохи більше.

Перша частина проблеми в тому, що сам Об'єкт (ДокументОб'ект, СправочнікОб'ект, ОбработкаОб'ект) живе на сервері, а на клієнт передається тільки його копія з відтвореної структурою. Тому періодично доводиться вдаватися до методів на кшталт "РеквізітФормиВЗначеніе". У випадку з основною формою об'єкта проблем майже немає. Реквізити форми заповнюються, реквізити об'єкта теж.

Але друга частина проблеми настає тоді, коли нам потрібно вивести додаткову форму і частину реквізитів заповнити в ній. Тоді з'ясовується, що реквізити на додатковій формі не заповнюються і назад теж не передаються. Хоча форма не довільна, а належить обробці, і реквізит Об'єкт - основний, і структура об'єкта на ній теж відтворюється. Але даних чомусь немає. Для тих, хто з керованими формами працює не дуже довго або не дуже щільно, це стає проблемою, як я з'ясував, начитавшись форумів з подібними запитами. А вся сіль в тому, що у цієї додаткової форми реквізит Об'єкт - свій. І він не має відношення до Об'єкту основної форми. Відтворюється тільки структура об'єкта, без даних. Така сувора реальність тонкого клієнта)))

Ось і я не так давно зіткнувся з цією проблемою і витратив пару годин на "куріння" різних форумів. Мені потрібно було зробити зовнішню обробку, у якій є кілька додаткових форм, в яких вводяться додаткові дані, в тому числі табличні. В цьому випадку всі реквізити повинні зберігатися в реквізитах і табличних частинах обробки і виводитися фрагментарно на різних формах. Така собі замкнута міні-система. Дані з обробки потім зберігаються в зовнішнє БД, але це вже окрема історія.

В основному на що я натрапив при пошуках, це прохання про допомогу і купа стьобу без слушних пропозицій.

Кілька рішень, правда, запропоновано було, але всі вони виглядали досить громіздко. В основному це або метод ПолучітьФорму (), потім заповнення реквізитів отриманої форми і її модальное відкриття, а потім виконання операцій після її закриття. Але в разі відмови від модальності 1С постійно на це лається. Інший варіант - створення структури, занесення в неї значень всіх необхідних реквізитів з основної форми, а потім передача цієї структури в якості вхідного параметра при відкритті додаткової форми. А при закритті додаткової форми потрібно знову створити структуру і передати її назад в основну форму. При цьому в обох формах потрібно прописати читання цих параметрів і заповнення реквізитів у одержувача. На одному з форумів, де пропонували подібний метод, хтось справедливо заперечив, що при передачі сотні реквізитів і десятка таблиць це стає проблемою. У підсумку все відчувають, що рішення має бути простіше, але ніхто його так і не озвучив. Так багато зайвого коду мені прописувати дуже не хотілося, тому я продовжив копати в пошуках ідеального рішення. Пара висловлених думок підказали мені в якому напрямку копати, і. Рішення виявилося простим, як все геніальне!

Оскільки структура об'єктів в обох формах у нас ідентична, різниться тільки перелік реквізитів, які видно на формі, ніщо не заважає нам передати цілком весь Об'єкт і заповнити його копію, а потім просто повернути його назад. Головне - правильно це зробити.

Припустимо, нам потрібно по кнопці відкрити додаткову форму з парою реквізитів і табличній частиною обробки, заповнити її, а потім повернути назад, при цьому таблиця на основній формі не відображається.

На стороні основної форми ми пишемо:

На стороні додаткової форми ми пишемо так:

Після цього додаткова форма буде заповнена. Потім ми робимо необхідні махінації з реквізитами і таблицями і хочемо передати результат назад. для цього ми прописуємо подія у додатковій форми:

І, відповідно, знову на боці основної форми нам потрібно прийняти результат:

Можливо, для когось це рішення здасться очевидним і він давно саме так і робить, але мені раніше подібного робити не доводилося, а при читанні форумів я подібного рішення не знайшов. Сподіваюся, кому-то моє дослідження стане в нагоді.

До речі, з повним ім'ям форми теж можуть виникнути деякі незручності, адже повне ім'я задається як "ВнешняяОбработка.ІмяОбработкі.Форма.ІмяФорми". І якщо обробку перейменувати, то виклик доп. форм теж доведеться виправити. Одне, що у нас в такому випадку не змінюється - це властивість ІмяФорми. Таким чином, отримавши повне ім'я основний і підмінивши останній фрагмент на ім'я доп. форми, ми отримаємо повне ім'я доп. форми. І для цього можна використовувати ось таку невелику функцію:

завантажити файли