Имя: Пароль:
1C
1C 7.7
v7: Форма.Параметр Форма.Закрыть() Как передать параметр из закрываемой формы
0 lmlg1
 
17.11.16
19:36
Доброго времени суток, уважаемые  форумчане!
1сv7.7 Старая конфа, нужно кой чего дописать
Задача: Обработка1(o1) и Обработка2(о2) внешние
Нужно чтобы Обработка1 запускала Обработку2 с передаваемым в О2 параметром. о2 открывается и в процедуре приОткрытии() по условиям переданного в о2 параметра запускается та или иная функция(ф1). Тут вроде все понятно. Теперь вопросы: как закрыть форму о2 и обратно в о1 передать результат ф1?
О1
Функция   ОтправитьЗапросОстатки()  //lm  
    Рез=0;
    Результат="ОтправитьЗапросОстатки";
    Если (ОткрытьФорму("Отчет",Результат,ПутьФ+"О2.ert")=1) тогда//
        Если (нрег(СокрЛП(Результат)) = нрег("ГрупповойКонтекст")) тогда//
            Рез=Результат.Форма.Параметр;
            //Результат.Форма.Закрыть();
        КонецЕСли;  //
    КонецЕСли;  //;  
    Возврат Рез;
КонецФункции //


обработка2 o2
Процедура ПриОткрытии()
    Авто=0;
    Если (СокрЛП(Форма.Параметр)="ОтправитьЗапросОстатки") тогда//
        Ост=0;
        Ост2=0;
        СпиДок=СоздатьОбъект("СписокЗначений");
        Ост=ОтправитьЗапросОстатки();  //04.8441 20161112-4
        Спидок.ДобавитьЗначение(Ост);
        Ост2=ОтправитьЗапросОстаткиR2();  //04.8441 20161112-4
        Спидок.ДобавитьЗначение(Ост2);
        Форма.Параметр=СпиДок;  
        Авто=1;
    КонецЕСли;  //lm  

Если (Авто=1) тогда//
        Форма.Закрыть();  //04.8441 20161112-4
        СтатусВозврата(0); //Спорная строка
    КонецЕСли;  //  
КонецПроцедуры;

Если оставляю спорную строку(третья снизу СтатусВозврата(0);), то форма о2 закрывается, но не передает параметр. Если убираю спорную строку, то Форма НЕ закрывается, но передает параметр.
Как сделать чтобы и форма закрылась и параметр передался?
Форма.Закрыть(0)-пробовал, НЕ помогает.
Заранее благодарен за ответ
1 Torquader
 
