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



Сообщений: 56
Местоположение: Ростов-на-Дону
Зарегистрирован: 25. Июля 2006
Пол: Мужской
Как вызвать процедуру, зная имя?
22. Ноября 2010 :: 08:00
Печать  
Как можно сделать такое:
Код
Выбрать все
Процедура Что()
 сообщить(1);
КонецПроцедуры

Процедура Сформировать()
 Для сч = 1 По сп.РазмерСписка() Цикл
  ИмяПроцедуры = сп.ПолучитьЗначение(сч);
  выполнить процедуру ИмяПроцедуры - как?
 КонецЦикла
КонецПроцедуры

сп = СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Что()"); 

  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #1 - 22. Ноября 2010 :: 08:11
Печать  
Посмотри в сторону метода ВыполнитьПроцедуру(Контекст, ИмяПроцедуры, СписокАргументов) объекта Сервис.
Но понадобится Контекст.
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как вызвать процедуру, зная имя?
Ответ #2 - 22. Ноября 2010 :: 08:15
Печать  
Либо штатно - через Шаблон..
Либо через ВыполняемыйМодуль
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #3 - 22. Ноября 2010 :: 08:24
Печать  
Eprst писал(а) 22. Ноября 2010 :: 08:15:
Либо штатно - через Шаблон..
Либо через ВыполняемыйМодуль

У шаблона есть ограничения, лучше через ВыполняемыйМодуль (1С++) или Сервис (ФормЕкс)
  

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



Сообщений: 56
Местоположение: Ростов-на-Дону
Зарегистрирован: 25. Июля 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #4 - 22. Ноября 2010 :: 08:41
Печать  
Может, я не так понял, но
Код
Выбрать все
Процедура Что()
	сообщить(1);
КонецПроцедуры

Процедура Сформировать()

	Мод = СоздатьОбъект("ВыполняемыйМодуль");
	Мод.ПрисоединитьТекущийМодуль();

	Для сч = 1 По сп.РазмерСписка() Цикл
		ИмяПроцедуры = сп.ПолучитьЗначение(сч);
		Мод.ВыполнитьПроцедуруКонтекста(Контекст, ИмяПроцедуры,сп);
	КонецЦикла
КонецПроцедуры

сп = СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Что()"); 



не работает.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #5 - 22. Ноября 2010 :: 09:13
Печать  
Утюг писал(а) 22. Ноября 2010 :: 08:41:
Код
Выбрать все
сп = СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Что()"); 


не работает.

Попробуй скобки убрать ... это же имя, а не вызов.
  
Наверх
 
IP записан
 
Утюг
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Ростов-на-Дону
Зарегистрирован: 25. Июля 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #6 - 22. Ноября 2010 :: 09:19
Печать  
Убирал, ничего не изменилось.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #7 - 22. Ноября 2010 :: 09:21
Печать  
а через Сервис (FormEx) почему не хочешь попробовать?
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #8 - 22. Ноября 2010 :: 09:25
Печать  
Код
Выбрать все
Процедура Что()
	сообщить(1);
КонецПроцедуры

Процедура Сформировать()

	Сервис = СоздатьОбъект("Сервис");
	Для сч = 1 По сп.РазмерСписка() Цикл
		ИмяПроцедуры = сп.ПолучитьЗначение(сч);
		Рез=Сервис.ВыполнитьПроцедуру(Контекст,ИмяПроцедуры);
		Сообщить("Результат выполнения процедуры """+ИмяПроцедуры+""" = "+Рез);
	КонецЦикла
КонецПроцедуры

сп = СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Что");
 

  
Наверх
IP записан
 
Утюг
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Ростов-на-Дону
Зарегистрирован: 25. Июля 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #9 - 22. Ноября 2010 :: 09:34
Печать  
Через Сервис.ВыполнитьПроцедуру получилось (надо было только скобки в имени процедуры убрать).
Хотелось бы все-таки ВыполняемыйМодуль добить (для общего образования).
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #10 - 22. Ноября 2010 :: 09:44
Печать  
После присоединения/установки модуля, на сколько я помню, его надо "КомпилироватьИВыполнитьМодуль", а уж потом работать с ним
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #11 - 22. Ноября 2010 :: 09:48
Печать  
Утюг писал(а) 22. Ноября 2010 :: 08:41:
Может, я не так понял, но
Код
Выбрать все
Процедура Что()
	сообщить(1);
КонецПроцедуры

Процедура Сформировать()

	Мод = СоздатьОбъект("ВыполняемыйМодуль");
	Мод.ПрисоединитьТекущийМодуль();

	Для сч = 1 По сп.РазмерСписка() Цикл
		ИмяПроцедуры = сп.ПолучитьЗначение(сч);
		Мод.ВыполнитьПроцедуруКонтекста(Контекст, ИмяПроцедуры,сп);
	КонецЦикла
КонецПроцедуры

сп = СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Что()"); 



не работает.


А ты уверен, что правильно прочитал справку по функции ВыполнитьПроцедуруКонтекста? у тебя не соответствует число параметров. Ты пытаешься заставить ВыполняемыйМодуль найти и выполнить процедуру с именем "Что" и ОДНИМ строковым параметром...
  
Наверх
 
IP записан
 
Утюг
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Ростов-на-Дону
Зарегистрирован: 25. Июля 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #12 - 22. Ноября 2010 :: 09:54
Печать  
Синтаксис: ВыполнитьПроцедуруКонтекста(Объект, ИмяПроцедуры, СписокАргументов)

СписокАргументов - тип: СписокЗначений. Список аргументов для упомянутой процедуры

Процедура Что() не имеет аргументов, следовательно, передавать можно любой список, вплоть до пустого. Я так понял.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #13 - 22. Ноября 2010 :: 09:55
Печать  
Утюг писал(а) 22. Ноября 2010 :: 09:54:
Синтаксис: ВыполнитьПроцедуруКонтекста(Объект, ИмяПроцедуры, СписокАргументов)

СписокАргументов - тип: СписокЗначений. Список аргументов для упомянутой процедуры

Процедура Что() не имеет аргументов, следовательно, передавать можно что угодно, вплоть до пустого списка. Я так понял.

Не что угодно, а именно список с параметрами вызова - в твоем случае он будет пустым.
Тогда почему ты передаешь туда список с одним строковым значением?
P.S.: Про скобки в имени я уже писал выше...
  
Наверх
 
IP записан
 
Утюг
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Ростов-на-Дону
Зарегистрирован: 25. Июля 2006
Пол: Мужской
Re: Как вызвать процедуру, зная имя?
Ответ #14 - 22. Ноября 2010 :: 10:05
Печать  
Скобки в имени повлияли на работу Сервиса. Для ВыпМодуля - ничего не дало:
Код
Выбрать все
Процедура Что() Экспорт
	сообщить(1);
КонецПроцедуры

Процедура Сформировать()

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

		Рез = Мод.ВыполнитьПроцедуруКонтекста(Контекст, ИмяПроцедуры,с);

	КонецЦикла;
КонецПроцедуры

сп = СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Что"); 

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