Как передать переменную из одной функции в другую

1. Az18011993 10.09.20 14:08 Сейчас в теме
Добрый день,уважаемые форумчане!
Столкнулся с проблемой,нужно переменную из одной функции передать в другую)Например есть кнопка создать пользователя и кнопка подключение,куда должны передаваться параметры пользователя. Пробовал делать через возврат,но это я так понял так не работает:)
КОгда нажимаю кнопку подключить,у меня переменная,которую хочу передать уже неопределена(
Знающие люди прошу совета.Заранее спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. herfis 498 10.09.20 14:21 Сейчас в теме
(1) А эти кнопки в какой форме? Для чего эта форма? Какие сценарии работы пользователя с этой формой?
8. Az18011993 10.09.20 16:32 Сейчас в теме
(4)Извините только освободился) Да я учусь программированию,написал простую обработку.Скриншот прилагаю. Есть кнопка создать пользователя. Есть кнопка подключение,но туда нужно в функцию как раз передать данные пользователя)Но они теряются,когда функция заканчивает свое выполнение,как то так.
Прикрепленные файлы:
12. herfis 498 10.09.20 16:37 Сейчас в теме
(8) Понимания не добавилось :) Что делает кнопка "Подключение"? Ну да фиг с ним.
В общем случае, как уже советовали, можно передать пользователя через реквизит формы (он будет доступен и в серверных вызовах). Если достаточно доступа на клиенте - можно создать клиентскую переменную модуля формы. Но хорошем стилем будет явное использование их через параметры целевых процедур. Вроде такого:

&НаКлиенте
Процедура СоздатьПользователя(Команда)
	
	Пользователь = ПолучитьНовогоПользователя();
	
КонецПроцедуры

&НаКлиенте
Процедура Подключить(Команда)
	
	ВыполнитьПодключение(Пользователь);
	
КонецПроцедуры
Показать

В этом случае целевые функции остаются "чистыми" (получающими данные только из параметров) а в обработчиках команд сразу очевидно, что данные берутся из контекста формы.
2. zarankony 305 10.09.20 14:13 Сейчас в теме
Если модуль или форма одна и та же, то можно в начале модуля объявить
Знач МояПеременная

Тогда видимость переменной будет у всего модуля
3. ignorant 10.09.20 14:14 Сейчас в теме
1. Передавать в качестве _параметра_ функции
2. Не передавать совсем, ограничиться видимостью переменной: сделать её реквизитом объекта / модуля / формы.
5. M_A_D 184 10.09.20 14:32 Сейчас в теме
думаю самый верный способ сделать ГЛОБАЛЬНУЮ переменную, далее в первой функции её вычислить, и во вторую она перейдет с тем значением которое будет в результате вычислений первой функции)))
6. FatPanzer 10.09.20 14:54 Сейчас в теме
(5) У человека две кнопки на форме. Одна кнопка формирует некие данные, вторая кнопка их использует в своем обработчике команды.
Зачем тут ГЛОБАЛЬНАЯ переменная? Данные нужны только в контексте этих двух обработчиков.
10. M_A_D 184 10.09.20 16:35 Сейчас в теме
(6)
Ну так:
1. Вопрос не будет решен как просит автор?
2. Если в обработке о которой пишут всего 2 обработчика, не будет ли логично создать одну ГЛОБАЛЬНУЮ переменную, ведь она и будет использована на протяжени ВСЕЙ работы обработки....?
7. Поручик 4674 10.09.20 15:10 Сейчас в теме
Сделайте реквизит формы. Это сплошь и рядом во многих конфах.
9. Az18011993 10.09.20 16:34 Сейчас в теме
(7)Можно попробовать,но просто создавать реквизит,ради того,чтобы передать один раз данные как то жирно:)
Думал может есть еще варианты,хотя я еще зеленый,не мне судить
11. M_A_D 184 10.09.20 16:37 Сейчас в теме
(9)
Это будет самый простой способ!
более того, потом если будет нужно можно будет вытащить этот реквизит без переписывания процедур и функций)
13. Az18011993 10.09.20 17:28 Сейчас в теме
&НаСервере
Процедура ПодключениеНаСервере()
Почта = Новый ИнтернетПочта; 
	Попытка
		Почта.Подключиться(ЭтотОбъект.ПрофильЭП);
		Сообщить("Подключено");
	Исключение
		Сообщить("Не удалось подключиться к серверу");
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура   СоздатьПользователя(Команда)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПользовательSMTP = "***";
Профиль.ПарольSMTP = "***";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПортSMTP = 465; 
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Элементы.Пользователь.Заголовок = "Создан";
ЭтотОбъект.ПрофильЭП = Профиль;
КонецПроцедуры
Показать


