Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Как определить изменение значения параметра (число прочтений - 7957 )
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Как определить изменение значения параметра
10. Августа 2008 :: 09:36
Печать  
Собственно сабж...

Допустим я вызвал некоторое событие формы из своего КОП через контекст или выполняемый модуль, в общем не важно.
Данное событие в форме объявлено "Процедура...", и существуют параметры, как мне определить что значения параметров изменились после выполнения события?

Таким образом реализовано стандартное событие 1С - ОбработкаВыбораЗначения(Значение,ИДАтрибута,ФСО). Если в теле процедуры ФСО приравнять к 0 все знают что выбор значения не выполнится и новое значение не присовоится.

Каким образом похожий механизм можно реализовать в связке КОП-форма?  Круглые глаза
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #1 - 10. Августа 2008 :: 11:54
Печать  
Можешь чуть по подробнее, желательно с примером. Не до конца понял задачу.
Ты в Перехватчике что-то делаешь?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #2 - 10. Августа 2008 :: 16:47
Печать  
Если кратко то вот в чем дело. Например у меня есть событие класса ПередУдалением в нем мне хочется передать два параметра - элемент удаления и флаг отказа. Событие вызывается через выполняемый модуль. Вот если программист в модуле формы получив событие поставил флаг = 0. Как мне в классе узнать что это произошло и не удалять переданный элемент?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



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

Если в классе:
Процедура ПереУдаление(Объект ,ФСО) Экспорт
  ФСО = 0
КонецПроцедуры

То выполняя
ФСО = 1
Класс.ПередУдалением(Объект, ФСО);
Сообщить(ФСО);
тебе сообщить 0
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #4 - 11. Августа 2008 :: 03:41
Печать  
Arta писал(а) 10. Августа 2008 :: 20:05:
Можеть быть я так и не понял конечно... Но

Если в классе:
Процедура ПереУдаление(Объект ,ФСО) Экспорт
 ФСО = 0
КонецПроцедуры

То выполняя
ФСО = 1
Класс.ПередУдалением(Объект, ФСО);
Сообщить(ФСО);
тебе сообщить 0


Нет.... немного наоборот...
Вот в классе есть метод "УдалитьСтроку()". Приблизительно текст класса таков

Процедура УдалитьСтроку()
     Элемент = ТабличноеПоле.ТекущийДанные.Получить("Элемент");
     ФСО = 1;
     МетодМодуляФормы = ИДТабличногоПоля+"ПередУдалением";
     Если Информатор.МетодСуществует(КонтФормы,МетодыМодуляФормы) = 1 Тогда
           // трансляция через выполняемый модуль
           СЗПараметры = СоздатьОбъект("СписокЗначений");
           СЗПараметры.Установить("Элемент",Элемент);
           СЗПараметры.Установить("ФСО",ФСО);
           ВыполнитьМетодМодуляФормы(КонтФормы,МетодМодуляФормы,СЗПараметры);
           // и вот тут собственно мне хочется знать а ФСО отправленное в модуль формы вторым параметром случае не стало равно 0
           // если стало тогда
           Если ФСО = 0 Тогда
                 Возврат;
           КонецЕсли;
     КонецЕсли
КонецПроцедуры

Я конечно понимаю что текущий мой код вполне можно обойти таким образом что если метод модуля формы - функция тогда поставить Возврат 0; и будет мне счастье, однако таким образом можно было бы реализовать много "полезных" и "вкусных" вещей... на текущий момент я просто использую флаги КОП которые на самом деле публичные переменные изменяя их из модуля формы в КОП я узнаю что дальше делать.
Вот  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #5 - 11. Августа 2008 :: 04:14
Печать  
1. Покажи код ВыполнитьМетодМодуляФормы.
2. Непонятна твоя проблема Печаль
У тебя, что, ФСО не возвращается из модуля формы в модуль класса?
  

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #6 - 11. Августа 2008 :: 06:58
Печать  
Если в ВыполнитьМетодМодуляФормы(...) вызов метода происходит через "ВыполняемыйМодуль",
то читаешь СЗПараметры.Получить("ФСО").
Не так давно как вчера у себя сделал - работает Улыбка
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #7 - 11. Августа 2008 :: 07:23
Печать  
AndreyM писал(а) 11. Августа 2008 :: 06:58:
Если в ВыполнитьМетодМодуляФормы(...) вызов метода происходит через "ВыполняемыйМодуль",
то читаешь СЗПараметры.Получить("ФСО").

+1 - ага, верный путь.
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #8 - 11. Августа 2008 :: 08:12
Печать  
Ой... получилось... вот кратко пример кода

Код
Выбрать все
	Для НомерСтроки = 1 По КоличествоПрохождений Цикл
		СтрокаПараметров = СтрокаПараметров + "Параметр"+Строка(НомерСтроки)+?(НомерСтроки = КоличествоПрохождений,"",",");
		СтрокаПрисовенияПараметров = СтрокаПрисовенияПараметров + "
		|	Параметр"+Строка(НомерСтроки)+" = СЗЗначенияПараметров.ПолучитьЗначение("+Строка(НомерСтроки)+");";
		СтрокаЗаписиЗначенийПараметров = СтрокаЗаписиЗначенийПараметров + "
		|	(НомерСтроки)+");";
	КонецЦикла;

	Модуль = ?(ПустоеЗначение(СтрокаПараметров) = 0,"Перем "+СтрокаПараметров+";","")+"
	|"+?(ТипСобытия = 1,"Функция ","Процедура ")+"ВыполнитьМетод(СЗЗначенияПараметров)
	|	"+СтрокаПрисовенияПараметров+"
	|	"+?(ТипСобытия = 1,"Возврат ","")+НаимПроцедуры+"("+СтрокаПараметров+");
	|	"+СтрокаЗаписиЗначенийПараметров+"
	|"+?(ТипСобытия = 1,"КонецФункции","КонецПроцедуры");
 



