Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Не работают методы ВыполнитьПроцедуру/Функцию (число прочтений - 8078 )
SnarkHunter
Junior Member
**
Отсутствует


Vae victis!

Сообщений: 22
Местоположение: Россия, Новосибирск
Зарегистрирован: 16. Ноября 2007
Пол: Мужской
Не работают методы ВыполнитьПроцедуру/Функцию
06. Июня 2008 :: 07:24
Печать  
25, 27 релиз SQL

Вся конфигурация состоит из нескольких строк в глобальном модуле:

Код
Выбрать все
// ****************************************************************************
Процедура ВызываемаяПроцедура()
	Сообщить("Сообщение от вызываемой процедуры.");
КонецПроцедуры	// ВызываемаяПроцедура

// ****************************************************************************
Процедура ПриНачалеРаботыСистемы()
	Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
		Предупреждение("Не загружена компонента FormEx.dll!", 30);
		СтатусВозврата(0);
	КонецЕсли;

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

	Если чРезультат = 0 Тогда
		Сообщить("Не удалось выполнить процедуру!");
	КонецЕсли;
КонецПроцедуры	// ПриНачалеРаботыСистемы
 



При старте с релизом FormEx 2.0.5.69 получаем сообщение "Сообщение от вызываемой процедуры.".
При старте с релизами 2.0.5.78, 82, 86 получаем сообщение "Не удалось выполнить процедуру!".

Других промежуточных релизов не нашел, есть мнение, что всё началось с 71...

Хотелось бы услышать мнения по данному факту. Спасибо.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #1 - 06. Июня 2008 :: 09:58
Печать  
Есть мнение, что в первом параметре все-таки нужно контекст формы передавать Улыбка
  

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


Vae victis!

Сообщений: 22
Местоположение: Россия, Новосибирск
Зарегистрирован: 16. Ноября 2007
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #2 - 06. Июня 2008 :: 10:36
Печать  
Во-первых, хотелось бы понять почему работало в релизе 2.0.5.69, а потом вдруг внезапно перестало... Кстати, в релизе под номером 2.0.0.8 тоже работает...

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

В-третьих, как варианты были испробованы вызовы

Код
Выбрать все
Сервис.ВыполнитьПроцедуру(Контекст, "ВызываемаяПроцедура") 


и

Код
Выбрать все
Сервис.ВыполнитьПроцедуру(ВернутьКонтекст(Контекст), "ВызываемаяПроцедура") 



где ВернутьКонтекст - известная функция из типовых конфигураций.
Результат один и тот же - возвращаемое значение равно 0...
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #3 - 06. Июня 2008 :: 10:40
Печать  
SnarkHunter писал(а) 06. Июня 2008 :: 10:36:
Во-вторых, хотелось бы краем глаза взглянуть на форму глобального модуля, потом уже можно и контекст этой формы передать в качестве первого параметра...

Форма глобального модуля - Это как?
  

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: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #4 - 06. Июня 2008 :: 10:44
Печать  
Я лично никогда не знал, что подобным образом можно вызвать метод из глобальника Печаль
Неужели правда?
Выложи, плиз, тестовую конфу.
Посмотрю на разных вариантах ФормЕкс.

ЗЫ я правил код реализации данных вызовов в ФормЕкс для работы с явной передачей контекстов любых форм, никакого глобальника не подразумевалось.

В общем, жду тест.
  

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


Vae victis!

Сообщений: 22
Местоположение: Россия, Новосибирск
Зарегистрирован: 16. Ноября 2007
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #5 - 06. Июня 2008 :: 11:16
Печать  
Цитата:
Форма глобального модуля - Это как?


Вот и мне хотелось бы узнать - это как? Потому как писал я это в ответ на: "Есть мнение, что в первом параметре все-таки нужно контекст формы передавать", а вызов у меня идет в глобальном модуле...

Да, подобным образом можно БЫЛО вызывать метод из глобальника, и не только из глобальника, а и внутри любого модуля можно было вызвать таким способом любую процедуру/функцию этого модуля без передачи контекста...

P.S. Тестовую конфигурацию прицепил, релизы, на которых срабатывает и не срабатывает указаны в первом посте ветки.
  

Test_conf.rar ( 8 KB | Загрузки )

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #6 - 06. Июня 2008 :: 11:20
Печать  
Создай, плиз, баг в разделе ФормЕкс.
Баг подтверждаю.
  

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: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #7 - 06. Июня 2008 :: 11:32
Печать  
Причину ошибки нашел, я ошибся в одном условии Печаль
Создай баг, я исправлю исходники ФормЕкс и выложу новую сборку.
  

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


Vae victis!

Сообщений: 22
Местоположение: Россия, Новосибирск
Зарегистрирован: 16. Ноября 2007
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #8 - 06. Июня 2008 :: 16:34
Печать  
Создал, номер 3906.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #9 - 07. Июня 2008 :: 04:00
Печать  
Данное поведение носит неявный характер.
Например, если написать в глобальнике следующий код
Код
Выбрать все
Процедура ПриватныйМетод()
	Предупреждение("ПриватныйМетод");
