8.х Передача значения из одной формы в другую

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем quazare, 9 апр 2009.

  1. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Привет, народ!
    Прошу подсказать следующее - есть документ - у него есть 2 формы - форма элемента и произвольная форма.
    Задача такая - я нажимаю кнопку на форме элемента, открывается произвольная форма, в нее я ввожу число - произвольная форма закрывается - число передается в форму элемента.

    Вообщем, как организовать передачу данных м-ду формами, если они обе присутствуют в одном документе???

    Спасибо!
  2. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    Если надо просто ввести какое-то значение проще воспользоваться ВвестиЗначение()
    или если надо как у вас тогда:

    Код:
    Значение = Форма.Открыть();
    
    
    
  3. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код:
    ОткрытьМодально()
    
  4. tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    в вызываемую форму:
    через реквизит
    через глобальную переменную
    через константу/справочник/регистр
    через сохранитьЗначение()

    в "материнскую" форму:
    через "ОповеститьОВыборе"
    через глобальную переменную
    через константу/справочник/регистр
    через ВосстановитьЗначение()


    ну и через реквизит объекта
  5. AlexFF
    Offline

    AlexFF Разбирающийся

    Регистрация:
    6 мар 2007
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    26
    угу. модально.
  6. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    ОткрытьМодально() - означает, что "материнская" форма не активна, до закрытия "дочерней".
    Тут ситуация такая - я сформировать строки в табличной части "материнской" формы на основе выборки "дочерней" - такое же возможно?

    Вообщем код прилагается:

    Код:
    	ПоВыбранномуАртикулу=Строка(ЭлементыФормы.Артикул.Значение);
    
    Сообщить(ПоВыбранномуАртикулу);
    
    ВыборСуществующихПартий = Новый Запрос("ВЫБРАТЬ
    |	СкладскойРегистр.Регистратор КАК Регистратор,
    |	СкладскойРегистр.Период КАК Период,
    |	СкладскойРегистр.Артикул КАК Артикул,
    |	СкладскойРегистр.Номенклатура КАК Номенклатура,
    |	СкладскойРегистр.Группа КАК Группа,
    |	СкладскойРегистр.Количество КАК Количество
    |ИЗ
    |	РегистрНакопления.СкладскойРегистр КАК СкладскойРегистр
    |ГДЕ
    |	СкладскойРегистр.Артикул = &Артикул
    |
    |УПОРЯДОЧИТЬ ПО
    |	Период");	
    
    
    ВыборСуществующихПартий.УстановитьПараметр("Артикул",ПоВыбранномуАртикулу);										   
    Результат = ВыборСуществующихПартий.Выполнить().Выбрать();
    
    //================================================
    СтруктураПодбора = Новый Структура;
    //================================================		
    Пока Результат.Следующий() Цикл
    
    Сообщить(Результат.Регистратор);	
    Сообщить(Результат.Период);
    Сообщить(Результат.Артикул);
    Сообщить(Результат.Номенклатура);
    Сообщить(Результат.Группа);
    Сообщить(Результат.Количество);
    Сообщить("===================");
    
    КонецЦикла;
    
    ОповеститьОВыборе(СтруктураПодбора)
    
    
    Я же по идее могу отправить "Результат" вместо "СтрукрураПодбора" в "материнскую" форму, а потом на основе его сформировать табличную часть???

    Только вопрос - как "Результат" отловить в "материнской" форме?
  7. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Можно воспользоваться методом Выгрузить().
    Вот, держи обработочку, когда-то писал, немного кривовато :unsure:

    Вложения:

  8. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    ЭтотОбъект.ТаблицаЗначений.Загрузить(Запрос.Выполнить().Выгрузить()); - вот эта строка меня интересовала (ссылки внутри объекта) - буду пробовать...
  9. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Все-таки вопрос пока остается открытым...

    Я сделал следующее:
    1.Через "дочернюю" форму я выбрал все необходимые партии по списанию и определил количество номенклатуры в каждой партии для списания.

    Выглядит вот так:

    Код:
    ===================
    Ид партии: 000000003-1
    Изначально в партии: 123
    Списать с партии: 123
    Склад: Склад №1
    Артикул: 11100
    Номенклатура: АВАНДАМЕТ 0,002/0,5 N56 ТАБЛ П/О
    Группа: ЖВЛС
    Производитель: Производитель №2
    Срок годности: 22.05.2009 0:00:00
    Серия: серия 22
    Место хранение: 1-1-1-2
    Сертификат этой партии: Сертификат 12321
    ===================
    Ид партии: 000000004-1
    Изначально в партии: 333
    Списать с партии: 333
    Склад: Склад №1
    Артикул: 11100
    Номенклатура: АВАНДАМЕТ 0,002/0,5 N56 ТАБЛ П/О
    Группа: ЖВЛС
    Производитель: Производитель №2
    Срок годности: 08.04.2009 0:00:00
    Серия: серия 22
    Место хранение: 1-1-2-3
    Сертификат этой партии: Сертификат 12321
    ===================
    Ид партии: 000000005-1
    Изначально в партии: 44
    Списать с партии: 44
    Склад: Склад №1
    Артикул: 11100
    Номенклатура: АВАНДАМЕТ 0,002/0,5 N56 ТАБЛ П/О
    Группа: ЖВЛС
    Производитель: Производитель №1
    Срок годности: 30.04.2009 0:00:00
    Серия: серия 22
    Место хранение: 1-2-3-4
    Сертификат этой партии: Сертификат 12321
    ===================
    Ид партии: 000000009-1
    Изначально в партии: 22
    Списать с партии: 21
    Склад: Склад №1
    Артикул: 11100
    Номенклатура: АВАНДАМЕТ 0,002/0,5 N56 ТАБЛ П/О
    Группа: ЖВЛС
    Производитель: Производитель №2
    Срок годности: 28.05.2009 0:00:00
    Серия: 1-1-2-1
    Место хранение: Сертификат 12321
    Сертификат этой партии:
    
    "Дочернюю" форму я закрываю так

    Код:
    Готово = Новая Структура();
    ОповеститьОВыборе(Готово);
    
    Как "выловить" событие ОповеститьОВыборе(Готово) в "материнской форме" - пока не знаю...

    Теперь мне надо как-то передать сию выборку в таблицу "материнской" формы.

    Как правильнее будет??? Думаю о глобальном массиве или как-то еще...

    Если можно, подскажите в кратце хотябы...
  10. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Поля "материнской" формы должны совпадать с полями "дочерней" или наоборот.
  11. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Тогда, открывающаяся форма - просто форма, открытая в модальном режиме... думаю, что передачу данных нужно формировать через глобальный массив или как?
  12. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Да зачем? Сделай в "дочерней" форме такие же поля(или часть полей) как в "материнской", и потом сделай выгрузку в "материнскую".
  13. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    В модуле родительской формы должна быть процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) , которую оповещает метод Оповестить() или процедура ОбработкаВыбора(Результат, Источник), которую оповещает метод ОповеститьОВыборе(). А создавать поля, совпадающие с полями дочерних форм - неправильно. Что если дочерних форм с десяток?
  14. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Так потом все равно придется приводить типы. Что если в "дочерней" выбрали тип строка, а в "родительской" это ссылка?

    А так, я с тобой согласен, чтоб использовать такие функции:)
  15. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    вот эти поля формируются при выборе:

    Код:
    Пока НеПустые.Следующий() И ВыбранноеКоличество>0 Цикл
    
    Сообщить("===================");
    Сообщить("Ид партии: "+НеПустые.ИдНепустые);
    Сообщить("Изначально в партии: "+НеПустые.КоличествоОстаток);
    
    Если НеПустые.КоличествоОстаток<=ВыбранноеКоличество Тогда
    Сообщить("Списать с партии: "+НеПустые.КоличествоОстаток);
    Иначе
    Сообщить("Списать с партии: "+ВыбранноеКоличество);
    КонецЕсли;
    
    Сообщить("Склад: "+НеПустые.Склад);
    Сообщить("Артикул: "+НеПустые.Артикул);
    Сообщить("Номенклатура: "+НеПустые.Номенклатура);
    Сообщить("Группа: "+НеПустые.Группа);
    Сообщить("Производитель: "+НеПустые.Производитель);
    Сообщить("Срок годности: "+НеПустые.СрокГодности);  
    Сообщить("Серия: "+НеПустые.Серия);
    Сообщить("Место хранение: "+НеПустые.МестоХранения);
    Сообщить("Сертификат этой партии: "+НеПустые.Сертификат);
    
    ВыбранноеКоличество=ВыбранноеКоличество - НеПустые.КоличествоОстаток;
    
    КонецЦикла;
    

    "дочерняя" форма открывается так:

    Код:
    ФормаВыборки = ЭтотОбъект.ПолучитьФорму("ФормаЗапросаНоменклатуры");
    СписокПартий = ФормаВыборки.ОткрытьМодально();
    
    а закрыватся так:

    Код:
    ОповеститьОВыборе(НеПустые);
    
    - правильно ли это???


    По подробнее можете объяснить - что я не так делаю, какой должен быть обработчик события в "материнской" форме типа:

    ОбработкаОповещения(ИмяСобытия, Параметр, Источник), что здесь ИмяСобытия, Параметр и Источник??
  16. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    Ниччё не понял.

    Но если нужно передать некую сущность по имени "НеПустые", то нужно делать так.

    Код:
    //Это передача выбранного значения из дочерней формы
    
    ЗначениеВыбора = Новый Структура("Команда,НеПустые","ВыбраныНеПустые",НеПустые);
    ОповеститьОВыборе(ЗначениеВыбора);
    

    Это прием в родительской форме

    Код:
    Процедура ОбработкаВыбора(ЗначениеВыбора,Источник)
    
    Если ТипЗнч(ЗначениеВыбора) = Тип("Структура") Тогда
    
    Команда = Неопределено;
    Если ЗначениеВыбора.Свойство("Команда",Команда) = Истина
    Если Команда = "ВыбраныНеПустые" Тогда
    Непустые = Неопределено;
    Если ЗначениеВыбора.Свойство("Непустые",Непустые) = Истина Тогда
    // Теперь в родительской форме инициализирована переменная "НеПустые". Можно начинать с ней работу 
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    КонецЕсли;
    
    КонецПроцедуры
    
  17. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Код:
    //Это передача выбранного значения из дочерней формы
    
    ЗначениеВыбора = Новый Структура("Команда,НеПустые","ВыбраныНеПустые",НеПустые);
    ОповеститьОВыборе(ЗначениеВыбора);
    
    
    Это прием в родительской форме

    Код:
    Процедура ОбработкаВыбора(ЗначениеВыбора,Источник)
    
    Сообщить("Тест");
    
    КонецПроцедуры
    
    
    Чето вообще не отлавливается - даже так...
  18. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Напиши
    Код:
    Процедура ОбработкаВыбора(ЗначениеВыбора,Источник)
    
    [color=#FF0000]Сообщить(ЗначениеВыбора);
    
    КонецПроцедуры
    
  19. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    [/code]

    Чето вообще не отлавливается - даже так...
    [/quote]

    У вас владелец дочерней формы не назначен, наверное
    Форма = БЛаблабла.ПолучитьФорму("Основнаяформа",ЭтаФорма);

    ОповеститьОВыборе() оповещает форму- владелец, Оповестить() оповещает все открытые формы. Кстати, у вас синтаксис-помощник под рукой? ;-)
  20. TopicStarter Overlay
    quazare
    Offline

    quazare Опытный в 1С

    Регистрация:
    21 мар 2009
    Сообщения:
    95
    Симпатии:
    0
    Баллы:
    26
    Народ, может кто-нибудь привести работающий пример передачи переменной из одной формы в другую.

    У меня сделано так, но ничего не передает :(


    ФормаЭлемента - из нее будет открываться ФормаВыбора:

    Код:
    Процедура ОткрытьФормуЗапросаНажатие(Элемент)
    
    ФормаВыборки = ЭтотОбъект.ПолучитьФорму("ФормаВыбора", ЭтаФорма); 
    ФормаВыборки.Открыть(); 
    
    КонецПроцедуры
    
    
    Процедура ОбработкаВыбора(РезультатВыбора, ФормаВыбора)
    Сообщить(РезультатВыбора);	
    Сообщить("тест");
    КонецПроцедуры
    
    
    В форме "ФормаВыбора"

    Код:
    Процедура СформироватьПартииНажатие(Элемент) Экспорт
    
    ЗначениеВыбора="тестовая";
    ОповеститьОВыборе(ЗначениеВыбора);
    
    КонецПроцедуры
    

Поделиться этой страницей