Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Создание глобальной переменной в Контексте (число прочтений - 12153 )
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Создание глобальной переменной в Контексте
20. Августа 2008 :: 07:14
Печать  
Хочу после открытия формы задать переменную контекста под именем "ВызывающийКонтекст", в к-й будет контекст формы вызвавшей открытие текущей формы.
Через "ВыполняемыйМодуль" работает, но только если в каждой из форм в начале модуля объявлять глобальную переменную "Перем ВызывающийКонтекст;", иначе переменная не будет доступна после открытия формы.

Можно ли как-нибудь создать в заданном контексте глобальную переменную?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #1 - 20. Августа 2008 :: 08:12
Печать  
Смысл непонятен Печаль
Если ты хочешь для каждой формы знать вызывающий ее контекст, передавай этот контекст явно, например, через Форма.Параметр.
Явная передача всегда лучше, чем неявнее!

Или опиши задачу подробнее.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #2 - 20. Августа 2008 :: 09:09
Печать  
У меня часто возникает нужда по закрытии формы объекта, вызвать процедуру контекста формы из к-й был этот объект открыт.
На данный момент я передаю контекст вызывающей формы явно. Много кода дублируется в каждой из форм.
Хотелось бы иметь универсальный механизм. Задумка такая - в контексте любой формы иметь доступ к переменной "ВызывающийКонтекст".
На данный момент это уже получается. Вместо ОткрытьФорму использую свою глОткрытьФорму, к-я назначает переменной открытого контекста "ВызывающийКонтекст" значение вызвавшего контекста. Надо лиш в каждой форме в начале модуля писать
Код
Выбрать все
Перем ВызывающийКонтекст; 


иначе значение будет присвоено переменной, к-я сразу после этого уничтожится.
Можно ли создать глобальную переменную средствами 1С++ в нужном контексте?
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #3 - 20. Августа 2008 :: 10:05
Печать  
Я тоже не понимаю Печаль

Но возможно подойдет такое решение Улыбка

Через Форма.Параметр передаем :
Форма.Параметр.ДобавитьЗначение("ВызывающийКонтекст",Значение);
При закрытии форма возвращает Форма.Параметр :
Значение=Форма.Параметр.Получить("ВызывающийКонтекст");

Вроде как, почти глобальная переменная  Подмигивание
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #4 - 20. Августа 2008 :: 10:21
Печать  
blindvic писал(а) 20. Августа 2008 :: 09:09:
У меня часто возникает нужда по закрытии формы объекта, вызвать процедуру контекста формы из к-й был этот объект открыт.

Есть у меня в одной из конфигураций практически универсальный механизм передачи сообщений между открытыми формами. Соберусь на днях с силами и выложу.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #5 - 20. Августа 2008 :: 10:44
Печать  
blindvic писал(а) 20. Августа 2008 :: 09:09:
У меня часто возникает нужда по закрытии формы объекта, вызвать процедуру контекста формы из к-й был этот объект открыт.
На данный момент я передаю контекст вызывающей формы явно. Много кода дублируется в каждой из форм.
Хотелось бы иметь универсальный механизм. Задумка такая - в контексте любой формы иметь доступ к переменной "ВызывающийКонтекст".

1) Можно использовать механизм подписки, например, с помощью МенеджерСобытий или Делегат.
2) Можно сделать так:
передаем контекст через Форма.Параметр
в ПриЗакрытии/ПослеЗакрытия формы пишем Форма.Параметр.НужнаяПроцедура()
3) Использовать обработку ожидания в вызывающей форме.
Открывай форму с сохранением контекста открываемой формы
Конт = 0; ОткрытьФорму("Отчет", Конт, ...);
Далее в обработке ожидания выполняй проверку ПустоеЗначение(Конт)
Как только = 1, значит, открывшаяся форма закрыта и нужно выполнить некое действие.

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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #6 - 20. Августа 2008 :: 11:04
Печать  
artbear писал(а) 20. Августа 2008 :: 10:44:
3) Использовать обработку ожидания в вызывающей форме.

С аналогичной целью можно использовать объект Таймер из ФормЕкс.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #7 - 20. Августа 2008 :: 12:47
Печать  
artbear писал(а) 20. Августа 2008 :: 11:04:
artbear писал(а) 20. Августа 2008 :: 10:44:
3) Использовать обработку ожидания в вызывающей форме.

С аналогичной целью можно использовать объект Таймер из ФормЕкс.

Конкретный пример, где и как я это использую:
Есть элемент справочника "Займы", на форме к-го ТЗ с поручителями из подчиненного справочника. При открытии поручителя, изменения информации в нем и закрытии хочу чтобы вызвалось обновление этой ТЗ, на случай если изменилась отображающаяся инфа, или добавлен новый поручитель, или удален...
Модальные формы не хочу использовать.
Таймер - плохое решение. В каждой форме опять надо дублировать код. А если несколько форм поручителей открыто? Усложняется все

berezdetsky писал(а) 20. Августа 2008 :: 10:21:
blindvic писал(а) 20. Августа 2008 :: 09:09:
У меня часто возникает нужда по закрытии формы объекта, вызвать процедуру контекста формы из к-й был этот объект открыт.

Есть у меня в одной из конфигураций практически универсальный механизм передачи сообщений между открытыми формами. Соберусь на днях с силами и выложу.

Интересно...
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #8 - 20. Августа 2008 :: 12:53
Печать  
artbear писал(а) 20. Августа 2008 :: 10:44:
2) Можно сделать так:
передаем контекст через Форма.Параметр
в ПриЗакрытии/ПослеЗакрытия формы пишем Форма.Параметр.НужнаяПроцедура()