17.11.16
19:55
И чего может быть сложного ?
Если мы в параметре передаём список значений (только в функцию ОткрытьФорму нужно будет передать другую переменную, в которую скопировать переменную списка.
Тогда форма изменяет список и в основной форме это видно.

Другое дело, что нужно также передавать ссылку на основную форму, чтобы можно было её как-то пнуть, например, через ложное закрытие - можно также через повторное открытие, но нужно передать имя формы, чтобы её можно было повторно открыть и через тот же параметр передать ей команду.
2 Lazy Stranger
 
17.11.16
20:22
я бы не парил себе мозг:
ОткрытьФормуМодально()
и тогда можно просто через глобальную переменную результат передать
3 Torquader
 
17.11.16
20:50
(2) Только переключиться в меню нельзя.
4 lmlg1
 
17.11.16
21:56
Спасибо,откликнувшимся.
  (1)Torquader. Видимо мои познания в 1С не дотягивают до Ваших, поэтому применить теоретическую трактовку в практическую не могу. Если возможно кусочек кода, того что Вы облекли в слова.
(2)Lazy Stranger. Спасибо учту,  но не хотел лезть в глобальник.
Заранее благодарен.
5 Torquader
 
17.11.16
23:28
В форме, из которой вызываем:
Перем СписокДляОбмена;
Перем ДочерняяОбработка;

Процедура ОткрытиеДругойФормы()
СписокДляОбмена=СоздатьОбъект("СписокЗначений");
СписокДляОбмена.ДобавитьЗначение(0,"ОтветГотов");
СписокДляОбмена.ДобавитьЗначение(ПараметрыДляФормы,"Параметры");
СписокДляОбмена.ДобавитьЗначение(Контекст,"Родитель");
ВременнаяПеременная=СписокДляОбмена;
РезультатОткрытия=ОткрытьФорму("Обработка.Форма2",ВременнаяПеременная);
Если РезультатОткрытия=1 Тогда
  ДочерняяОбработка=ВременнаяПеременная;
КонецЕсли;
КонецПроцедуры

Процедура ОбработатьОтвет(ДанныеОтвета)
// здесь обработка ответа
КонецПроцедуры

Процедура ПриЗакрытии()
Если ТипЗначенияСтр(СписокДляОбмена)="СписокЗначений" Тогда
  ГотовностьОтвета=СписокДляОбмена.Получить("ОтветГотов");
  Если ГотовностьОтвета=0 Тогда
   // проверяем, что дочерняя обработка ещё открыта
   Если ТипЗначения(ДочерняяОбработка)=100 Тогда
    СтатусВозврата(0);
    Сообщить("Закончите работу с дочерней обработкой");
    Возврат;
   КонецЕсли;
   // иначе она закрыта без уведомления
  Иначе
   // ответ готов - как бы - ложное закрытие
   СтатусВозврата(0);
   ДанныеОтвета=СписокДляОбмена.Получить("ДанныеОтвета");
   ОбработатьОтвет(ДанныеОтвета);
   Возврат;
  КонецЕсли;
КонецЕсли;
// здесь далее обработка закрытия
КонецПроцедуры

// дочерняя форма

Перем ПараметрыЗапуска;

Процедура ПриОткрытии(ФлагЧенияНастроек)
ПараметрыЗапуска=Форма.Параметр;
// проверим, что параметры переданы
Если ТипЗначенияСтр(ПараметрыЗапуска)<>"СписокЗначений" Тогда
  Сообщить("Не переданы параметры запуска");
  СтатусВозврата(0);
  Возврат;
КонецЕсли;
КонецПроцедуры

// если что-то передали ещё раз
Процедура ПриПовторномОткрытии()
ВременныйПараметр=Форма.Параметр;
Если ТипЗначенияСтр(ВременныйПараметр)="СписокЗначений"
  ПараметрыЗапуска=ВременныйПараметр;
Тогда
КонецЕсли;
КонецПроцедуры

Процедура ВыполнитьПередачуЗначенияРодителю(ПередаваемоеЗначение)
Родитель=ПараметрыЗапуска.Получить("Родитель");
Если ТипЗначения(Родитель)<>100 Тогда
  Сообщить("Родительскую форму уже закрыли и нет смысла туда что-то передавать");
  Возврат;
КонецЕсли;
ПараметрыЗапуска.Установить("ДанныеОтвета",ПередаваемоеЗначение);
ПараметрыЗапуска.Установить("ОтветГотов",1);
Родитель.Закрыть(0);
КонецПроцедуры
6 lmlg1
 
17.11.16
23:32
(5)Спасибо, с утра попоробую
7 Torquader
 
17.11.16
23:40
(6) Я код писал по памяти, изредка заглядывая в описание команд, так что, если что-то не взлетит - заглянуть в СП и посмотреть на порядок команд.

Ну и я про закрытие дочерней формы забыл - после передачи параметра она остаётся открытой - там надо Форма.Закрыть(0) в конце вставить.
8 lmlg1
 
18.11.16
10:32
(5) Бегло посмотрел код. Еще раз спасибо принцип ясен. Не понял только, Мы обрабатываем ответ только при закрытии о1? Теоретически я могу обработать ответ в любой процедуре правильно? Сейчас загрузили задачей другой, как смогу попробую.
9 Масянька
 
18.11.16
10:49
(8) Очень рекомендую разобраться. Например, открой реализацию и разбери подбор номенклатуры. Разберешь - станет намного понятнее с передачей параметров откуда-то куда-то.
10 lmlg1
 
18.11.16
13:07
(9)Да как передавать параметры вроде понятно. Не понятно, от чего вторая форма сформировав нужный ответ не закрывается.
11 Масянька
 
18.11.16
13:08
(10) Да ничего тебе не понятно.
12 lmlg1
 
18.11.16
17:57
Спасибо всем. Уважаемый  Torquader, Вам отдельное СПАСИБО. По Вашим рекомендациям все получилось.
13 lmlg1
 
18.11.16
17:59
В конце кода для дочерней формы нужно было
14 lmlg1
 
18.11.16
17:59
Форма.Закрыть(0);  //04.8441 20161112-4
        СтатусВозврата(0);
15 Torquader
 
19.11.16
01:43
(14) А Статус возврата зачем - там же обычная функция по кнопке вызывается - ей этот статус - до лампочки.
16 lmlg1
 
19.11.16
12:45
(15) Без него дочерняя форма висит мордой кирпичом и не закрывается. :(
17 Злопчинский
 
19.11.16
12:48
Если пред определённая вызывает другие процы, то в них можно статус ставить, он будет для вызвавшей мамы