Difference between revisions of "ExecuteFunction"

From SunFlurry wiki
Jump to: navigation, search
 
m (1 revision imported)
 
(2 intermediate revisions by 2 users not shown)
Line 17: Line 17:
 
== Синтаксис ==
 
== Синтаксис ==
 
<code>
 
<code>
'''ExecuteFunction'''(''<Имя функции (STRING)>''{{Optional|,<Глубина поиска (INT)>{{Default|{{Eq}}0}}{{ByRef|,<Аргумент 1>,<Аргумент 2>...}}}}):''<Результат исполнения функции>''
+
'''ExecuteFunction'''(''<Имя функции (STRING)>''{{Optional|,<Глубина поиска или компилированная функция (INT, COMPILEDFUNCTION)>{{Default|{{Eq}}0}}{{ByRef|,<Аргумент 1>,<Аргумент 2>...}}}}):''<Результат исполнения функции>''
 
</code>
 
</code>
 
==== Аргументы ====
 
==== Аргументы ====
 
* <code>''<Имя функции (STRING)>''</code> - Имя функции, которую необходимо исполнить
 
* <code>''<Имя функции (STRING)>''</code> - Имя функции, которую необходимо исполнить
 
* <code>''<Глубина поиска (INT)>''</code> - {{Optional}} Может принимать следующие значения:
 