Так и делаю. При закрытии вызываю процедуру контекста, к-й содержится в глобальной переменной текущей формы "ВызывающийКонтекст".
В глобальном модуле:
Код
Выбрать все
****
Функция глОткрытьФорму(Объект, Конт, Режим = 0, Параметры = "") Экспорт
	Перем Идентификатор;

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


	Рез = ОткрытьФорму(Объект, Конт, Режим);  // пытаемся открыть форму Документа/Справочника для редактирования
	Если (Рез = 0) И (Режим = 0) Тогда  // если не получилось - откроем только для чтения
		Рез = ОткрытьФорму(Объект, Конт, 1);
	КонецЕсли;

    Если Рез = 0 Тогда Возврат 0; КонецЕсли;

	Для а = 1 По Параметры.РазмерСписка() Цикл
		Значение = Параметры.ПолучитьЗначение(а, Идентификатор);
		Если Лев(Идентификатор, 2) = "__" Тогда // служебное
		Иначе
			глУстановитьПеременнуюКонтекста(Конт, Идентификатор, Значение);
		КонецЕсли;
	КонецЦикла;

	//РасшФормы = СоздатьОбъект("РасширениеФормы");
	//РасшФормы.УстановитьФорму(Конт.Форма);
	//Модуль = СоздатьОбъект("ВыполняемыйМодуль");
	//Модуль.НазначитьКонтекст(Конт);
	//Модуль.УстановитьМодуль("Перем ВызывающийКонтекст;"
	//		"Процедура УстановитьПеременную(Значение)"
	//		"ВызывающийКонтекст = Значение;"
	//		"КонецПроцедуры");
	//Модуль.КомпилироватьИВыполнитьМодуль();
	//Модуль.УстановитьПеременную(ВызывающийКонтекст);
	Возврат 1;
КонецФункции 



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



В форме поручителя:
Код
Выбрать все
Перем ВызывающийКонтекст;
*******
Процедура ПриЗакрытии()
	Если ПустоеЗначение(КонтекстЗапроса) = 0 Тогда
		ВыпМодуль = СоздатьОбъект("ВыполняемыйМодуль");
		ВыпМодуль.ВыполнитьПроцедуруКонтекста(ВызывающийКонтекст, "СписокПоручителей", СоздатьОбъект("СписокЗначений"));
	КонецЕсли;
КонецПроцедуры 



Идеальным решением был бы механизм такой:
Я открываю некую формы с указанием особых параметров (вызывающий контекст, имя процедуры). По закрытии формы автоматически вызывается указанная процедура вызывающего контекста. И все это чтобы не требовало вмешательства и дублирования кода в формах как вызывающего,так и вызываемого контекстов...

Если бы я мог каждой открываемой форме присобачивать свойства "ВызывающийКонтекст" "ПроцедураДляВызова" и т.п., я бы это дело автоматически при открытии каждой формы, а в глобальной процедуре "ПослеЗакрытия" я бы вызывал соответствующую процедуру.
Контекст - это объект. Могу я ему создать новое свойство?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #9 - 20. Августа 2008 :: 13:23
Печать  
Нет, твое желание/решение с глобальными переменные неверно, честно Печаль

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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #10 - 21. Августа 2008 :: 12:33
Печать  
blindvic писал(а) 20. Августа 2008 :: 12:47:
Интересно...

Ну смотри. Подробная инструкция - в описании .ert.
  

Messages.zip ( 3 KB | Загрузки )

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #11 - 22. Августа 2008 :: 06:43
Печать  
Спасибо. Какова стандартная схема его использования (в описании нету)?
  
Наверх
 
IP записан
 
KonstSV
Junior Member
**
Отсутствует



Сообщений: 39
Местоположение: Москва
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #12 - 22. Августа 2008 :: 09:27
Печать  
Хочу обратить внимание на один нюанс использования механизма сообщений.

Выполнение кода обработки сообщения будет происходить как бы "синхронно",
т.е. выполнение кода вызывающей обработки будет приостановлено, а затем
продолжено после выполнения всех обработчиков.

Если же необходимо обработать сообщение(событие) "асинхронно", т.е после
того как вызывающая обработка завершит свое выполнение, то можно
воспользоваться функцией ВнешнееСобытие(<Источник>,<Событие>,<Данные>)
объекта Сервис (FormEx), а в нужных местах использовать стандартный механизм
обработки внешних событий ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #13 - 22. Августа 2008 :: 10:04
Печать  
Все-таки, возвращаясь к началу, имея объект (допустим, Контекст), можно ли добавить к нему свойство?
Что вроде:
Код
Выбрать все
Сервис.ДобавитьСвойство(Объект, ИмяСвойства, ТипЗначения, ...) 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание глобальной переменной в Контексте
Ответ #14 - 22. Августа 2008 :: 12:47
Печать  
blindvic писал(а) 22. Августа 2008 :: 06:43:
Спасибо. Какова стандартная схема его использования (в описании нету)?

Для начала в ГМ
Код
Выбрать все
Перем МенеджерОповещений Экспорт;

//*******************************************
Процедура ПриНачалеРаботыСистемы()
	ЗагрузитьВнешнююКомпоненту("1cpp.dll");
	ЗагрузитьВнешнююКомпоненту("formex.dll");

	МенеджерОповещений = СоздатьОбъект("Оповещения");
КонецПроцедуры 



blindvic писал(а) 20. Августа 2008 :: 09:09:
У меня часто возникает нужда по закрытии формы объекта, вызвать процедуру контекста формы из к-й был этот объект открыт.

В форме объекта
Код
Выбрать все
Процедура ПриЗакрытии()
	МенеджерОповещений.Оповестить("ФормаОбъекта_ПриЗакрытии",, Контекст);
КонецПроцедуры 


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

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать