Имя: Пароль:
1C
1С v8
Управляемые формы
0 Дарья_92
 
15.10.13
08:08
Здравствуйте, есть такая задача: Передать одну формы (допустим, документа) на другую, при этом  заполнить значениями первой. Грубо говоря скопировать.Обработка должна подходить для многих документов, поэтому формирование второй формы должно происходить динамически, а не жестко.
Я не могу понять, как это сделать. Пока попробовала, для примера, создать Внешнюю Обработку и передать данные в Обработку "Получатель". Передает, записывает, но у Обработки "Получатель" есть такая же ТЗ, как и у ВнешнейОбработки, а если ее не будет, как делать??

Код ВнешнейОбработки:

&НаКлиенте
Процедура Получить(Команда)
    
    Форма = ПолучитьФорму("Обработка.Получатель.Форма");
    Форма.АдресВременногоХранилища = ПолучитьТЗ();
    Форма.Открыть();
    
КонецПроцедуры




&НаСервере
Функция ПолучитьТЗ()
    
     Возврат ПоместитьВоВременноеХранилище(ТабЗнач.Выгрузить(), Новый УникальныйИдентификатор);
    
КонецФункции

КодОбработки Получатель

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПриОткрытииНаСервере();
КонецПроцедуры


&НаСервере
Процедура ПриОткрытииНаСервере()
    
    // форма должна формироваться сама!!!!!!!!!!!
        
    ТабИзменений = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    
    ТЗ.Загрузить(ТабИзменений);
    
    Мдк = ЭтаФорма.Команды.Добавить("ИзменитьДанные");
    Мдк.Действие = "Изменить";
    Элемент1 = ЭтаФорма.Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"), ЭтаФорма);
    Элемент1.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
    Элемент1.ИмяКоманды = "ИзменитьДанные";
    
КонецПроцедуры
1 Rovan
 
гуру
15.10.13
08:11
(0) зачем ?
2 Defender aka LINN
 
15.10.13
08:12
Переводчик, в зале есть переводчик?
3 Feunoir
 
15.10.13
08:17
(0) Без фотки не взлетит.
4 IamAlexy
 
15.10.13
08:20
(0) а в чем проблема ?
пройдись циклом по реквизитам формы и запиши их в структуру, создай новую форму и заполни из структуры..


делов то...
5 Дарья_92
 
15.10.13
17:33
Новую форму создавать в этой же обработке или в другой?

просто я новичок и мне сложновато пока.

Можно, пожалуйста, пример кода.
6 DexterMorgan
 
15.10.13
17:52
(4) ваще та у управляемой формы есть расширение для спр. и документов - параметр ЗначенияЗаполнение, который можно просто передать например в функцию ОткрытьФорму()
7 DexterMorgan
 
15.10.13
17:52
походу это ннада
8 DexterMorgan
 
15.10.13
17:52
хотя не уверен
9 Дарья_92
 
15.10.13
18:03
Надо чтобы в форме документа была кнопка (кнопку я создала) по нажатию которой нужно сделать грубо говоря копию документа немного поменяв строки в табличной части и переключиться обратно в форму этого документа.
10 sikuda
 
15.10.13
18:15
Теряете Вы хватку ребята - Дата регистрации: 15 октября 2013; сегодня и без фото.
11 elCust
 
15.10.13
18:24
Дашунь, где фотка то?!
12 Дарья_92
 
15.10.13
18:29
Да пожалуйста! Вы только помогите мне) И желательно на примере прям, а не посмотри в сп, потому что по началу сп мало где помогает.
13 Зойч
 
15.10.13
18:30
Ктож тебе такую задачу дал то? Наверняка чтоб доказать что ты полный 0 и выкинуть тебя на...
14 Дарья_92
 
15.10.13
18:35
Умеете вы утешить. Устроилась на работу, дали такое задание. Объясняю им, я - пока еще вообще студент, и все что проходили в универе на работе сказали забыть...Но это все откоряки всякие. Я не полный 0 и хочу разобраться в вопросе.

Подумала может как то можно скопировать форму текущего документа и передать в другой?

Типо
Форма = ЭтотОбъект.Скопировать();
Форма.АдресВременногоХранилища = ПолучитьТЗ();
Форма.Открыть();
15 Зойч
 
15.10.13
18:36
(14) ибо задача далеко не тривиальна. И может даже не иметь полного решения
16 Зойч
 
15.10.13
18:37
Хотя если ограничиться только копированием реквизитов (данных, а не создание новых)
17 elCust
 
15.10.13
18:39
Ну погоди, форма другого документа может не содержать подобного набора реквизитов?
18 wald
 
15.10.13
18:46
В (4) ответ. Вопрос другой, зависит ли заполнение тех или иных реквизитов зависит от различных условий? А если набор реквизитов совсем различный?
19 Дарья_92
 
15.10.13
18:48
Вторая форма - это форма обработчика, она абсолютно пустая. В эту пуста. форму нужно передать форму документа.
20 SUA
 
15.10.13
18:50
а зачем?
форму - передать нельзя
значения реквизитов - можно
21 Дарья_92
 
15.10.13
18:51
не обработчика, а обработки, извиняюсь.  передать форму ЛЮБОГО документа, не в зависимости от его реквизитного состава.
22 Дарья_92
 
15.10.13
18:51
Как передать значения реквизитов?
23 SUA
 
15.10.13
18:57
1 - прочитать все реквизиты текущей формы
2 - для передачи ТЗ код в общем правильный, для реквизитов передавать структуру
3 - при создании формы обработки (есть не при открытии, сразу при создании) создать реквизиты формы обработки какие нужно
(см РеквизитФормы в синтакс-помощнике), как раз вместо комментария, и элементы формы (немного по элементам уже есть кода в 0)
4 - загрузить данные (в общем правильно)
24 Лоботряс
 