Мне нужно "Профиль" передать в другую функцию
14. FatPanzer 10.09.20 17:31 Сейчас в теме
(13) Ну так насколько я вижу, у вас уже есть реквизит формы "ПрофильЭП".
Вот во второй функции вы и обращайтесь к нему по этому имени. Он будет доступен уже в самой функции (если она расположена в этой же форме)

UPD. Упс, не посмотрел на значение "переменной"... И на разные контексты.
15. Az18011993 10.09.20 17:31 Сейчас в теме
(14)Да, а какой тип значений реквизита указать то?
16. FatPanzer 10.09.20 17:34 Сейчас в теме
Произвольный.
А вообще - зачем это?
Создавайте профиль сразу же при подключении.
17. Az18011993 10.09.20 17:38 Сейчас в теме
(16)Да можно так сделать, мне просто интересно как передать профиль в другую функцию
19. FatPanzer 10.09.20 17:44 Сейчас в теме
(17) У вас вообще не про передачу задача. А промежуточное хранение информации и использование этой информации в различных функциях.
А "передача в функцию" - это только про параметры функции.
20. Az18011993 10.09.20 17:47 Сейчас в теме
(19)Ну я не знаю как корректно передать значение с типом ИнтернетПочтовыйПрофиль =)
24. FatPanzer 10.09.20 17:50 Сейчас в теме
(20) А зачем его передавать? Тем более с клиента на сервер... Передавайте структуру со свойствами, а на сервере создавайте профиль и заполняйте его из структуры.
25. Az18011993 10.09.20 17:50 Сейчас в теме
(24)Я думал об этом,а как мне передать структура в другую функцию?
18. herfis 498 10.09.20 17:41 Сейчас в теме
(13) Код в &НаСервере и &НаКлиенте - в общем случае может выполняться на физически разных компьютерах.
Логично было бы создавать профиль и подключаться к почте с одного компьютера :)
А тип у реквизита формы можно не указывать. В этом случае туда можно "положить" значение любого сериализуемого немутабельного типа. Даже коллекцию. Прокатит ли положить туда ИнтернетПочтовыйПрофиль - навскидку не соображу. По идее, должно прокатить. Если нет - тогда может очиститься после серверного вызова или исключение выдаст.
ЗЫ. Точно, тип "Произвольный" как выше написали.
21. Az18011993 10.09.20 17:47 Сейчас в теме
(18)Если Вы про произвольный
22. Az18011993 10.09.20 17:48 Сейчас в теме
(18)Если Вы про произвольный тип,то не прокатывает(
23. Az18011993 10.09.20 17:50 Сейчас в теме
А так я могу на клиенте сразу сделать создание и инициализацию пользователя,и сразу подключение,и будет все хорошо работать. Мне просто стало интересно возможно ил как то передать этот самый профиль.
26. FatPanzer 10.09.20 17:52 Сейчас в теме
(23) Ну это если у вас интернет на клиенте есть и протоколы открыты - то да...

Ну раз у вас это не прикладная задача, а просто "как распилить бревно бензопилой без бензина" - то я вас покину. Удачи!
Az18011993; +1 Ответить
27. Az18011993 10.09.20 17:54 Сейчас в теме
(26)Но все же спасибо за помощь!
28. herfis 498 10.09.20 17:57 Сейчас в теме
(23) На практике создание профиля и его использование обычно происходит в одном куске кода. Если делать это на клиенте, тогда профиль между разными клиентскими событиями можно сохранить на клиенте в клиентской переменной модуля формы
&НаКлиенте
Перем Профиль;

Но это абсолютно искусственная задача.
29. Az18011993 10.09.20 19:12 Сейчас в теме
30. herfis 498 11.09.20 09:05 Сейчас в теме
(29) Чтобы работало - подключение к почте должно быть тоже с клиента.
Оставьте свое сообщение

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