* <code>''<Глубина поиска (INT)>''</code> - {{Optional}} Может принимать следующие значения:
** 0 (по умолчанию) -- выполнять поиск по всех модулях [[Общее описание языка#Вложенность функций и модулей, уровни вложенности|большего уровня вложенности]] (родительских) и во всех глобальных модулях.
+
** 0 (по умолчанию) -- выполнять поиск во всех модулях [[Общее описание языка#Вложенность функций и модулей, уровни вложенности|большего уровня вложенности]] (родительских) и во всех глобальных модулях.
 
** 1 -- выполнять поиск только внутри текущего модуля.
 
** 1 -- выполнять поиск только внутри текущего модуля.
 
** 2 -- выполнять поиск только внутри родительского модуля.
 
** 2 -- выполнять поиск только внутри родительского модуля.
 
** 3..x -- выполнять поиск только внутри родительского модуля указанного уровня (к примеру, для уровня 3, выполнять поиск только в родителе родителя текущего модуля).
 
** 3..x -- выполнять поиск только внутри родительского модуля указанного уровня (к примеру, для уровня 3, выполнять поиск только в родителе родителя текущего модуля).
 +
** Объект типа [[Compile|компилированная функция]] -- выполнять поиск функции внутри заданной компилированной функции (только среди функций верхнего уровня).
 
* <code>''<Аргумент ?>''</code> - {{Optional}} {{ByRef}} Аргументы, передаваемые исполняемой функции
 
* <code>''<Аргумент ?>''</code> - {{Optional}} {{ByRef}} Аргументы, передаваемые исполняемой функции
  
Line 69: Line 70:
 
   ExecuteFunction("OnAfterDocumentSaveOrPublish",1,1,флПарам);
 
   ExecuteFunction("OnAfterDocumentSaveOrPublish",1,1,флПарам);
 
EndIf;
 
EndIf;
 +
</pre>
 +
 +
 +
<pre>
 +
//Пример показывает исполнение определенной функции из компилированного блока текста
 +
//Заметьте: вызванная таким образом функция HelloWorld не имеет доступа к переменной Перем1, заданной в блоке для компиляции
 +
 +
//Блок текста для компиляции
 +
Стр:="Var Перем1 Export;
 +
|
 +
|Function HelloWorld(Arg1)
 +
|  Message(""Аргумент: ""+Arg1);
 +
|  Result:=132;
 +
|EndFunction;
 +
|
 +
|Message(""Исполнение вне функции HelloWorld"");";
 +
 +
//Компилируем блок текста, получаем объект аФунк
 +
аФунк:=Compile(Стр);
 +
 +
//На экран будет выведено последовательно:
 +
//"Аргумент: Строковой аргумент"
 +
//"Результат: 132"
 +
Message("Результат: "+ExecuteFunction("HelloWorld",аФунк,"Строковой аргумент"));
 
</pre>
 
</pre>

Latest revision as of 19:05, 20 November 2021

  ExecuteFunction (Системные функции)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, исключение внутри функции, неверные параметры вызова
Визуальность:Нет

Функция инициирует исполнение функции с указанным именем в текущем контексте исполнения с заданными аргументами, способ поиска задается вторым аргументом. Если искомая функция не существует, пропущен обязательный аргумент или заданное количество аргументов слишком велико, будет создано исключение. Функции этой группы могут использоваться в макросах форм для вызова заранее определенных функций-событий. От использования Exec функции DoesFunctionExist и ExecuteFunction отличаются избирательным поиском функций, к примеру, Exec может исполнить функцию с таким же именем в глобальном модуле, тогда как, возможно, это нежелательно.

Синтаксис

ExecuteFunction(<Имя функции (STRING)>,<Глубина поиска или компилированная функция (INT, COMPILEDFUNCTION)>=0,<Аргумент 1>,<Аргумент 2>...):<Результат исполнения функции>

Аргументы

  • <Имя функции (STRING)> - Имя функции, которую необходимо исполнить
  • <Глубина поиска (INT)> - (необязательный аргумент) Может принимать следующие значения:
    • 0 (по умолчанию) -- выполнять поиск во всех модулях большего уровня вложенности (родительских) и во всех глобальных модулях.
    • 1 -- выполнять поиск только внутри текущего модуля.
    • 2 -- выполнять поиск только внутри родительского модуля.
    • 3..x -- выполнять поиск только внутри родительского модуля указанного уровня (к примеру, для уровня 3, выполнять поиск только в родителе родителя текущего модуля).
    • Объект типа компилированная функция -- выполнять поиск функции внутри заданной компилированной функции (только среди функций верхнего уровня).
  • <Аргумент ?> - (необязательный аргумент) (возможен аргумент-переменная (ByRef)) Аргументы, передаваемые исполняемой функции

Возвращаемое значение

Возвращает результат исполнения функции.

Примеры

//Визуальное событие OnClick в макросе, состоящем из группы кнопок
//Событие вызывает функции в локальном модуле, на форме которого размещен макрос

//Событие в локальном модуле может отменить обработку документа
//флПарам -- параметр, передаваемый в модуль обработки документа, может быть изменен функцией OnBeforeDocumentSaveOrPublish
//ФлТип -- если OnBeforeDocumentSaveOrPublish возвратит 0, обработка будет отменена
//         1 -- обработка будет выполнена
//         2 -- обработку выполнила сама функция OnBeforeDocumentSaveOrPublish, выполнять ее здесь не требуется
флПарам:=0;
ФлТип:=0;
If DoesFunctionExist("OnBeforeDocumentSaveOrPublish",1) Then
  ФлТип:=Number(ExecuteFunction("OnBeforeDocumentSaveOrPublish",1,1,флПарам));
  If ФлТип=0 Then
    Exit;
  EndIf;
EndIf;

//Далее следует блок обработки документа
If ФлТип<>2 Then
  Try
    If aEl.Status()<0 Then //Документ необходимо записать, если он новый
      aEl.Save();
    EndIf;
    if not aEl.Publish(флПарам) Then
      Exit;
    EndIf;
  Except
    Message(глПодготовитьОшибкуОбработки(),"!");
    Exit;
  EndTry;
EndIf;

//Событие в локальном модуле может произвести действия, необходимые после обработки документа
If DoesFunctionExist("OnAfterDocumentSaveOrPublish",1) Then
  ExecuteFunction("OnAfterDocumentSaveOrPublish",1,1,флПарам);
EndIf;


//Пример показывает исполнение определенной функции из компилированного блока текста
//Заметьте: вызванная таким образом функция HelloWorld не имеет доступа к переменной Перем1, заданной в блоке для компиляции

//Блок текста для компиляции
Стр:="Var Перем1 Export;
|
|Function HelloWorld(Arg1)
|  Message(""Аргумент: ""+Arg1);
|  Result:=132;
|EndFunction;
|
|Message(""Исполнение вне функции HelloWorld"");";

//Компилируем блок текста, получаем объект аФунк
аФунк:=Compile(Стр);

//На экран будет выведено последовательно:
//"Аргумент: Строковой аргумент"
//"Результат: 132"
Message("Результат: "+ExecuteFunction("HelloWorld",аФунк,"Строковой аргумент"));