По сути порядок составления модуля в процедуре:
1. Объявляю количество переменных которые будут параметрами в процедуре
2. Объявляю Процедуру с параметром - переданнный список значений
3. В теле процедуры пишу присовения параметров с переданного списка значений (СЗ передан в качестве параметра)
4. Вызов процедуры модуля которую надо (наименование процедуры + параметры)
5. В переданный список значений устанавливаю измененные значения в модуле процедуры
6. Вызываю через выполняемый модуль свою процедуру, передаю ей список значений с установленными параметрами
7. После выполнения получаю из списка измененные значения параметров

вот, всем большое спасибо за участие и помощь  Подмигивание  Класс
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #9 - 11. Августа 2008 :: 08:27
Печать  
Артур, вопрос в догонку по "ВыполняемыйМодулю" (знаю, что опять не в той ветке и не создал новой темы Улыбка не бейте сильно)

Если в методе ВыполнитьПроцедуруКонтекста (или функцию - не важно) в списке значений, передаваемом в параметр <СписокАргументов>, передать размер списка больше, чем количество входных параметров процедуры/функции, то ошибок не возникает и проглатывает только то количество параметров, которое нужно для выполнения вызываемой процедуры/функции.
Вопрос в студию: этот метод работы останется без изменений? Т.е. могу на это рассчитывать в дальнейшем и не кромсать список значений под количество входных параметров процедуры/функции?
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #10 - 11. Августа 2008 :: 08:28
Печать  
vandalsvq писал(а) 11. Августа 2008 :: 08:12:
Ой... получилось... вот кратко пример кода

Ой, ну ты и намудрил...  Нерешительный
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #11 - 11. Августа 2008 :: 08:36
Печать  
AndreyM писал(а) 11. Августа 2008 :: 08:27:
Если в методе ВыполнитьПроцедуруКонтекста (или функцию - не важно) в списке значений, передаваемом в параметр <СписокАргументов>, передать размер списка больше, чем количество входных параметров процедуры/функции, то ошибок не возникает и проглатывает только то количество параметров, которое нужно для выполнения вызываемой процедуры/функции.
Вопрос в студию: этот метод работы останется без изменений? Т.е. могу на это рассчитывать в дальнейшем и не кромсать список значений под количество входных параметров процедуры/функции?

Да, можешь, нет проблем.
Только особого смысла не вижу - похоже, что ты хочешь создать универсальный "большой" список и с ним работать. Зачем? все равно как-то нужно параметры передавать, а при передаче ты будешь знать их количество Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #12 - 11. Августа 2008 :: 08:36
Печать  
vandalsvq писал(а) 11. Августа 2008 :: 08:12:
Ой... получилось... вот кратко пример кода

Возможно, в этом случае проще через ВМ сделать Улыбка
  

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #13 - 11. Августа 2008 :: 09:33
Печать  
artbear писал(а) 11. Августа 2008 :: 08:36:
Только особого смысла не вижу - похоже, что ты хочешь создать универсальный "большой" список и с ним работать. Зачем? все равно как-то нужно параметры передавать, а при передаче ты будешь знать их количество Улыбка

В моем случае смысл есть. Список не такой большой - 6 параметров макс. Это события формы.
В кратце:
Есть глоб.перехватчик, который для каждой формы создает класс-перехватчик (чисто в служебных целях, назовем его КПФ) и, при необходимости, раздает события "подписавшимся классам", если таковые имеются, и модулю формы.

Предугадывая вопрос: "дурак, зачем ты это сделал?", опишу вкратце. Кроме стандартных событий FormEx и формы, КПФ генерит дополнительные события, при этом упростились почти все классы и модули формы (выкинуты перехватчики, соответственно передача события пред.перехватчику, проверки нажатий клавиш (спец.символы, печ.символы и т.д.) и мыши, проверки событий: "с этим реквизитом происходит нажатие?", "вышла мышка или курсор за пределы реквизита? - типа потери фокуса"  и т.п.). При этом, кроме "подписавшихся", класс дружит с теми, кто сам перехватывает форму (для еще не переделанных классов). Вот такой вот симбиоз.

А теперь ответ на вопрос: "Зачем?". У подписавшихся классов:
1) у одного и того же события может быть разное количество параметров, т.е.  ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) или ПриНажатииКнопкиКлавиатуры(КодКлавиши).
2) событие может быть процедурой и функцией

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

С выполняемым модулем намного проще (хоть и кода строк на 10 больше из-за перебора "подписчиков"). Я передаю списком все значения (например КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО), а сколько нужно подписавшемуся классу параметров - это его дело. А перебирать, сколько параметров нужно конкретному методу и соответственно дополнять или обрезать список значений - лишняя трата времени и сил.

Ясно ли написал? (с русским у меня проблема Улыбка)
Критикуйте, готов ответить на вопросы.
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Как определить изменение значения параметра
Ответ #14 - 11. Августа 2008 :: 09:51
Печать  
AndreyM писал(а) 11. Августа 2008 :: 08:28:
vandalsvq писал(а) 11. Августа 2008 :: 08:12:
Ой... получилось... вот кратко пример кода

Ой, ну ты и намудрил...  Нерешительный


То что я намудрил, это я знаю, иногда есть необхожимость решения задачи, а над дизайном думать некогда, эффективность тоже конечно пострадала (все таки собирать модуль и т.д.), но опять таки время было в обрез, а решить надо было. Счас когда есть "интерфейс" КОПа, можно его внутренние методы работы переделывать как душе угодно, при этом текущий функционал не пострадает  Подмигивание

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

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