Копировать ссылку на страницу Перейти в предыдущий раздел Перейти в следующий раздел

При разработке вычислений в системе DIRECTUM можно использовать динамический код – это код, при выполнении которого, автоматически генерируется новый код для последующего выполнения. Например, формируются названия компонент или создаются сами компоненты.

Динамический код применим в функциях только с одинаковыми параметрами.

Постановка задачи

С помощью сценария необходимо обработать разные справочники, допустим Организации, Договоры, Подразделения организаций и Регистрационно-контрольные карточки, каждый по-своему.

Решение

1.Код обработки каждого справочника вынесите в индивидуальную функцию:

 

if ReferenceName == "ОРГ"

  FiltrateORGReference(NeedRepeatFilter; ViewMode)

else

  if ReferenceName == "ДГВ"

    FiltrateDGVReference(NeedRepeatFilter; ViewMode)

  else

    if ReferenceName == "ПОР"

      FiltratePORReference(NeedRepeatFilter; ViewMode)

    else

      if ReferenceName == "РКК"

        FiltrateRKKReference(NeedRepeatFilter; ViewMode)

      else

        ...

      endif

    endif

  endif

endif

2.Напишите динамический код для функций:
если нет возможности сформировать имя функции по значению ReferenceName, то:

 

ReferenceInfoArray = ArrayOf(

  ArrayOf("ОРГ"; "FiltrateORGReference");

  ArrayOf("ДГВ"; "FiltrateDGVReference");

...)

/* Для удобства последующей работы сохраним значения из массива

в список типа IList. Считаем, что данные имеют формат: <имя=значение>.*/

ReferenceInfoList = Application.GetList

REFERENCE_NAME_INDEX = 0

FUNCTION_NAME_INDEX = 1

foreach ReferenceInfo = CArrayElement(ReferenceInfoArray)

  ReferenceInfoList.Add(ReferenceInfo[REFERENCE_NAME_INDEX];

    ReferenceInfo[FUNCTION_NAME_INDEX])

endforeach

// Сформировать строку с вызовом функции по значению ReferenceName.

FunctionCallString = Format("%s(%s; %s)";

  ArrayOf(ReferenceInfoList.ValueByName(ReferenceName); Param1; Param2))

 

если возможность сформировать имя функции есть, то:

 

FunctionCallString = Format("Filtrate%sReference(%s; %s)";

  ArrayOf(Transliterate(ReferenceName; TRUE); Param1; Param2))

 

3.Напишите возвращаемое значение для функций:
если функция возвращает некоторое значение:

 

Execute('Object.Environment.SetVar("FILTRATE_REFERENCE_SELECT_RESULT";

  ' & FunctionCallString & ')')

Result = Object.Environment.ValueByName(

  "FILTRATE_REFERENCE_SELECT_RESULT")

 

если функция не имеет возвращаемого значения:

Execute(FunctionCallString)

В стандартной поставке динамический код используется в функциях DISIFillDialogParamsRun и ConnectorFindObject.

© Компания DIRECTUM, 2018 Сообщество пользователей DIRECTUM
.navbar > a:hover { background: #FFD73B; }