КонецПроцедуры

Функция гл_ФормЕкс_Сервис_ВыполнитьПроцедуру(ИмяМетодаГлобальника) Экспорт

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

	Возврат 1;
КонецФункции
 


и выполнить данный код из какой-нибудь обработки или класса 1С++, то уже не получится вызвать ПриватныйМетод Печаль

Т.е. данное употребление Сервис::ВыполнитьПроцедуру/Функцию довольно специфично, использует неявный вызов, и может работать только при отсутствии текущего контекста.
Например, внутри глобальных ОбработкиОжидания от 1С или ФормЕкс, или внутри глобального метода ВнешнееСобытие().

Также вызов без явного указания используемого контекста также имеет неявный характер и очень труден в использовании/переносимости/сопровождении.

В итоге я, например, не могу рекомендовать подобное использование данного метода.

ИМХО намного лучше использовать объект ВыполняемыйМодуль, который не зависит от подобных неявностей и позволяет выполнить любую функцию из глобальника.

ЗЫ я, конечно, могу исправить, но не очень хочется поощрять подобное поведение ФормЕкс.

Жду ваших мнений.
Приоритетным мнением будет являться мнение АльФ-а как автора, конечно.
  

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


Vae victis!

Сообщений: 22
Местоположение: Россия, Новосибирск
Зарегистрирован: 16. Ноября 2007
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #10 - 07. Июня 2008 :: 04:27
Печать  
Цитата:
ИМХО намного лучше использовать объект ВыполняемыйМодуль, который не зависит от подобных неявностей и позволяет выполнить любую функцию из глобальника.


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

Во-первых, в качестве первого параметра в метод ВыполнитьПроцедуруКонтекста необходимо передавать агрегатный объект, если верить документации. Способов получить агрегатный объект "Глобальный модуль" я не знаю.

Во-вторых, в коде из первого поста я пробовал использовать метод ВыполнитьПроцедуруКонтекста вместо ВыполнитьПроцедуру, передавая первым параметром контекст глобального модуля. В ответ получил замечательное сообщение:

Код
Выбрать все
чРезультат = обВыпМодуль.ВыполнитьПроцедуруКонтекста(Контекст, "ВызываемаяПроцедура", сзПарам);
{Глобальный модуль(23)}: Класс <ВыполняемыйМодуль> - первым параметром должен быть передан контекст
 



Не совсем понятное требование, если учесть, что первый параметр - это контекст в чистом виде...

P.S. Запускал с релизами 1С++ 2.5.0.2 и 2.5.0.5
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #11 - 07. Июня 2008 :: 04:37
Печать  
Для получения глобального контекста в глобальнике можно написать код наподобие следующего
Код
Выбрать все
Функция ВзятьКонтекст(Конт) Экспорт
	Возврат Конт;
КонецФункции

Функция ВзятьГлобальныйКонтекст() Экспорт
	Возврат ВзятьКонтекст(Контекст);
КонецФункции 

  

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 - 07. Июня 2008 :: 04:40
Печать  
SnarkHunter писал(а) 07. Июня 2008 :: 04: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 записан
 
SnarkHunter
Junior Member
**
Отсутствует


Vae victis!

Сообщений: 22
Местоположение: Россия, Новосибирск
Зарегистрирован: 16. Ноября 2007
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #13 - 07. Июня 2008 :: 04:54
Печать  
artbear писал(а) 07. Июня 2008 :: 04:37:
Для получения глобального контекста в глобальнике можно написать код наподобие следующего
Код
Выбрать все
Функция ВзятьКонтекст(Конт) Экспорт
	Возврат Конт;
КонецФункции

Функция ВзятьГлобальныйКонтекст() Экспорт
	Возврат ВзятьКонтекст(Контекст);
КонецФункции 



Не помогает, появляется то же самое сообщение о необходимости передать контекст в качестве первого параметра... Код вызова следующий:
Код
Выбрать все
сзПарам = СоздатьОбъект("СписокЗначений");
обВыпМодуль = СоздатьОбъект("ВыполняемыйМодуль");
КонтекстГМ = ВернутьГлобальныйКонтекст(); // ВернутьКонтекст(Контекст);
чРезультат = обВыпМодуль.ВыполнитьПроцедуруКонтекста(КонтекстГМ, "ВызываемаяПроцедура", сзПарам);
 




Цитата:
Приватную функцию ГМ выполнить из ВМ нельзя,  приват он и в Африке приват


Я пытаюсь в ГМ выполнить приватную функцию ГМ, речь о ВМ нигде вроде бы не шла...
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Не работают методы ВыполнитьПроцедуру/Функцию
Ответ #14 - 07. Июня 2008 :: 05:01
Печать  
Сейчас проверю.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать