Передача значения из модуля формы в модуль объекта

1. ong1990 3 22.05.15 10:49 Сейчас в теме
Как передать значение из модуля формы в модуль объекта? (УП)
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dj_serega 392 22.05.15 10:53 Сейчас в теме
(1) ong1990, 1. Через реквизит объекта
2. Через параметр процедуры/функции
3. ong1990 3 22.05.15 11:00 Сейчас в теме
(2) dj_serega, а как через реквизит объекта?
5. ture 606 22.05.15 11:02 Сейчас в теме
(3)через параметр оно как то гибче будет. Я за вызов функции из модуля с указанием ей парамтра
7. Boneman 298 22.05.15 11:04 Сейчас в теме
(1) ong1990, какое именно значение передаете ? Какой тип данных ?
УП - толстый или тонкий клиент ?
9. ong1990 3 22.05.15 11:07 Сейчас в теме
(7) Boneman, Тонкий клиент...Массив нужно передать
4. dmitrichenko.ivan 6 22.05.15 11:01 Сейчас в теме
Почитайте про работы с временным хранилищем (ПоместитьВоВременноеХранилище())
Скорее всего, это как раз то, что вам нужно)
6. ture 606 22.05.15 11:03 Сейчас в теме
(4) придется передать адрес на хранилище, но если он заранее известен...
можно еще о дополнительных свойствах подумать
8. ditp 91 22.05.15 11:04 Сейчас в теме
(4) dmitrichenko.ivan, адрес то в хранилище все равно придется передать.
10. ditp 91 22.05.15 11:11 Сейчас в теме
ОбъектОбъекта = РеквизитФормыВЗначение("Объект");
ОбъектОбъекта.ТвойМетод(ТвойМассив);
11. ong1990 3 22.05.15 11:16 Сейчас в теме
(10) ditp,
ТвойМетод(ТвойМассив)
Прошу прощения за глупость. что это? Чем это нужно заменить?
12. ture 606 22.05.15 11:18 Сейчас в теме
(11) там экспорт еще надо добавить
13. ditp 91 22.05.15 11:19 Сейчас в теме
(11) ong1990, ну массив куда передается? я предположил, что в некий метод объекта.

Соответственно, "ТвойМетод" - это имя экспортной процедуры из модуля объекта.

