При разработке вычислений в системе 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 |