15.10.13
19:32
КопироватьДанныеФормы()
25 Дарья_92
 
15.10.13
21:24
а что значит прочитать все реквизиты текущей формы?
26 Eugeneer
 
15.10.13
21:32
Пихаем все в структуру параметров.
Все данные. чере перебор по метаданным.

Выгружаем во временное хранилище.

При открытии второй или какой там формы получаем по адресу из хранилище структуру этих параметров.

Опять же универсально делаем заполнение свойств.

При этом же надо обязательно учитывтьа обработчики многих реквизитов, так как в УТ11 слишком много невидимых различных полей которые заполняются в обработчиках.

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


Дал полный ответ. Если ничего не понятно. Ну чо сказать - не судьба тебе работать.
27 Eugeneer
 
15.10.13
21:33
Пихаем все в структуру параметров.
Все данные. чере перебор по метаданным.

Выгружаем во временное хранилище.

При открытии второй или какой там формы получаем по адресу из хранилище структуру этих параметров.
28 Eugeneer
 
15.10.13
21:35
Вот кусок кода в источнике

Функция ПоместитьДанныеВоВременноеХранилище()
    
    Перем СтруктураПараметров;
    
    СтруктураПараметров = Новый Структура;
    СтруктураПараметров.Вставить("Партнер",Объект.Партнер);
    СтруктураПараметров.Вставить("Производитель",Объект.Производитель);
    СтруктураПараметров.Вставить("Соглашение",Объект.Соглашение);
    СтруктураПараметров.Вставить("ВидЦенНоменклатурыЗакупочная",Объект.ВидЦенНоменклатурыЗакупочная);
    СтруктураПараметров.Вставить("ВидЦенНоменклатурыПродажи",Объект.ВидЦенНоменклатурыПродажи);
    
    СтруктураПараметров.Вставить("мегапрайсАвтоматическиСоздаватьНовыхПроизводителей",Объект.мегапрайсАвтоматическиСоздаватьНовыхПроизводителей);
    СтруктураПараметров.Вставить("мегапрайсКонтрольАртикулаИНаименования",Объект.мегапрайсКонтрольАртикулаИНаименования);
    СтруктураПараметров.Вставить("мегапрайсКонтрольПоПроизводителям",Объект.мегапрайсКонтрольПоПроизводителям);
    СтруктураПараметров.Вставить("мегапрайсСоздаватьШтрихкодыДляНовойНоменклатуры",Объект.мегапрайсСоздаватьШтрихкодыДляНовойНоменклатуры);
    
    СтруктураПараметров.Вставить("ТабличнаяЧасть",Объект.ТабличнаяЧасть.Выгрузить());
    СтруктураПараметров.Вставить("СвойстваНоменклатуры",Объект.СвойстваНоменклатуры.Выгрузить());
    СтруктураПараметров.Вставить("СвойстваХарактеристик",Объект.СвойстваХарактеристик.Выгрузить());
    СтруктураПараметров.Вставить("НастройкаПоиска",Объект.НастройкаПоиска.Выгрузить());
    
    Адрес = ПоместитьВоВременноеХранилище(СтруктураПараметров,Новый УникальныйИдентификатор);
    
    Возврат Адрес;
    
КонецФункции



&НаКлиенте
Процедура ВыполнитьПоступлениеТоваровУслуг(Команда)
    
    АдресПередаваемыхПараметров = ПоместитьДанныеВоВременноеХранилище();
    
    СтруктураПараметров = Новый Структура;
    СтруктураПараметров.Вставить("Адрес",АдресПередаваемыхПараметров);
    
    Попытка
        АдресВоВременномХранилище = ОткрытьФорму("Обработка.мегапрайсРасширеннаяЗагрузкаИзExcel.Форма.ФормаСоздатьПоступление",СтруктураПараметров,ЭтаФорма);
    Исключение
        АдресВоВременномХранилище = ОткрытьФорму("ВнешняяОбработка.мегапрайсРасширеннаяЗагрузкаИзExcel.Форма.ФормаСоздатьПоступление",СтруктураПараметров,ЭтаФорма);
    КонецПопытки;
    
КонецПроцедуры
29 Eugeneer
 
15.10.13
21:36
Вот кусок кода в приемнике

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    УстановитьПривилегированныйРежим(Истина);

    СтруктураПараметров = ПолучитьИзВременногоХранилища(Параметры.Адрес);
    АдресВХранилище = Параметры.Адрес;
    
    Объект.Партнер                      = СтруктураПараметров.Партнер;
    Объект.Соглашение                   = СтруктураПараметров.Соглашение;
    Объект.ВидЦенНоменклатурыЗакупочная = СтруктураПараметров.ВидЦенНоменклатурыЗакупочная;    
    Объект.ТоварыПоступление.Очистить();
    
    Для Каждого Строка из СтруктураПараметров.ТабличнаяЧасть Цикл
        Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда
            Продолжить;
        КонецЕсли;
        
        НоваяСтрока = Объект.ТоварыПоступление.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);        
    КонецЦикла;
    
КонецПроцедуры
30 Дарья_92
 
15.10.13
21:54
Спасибо огромное за ответ, я все понимаю, но вторая форма обработки должна подходить для ВСЕХ документов, а ведь не во всех документах будет
Объект.Партнер                      = СтруктураПараметров.Партнер;
    Объект.Соглашение                   = СтруктураПараметров.Соглашение;
    Объект.ВидЦенНоменклатурыЗакупочная = СтруктураПараметров.ВидЦенНоменклатурыЗакупочная;

Структура каждого документа разная. Значит и форма обработки должна формироваться динамически, а не иметь жесткую структуру.
31 Eugeneer
 
15.10.13
22:01
(30) дело техники