Полное копирование одной формы в другую
Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде «покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал». Тем не менее, мне стало интересно, как это можно сделать.
- Описание
- Подробнее
Описание
Возможные варианты использования:
- У вас есть документ, вам надо что-то в нем поменять, но срабатывает событие "при изменении" и едут суммы. Во внешней форме можно это сделать без обработчиков событий.
- Вам нужно заполнить реквизит формы (не объекта). Групповое изменение реквизитов работает с объектами, а не с данными формы.
- Нужно изменить заблокированные реквизиты формы (серенькие).
Изначально идея была такова (упрощенно):
ФормаИсточник = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта");
ФормаПриемник = ПолучитьФорму("ВнешняяОбработка.с_ЗаполнениеИзВнешнейФормы.Форма");
Для Каждого ЭлементИсточник Из ФормаИсточник.Элементы Цикл
ЭлементПриемник = ФормаПриемник.Элементы.Добавить(ЭлементИсточник.Имя,
ЭлементИсточник.ТипЭлемента, ФормаПриемник.Элементы[ЭлементИсточник.Родитель.Имя]);
ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник);
КонецЦикла;Но такой подход оказался нежизнеспособным. Для того чтобы скопировать элементы одной формы на другую, нужно иметь к ним обеим одновременный доступ. А из-за того, что метод ПолучитьФорму() доступен только на клиенте, управлять копированием можно только с клиента. Но на клиенте недоступно свойство ПутьКДанным элементов формы, не доступен метод ПолучитьРеквизиты(). Они доступны только в серверном контексте. А к нему есть доступ только у самой формы.
Поместить форму во временное хранилище и передать через клиента адрес тоже не получится, потому что она не сериализуется. Единственный выход — сериализовать форму самостоятельно.