"ТвойМассив" - переменная, содержащая массив.
14. ong1990 3 22.05.15 12:02 Сейчас в теме
(13) ditp, Так...из модуля первой формы в модуль объекта передается массив, это уже хорошо. А вот из модуля объекта в модуль второй формы(этого же объекта) чет никак не выходит(((
15. Roman_Go 2 22.05.15 13:23 Сейчас в теме
(14) ong1990, вопрос был, как из модуля формы передать данные в модуль объекта, на вопрос ответ был получен, но как оказалось, на самом деле не это надо было. Может все таки сразу описать задачу, которую требуется решить и тогда будет ясно как помочь?
17. ong1990 3 22.05.15 13:38 Сейчас в теме
(15) Roman_Go, внешняя обработка. в не две формы с ТЧ. В ТЧ первой формы загружаются данные из EXcel(). потом по нажатию кнопки открывается вторая форма, в ТЧ которой должны загрузиться данные(Массив не найденной номенклатуры) из первой формы.
18. Boneman 298 22.05.15 13:47 Сейчас в теме
(17) ong1990, ага, т.е. передаем всте-таки не из модуля объекта во вторую форму, а и з первой формы во вторую.
Соответственно, нужные данные передавайте параметрами формы при открытии.
21. ong1990 3 22.05.15 14:06 Сейчас в теме
(18) Boneman, А массив можно передать?
22. Boneman 298 22.05.15 14:17 Сейчас в теме
(21) ong1990, да хоть что можно передать, разными способами, в разных ситуациях по разному.
Массив, знаете - это тоже такой параметр, не являющийся конечным значенем. Массив OLE объектов, тоже массив, только никуда вы его не передадите.
У вас вообще там непонятно о чем идет речь. Остается только догадываться.
Приложили бы выкладку кода, что открывается, как открывается, что передается. Тогда бы уже предметно подсказали.

Да и по вопросам видно, что вам бы элементарные курсы по программированию сначала просмотреть, чтобы понимали мат часть, хоть немного.
24. ong1990 3 22.05.15 14:27 Сейчас в теме
(22) Boneman,
&НаКлиенте
Процедура ЗаполнитьТЧ(Команда)
	
	Объект.Товары.Очистить();	                     
	
	Попытка
		COMОбъект = Новый COMОбъект("Excel.Application");
		Workbook   = COMОбъект.Workbooks.Open(ИмяФайла);
		ExcelЛист  = COMОбъект.Sheets(1);
		ActiveCell = COMОбъект.ActiveCell.SpecialCells(11);
		RowCount = ActiveCell.Row;
		ColumnCount = ActiveCell.Column;	
		
		Для Строка = 1 По RowCount Цикл   
			Для Колонка = 1 По ColumnCount Цикл
				Значение = СокрЛП(ExcelЛист.Cells(Строка,2).Value);
				Значение2 = СокрЛП(ExcelЛист.Cells(Строка,1).Value);
				Значение3 = СокрЛП(ExcelЛист.Cells(Строка,3).Value);
			КонецЦикла;  
			
			ДанныеНаСервере(Значение,Значение2,Значение3);	
		КонецЦикла;	
		WorkBook.Close();		
	Исключение
		COMОбъект.Quit();
		COMОбъект = 0;
		СообщениеОбОшибке = НСтр("ru = 'Не удалось прочитать данные из файла. Подробности: '")
		+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ВызватьИсключение СообщениеОбОшибке;  
		
	КонецПопытки;    
	
КонецПроцедуры
Показать


&НаСервере
Процедура  ДанныеНаСервере(Значение,Значение2,Значение3)
	
	НайденноеЗначение=Справочники.Номенклатура.НайтиПоНаименованию(Значение,Истина); 
	НоваяСтрока=Объект.Товары.Добавить();
	НоваяСтрока.Номенклатура=НайденноеЗначение;
	НоваяСтрока.Атрикул=Значение2;
	НоваяСтрока.ЦенаИзПрайса=Значение3;
	
	массив=Новый Массив;
	
	Если НайденноеЗначение=Справочники.Номенклатура.ПустаяСсылка() Тогда 
		массив.Добавить(Значение);
	КонецЕсли;
		 	
КонецПроцедуры
Показать

Во втором блоке как Вы видете я заполнил массив не найденными значениями.
и мне теперь необходимо по кнопке открыть вторую форму и чтобы она заполнилась данными из массива.
25. Boneman 298 22.05.15 15:00 Сейчас в теме
(24) ong1990, массив - у вас назад на клиента не возвращается.
Заполнить вы его заполнили, а где возврат ?

Вам нужно, сделать не процедуру а функцию,
заканчиваться она должна Возврат Массив;

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

Потом делаем кнопку, откурытия второй формы и в ее обработчике, передать этот массив в нее.
как это делается вам написали в (23)
26. ong1990 3 22.05.15 15:50 Сейчас в теме
(25) Boneman,
Процедура ПриСозданииНаСервере()
ТвойМассивВоВторойФорма = Форма.Параметры.Массив;
КонецПроцедуры
вот это не совсем понятно
27. Boneman 298 22.05.15 15:56 Сейчас в теме
(26) ong1990,
что непонятного,
вы передаете массив из первой формы во вторую в параметрах формы,
во второй форме, эти параметры нужно получить, и дальше уже делать то-что нужно.
Это можно сделать, в процедуре ПриСозданииНаСервере - примерно таким кодом.

Можно еще по другому, на вкладке параметр завести такой параметр, поставить галку "ключевой",
и тогда он будет там хранится и доступен на клиенте.
28. ong1990 3 22.05.15 16:22 Сейчас в теме
(27) Boneman
&НаКлиенте
Перем Масс;

&НаКлиенте
Процедура ЗаполнитьТЧ(Команда)
	
	Объект.Товары.Очистить();	                     
	
	Попытка
		COMОбъект = Новый COMОбъект("Excel.Application");
		Workbook   = COMОбъект.Workbooks.Open(ИмяФайла);
		ExcelЛист  = COMОбъект.Sheets(1);
		ActiveCell = COMОбъект.ActiveCell.SpecialCells(11);
		RowCount = ActiveCell.Row;
		ColumnCount = ActiveCell.Column;	
		
		Для Строка = 1 По RowCount Цикл   
			Для Колонка = 1 По ColumnCount Цикл
				Значение = СокрЛП(ExcelЛист.Cells(Строка,2).Value);
				Значение2 = СокрЛП(ExcelЛист.Cells(Строка,1).Value);
				Значение3 = СокрЛП(ExcelЛист.Cells(Строка,3).Value);
			КонецЦикла;  
			
			ДанныеНаСервере(Значение,Значение2,Значение3);	
		КонецЦикла;	
		WorkBook.Close();		
	Исключение
		COMОбъект.Quit();
		COMОбъект = 0;
		СообщениеОбОшибке = НСтр("ru = 'Не удалось прочитать данные из файла. Подробности: '")
		+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ВызватьИсключение СообщениеОбОшибке;  
		
	КонецПопытки;    
	
КонецПроцедуры

&НаСервере
Функция  ДанныеНаСервере(Значение,Значение2,Значение3)
	
	НайденноеЗначение=Справочники.Номенклатура.НайтиПоНаименованию(Значение,Истина); 
	НоваяСтрока=Объект.Товары.Добавить();
	НоваяСтрока.Номенклатура=НайденноеЗначение;
	НоваяСтрока.Атрикул=Значение2;
	НоваяСтрока.ЦенаИзПрайса=Значение3;
	
	масс=Новый Массив;
	
	Если НайденноеЗначение=Справочники.Номенклатура.ПустаяСсылка() Тогда 
		масс.Добавить(Значение);
	КонецЕсли;
	Возврат масс;
КонецФункции

&НаКлиенте
Процедура ПроверитьТЧ(Команда)
	
ПараметрыНовойФормы =  Новый Структура;
ПараметрыНовойФормы.Вставить("Масс", Масс);
ОткрытьФорму("ВнешняяОбработка.АнализПрайсаПоставщика.Форма.ФормаСравнения",ПараметрыНовойФормы);
	
КонецПроцедуры

Показать


эта Часть правильная?
29. Boneman 298 22.05.15 16:39 Сейчас в теме
(28) ong1990, ну, и ?

только в вызове функции
вместо
ДанныеНаСервере(Значение,Значение2,Значение3); 

надо
масс=ДанныеНаСервере(Значение,Значение2,Значение3); 


т.е. функция вернет вам массив, и вы его в объявленную на клиенте переменную засунете.
30. ong1990 3 22.05.15 16:57 Сейчас в теме
(29) Boneman, во второй форме добавил новый параметр(В вкладке "Параметры", поставил галку "ключевой"),назвал его "ПараметрыНовойФормы".
в этот параметр возвращается структура???
31. Boneman 298 22.05.15 17:08 Сейчас в теме
(30) ong1990,
вот назвать тебе его надо по другому,
ты-же при открытии говоришь
ПараметрыНовойФормы.Вставить("Масс", Масс);

Это значит, что в параметр с именем Масс - запишется значение.

А ты его обозвал "ПараметрыНовойФормы"

ну или можешь сделать
ПараметрыНовойФормы.Вставить("ПараметрыНовойФормы", Масс);
32. ong1990 3 22.05.15 17:24 Сейчас в теме
(31) Boneman, а какой тип должен иметь этот параметр во второй форме?? я поставил строка. и теперь он мне возвращает "Массив"
33. Boneman 298 22.05.15 17:30 Сейчас в теме
(32) ong1990, ну типы то данных должны быть одинаковые. Зачем ставить строка, если передаешь массив ? Поставь, хотябы произвольный
34. ong1990 3 22.05.15 17:57 Сейчас в теме
(33) Boneman, сделал как Вы сказали. но ничего не происходит.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	Массив=ЭтаФорма.Параметры.ПараметрыНовойФормы;
		Для Каждого  Элемент из Массив Цикл
		НоваяСтрока=Объект.НоменклатураСравнение.Добавить();
	НоваяСтрока.Сравнение=Элемент;
КонецЦикла;
КонецПроцедуры
Показать

сделал так Сообщить(Масс.Количество()) оказалось 0... почему хз((((
35. dj_serega 392 22.05.15 18:06 Сейчас в теме
(34) ong1990, Так типа Макссив не может быть в Параметрах формы. Грузить нужно в список значений. И его передавать.
37. FractonKireyev 22.05.15 20:34 Сейчас в теме
(35) dj_serega,
Грузить надо как-раз через массив. В документации об этом написано.
36. Boneman 298 22.05.15 18:07 Сейчас в теме
(34) ong1990, есть такая штука, как отладчик, где можно пошаговой трассировкой шагать по выполняемому коду, и смотреть как и что передается, и в каких переменных что содержится. Иначе гадать можно до бесконечности.
19. ture 606 22.05.15 14:00 Сейчас в теме
(17) передача параметров возможна через ВНИМАНИ, СЛЕДИТЕ ЗА РУКАМИ, через оповещение.
karpik666; +1 Ответить
47. ture 606 25.05.15 17:43 Сейчас в теме
(19) Вот ведь взболтнул....
23. ditp 91 22.05.15 14:20 Сейчас в теме
(17) ong1990,

ПараметрыНовойФормы =  Новый Структура;
ПараметрыНовойФормы.Вставить("Массив", ТВойМассив);
ОткрытьФорму("Обработка.ТвояОбработка.Форма.ВтораяФорма", ПараметрыНовойФормы);


Во второй форме

Процедура ПриСозданииНаСервере()
ТвойМассивВоВторойФорма = Форма.Параметры.Массив;
КонецПроцедуры
16. Boneman 298 22.05.15 13:33 Сейчас в теме
(14) ong1990, какой еще второй формы,
открываете еще форму ? Или возвращаете значение ?
20. ture 606 22.05.15 14:02 Сейчас в теме
Хотел самое вкусное на конец припрятать, чтоб потом в одиночку вкушать лавры победы.
38. ong1990 3 25.05.15 16:30 Сейчас в теме
Продолжение. С предыдущей(теперь уже) задачей с Вашей помощью справился. форма уже отрывается с заполненой ТЧ как полагается. вручную вношу в ней изменения и теперь необходимо по кнопке перезаполнить ТЧ первой формы данными из второй формы. Я так понимаю это должно работать по принципу обработки подборатоваров. но чет никак не пойму как первая форма должна получить данные.
39. ditp 91 25.05.15 16:37 Сейчас в теме
(38) ong1990,

Первая форма

Процедура ОповещениеоВыборе(Результат, Параметры)    Экспорт
    // в Результат получаешь ТЗ
КонецПроцедуры

Процедура ПолеВводаСогласовалНачалоВыбора(Элемент, СтандартнаяОбработка)
    Оповещение    = Новый ОписаниеОповещения("ОповещениеоВыборе", ЭтотОбъект);
    ОткрытьФорму("----", ПараметрыВыбора, ЭтаФорма, УникальныйИдентификатор, , , Оповещение);
КонецПроцедуры


Вторая форма

Закрыть(ИзмененнаяТЗ)
40. ong1990 3 25.05.15 16:58 Сейчас в теме
(39) ditp,
Процедура ОповещениеоВыборе(Результат, Параметры) Экспорт
// в Результат получаешь ТЗ
КонецПроцедуры

Процедура ПолеВводаСогласовалНачалоВыбора(Элемент, СтандартнаяОбработка)
Оповещение = Новый ОписаниеОповещения("ОповещениеоВыборе", ЭтотОбъект);
ОткрытьФорму("----", ПараметрыВыбора, ЭтаФорма, УникальныйИдентификатор, , , Оповещение);
КонецПроцедуры
не совсем понятно что это?
41. dj_serega 392 25.05.15 17:00 Сейчас в теме
(40) ong1990, Это уход от модальности от 1С.
воть
42. ong1990 3 25.05.15 17:07 Сейчас в теме
(41) dj_serega, да я не об этом..
Процедура ОповещениеоВыборе(Результат, Параметры) Экспорт
// в Результат получаешь ТЗ
КонецПроцедуры
вот это что??
а это мне вообще нужно??
Процедура ПолеВводаСогласовалНачалоВыбора(Элемент, СтандартнаяОбработка)
Оповещение = Новый ОписаниеОповещения("ОповещениеоВыборе", ЭтотОбъект);
ОткрытьФорму("----", ПараметрыВыбора, ЭтаФорма, УникальныйИдентификатор, , , Оповещение);
КонецПроцедуры
43. dj_serega 392 25.05.15 17:13 Сейчас в теме
(42) ong1990, В двух словах.
"ОткрытьМодально()" блокирует всю 1С (а в браузерах весь браузер). 1С решила обойти это дело. И реализовала методы по обходу блокировки.
В статье, ссылка в (41), описано "что? где? почему?".
44. ong1990 3 25.05.15 17:15 Сейчас в теме
(43) dj_serega, да мне не это не понятно. а непонятно то, как мне передать данные и заполнить ТЧ первой формы?.
45. ditp 91 25.05.15 17:37 Сейчас в теме
(44) ong1990, что непонятно то?

При открытии вторйо формы из первой передаешь в ОткрытьФорму параметр Оповещение, содержащий процедуру, которая будет вызвана при закрытии второй формы.

Во второй форме делаешь кнопку "ОК", по нажатию на которую обработчик вызывает метод Закрыть(ТвояТЗ), где ТвояТЗ - измененная во второй форме таблица.

После этого срабатывает описанная в Оповещении в первой форме процедура, где в параметр Результат получается твоя ТЗ. Делаешь с ней дальше что хочешь.
48. ong1990 3 25.05.15 17:56 Сейчас в теме
(45) ditp, Спасибо большое за разъяснение. так более понятно
46. Boneman 298 25.05.15 17:38 Сейчас в теме
(44) ong1990, попробую объяснить "на пальцах".
Когда ты открываешь форму, ты задаешь оповещение. Это и есть та процедура, которая отработает после закрытия этой самой второй формы.
Вот в ней и отрабатываешь результат закрытия формы.
В параметре закрытия ЭтаФорма.Закрыть(результат) - это ты не просто закрываешь вторую форму, а закрываешь и возвращаешь результат, т.е. твои данные.

В первой форме, после этого, сработает оповещение, процедура "оповещение о выборе",
там и окажется этот результат, которым ты заполнишь, все что надо уже в первой форме.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот