Интереснейшая (для меня, по крайней мере) находка!
Наверное многие знакомы с полезной функцией
CBLModule::EvalExpr(char const *,CValue &,CValue **)
Вычисляющей значения выражений, заданных текстовой строкой, причём в окружении текущего исполняемого кода с доступом даже ко всем локальным переменным. Вызывается которая обычно так:
CBLModule::GetExecutedModule()->EvalExpr(...)
Заинтересовал меня её последний параметр (массив значений CValue**). В вызовах везде туда NULL передаётся.
Возникли у меня сразу подозрения, что туда можно передавать массив параметров, которые можно как-то использовать потом внутри выражения.
А я как раз такую штуку ну ООЧЕНЬ хотел, думал уже всякие извращённые методы применять. А тут обратил внимание и решил копнуть. Копать пришлось глубоко, но таки нашёл.
Гипотеза оказалась верна и результат таков: туда действительно передаётся массив параметров, а для доступа к ним в выражении нужно использовать конструкции вида
%%N.
N - число, номер параметра в массиве (нумерация от 1).
Если использовать
%%0, сработает как
%%1. А если выйти за правую границу массива, 1С, естественно, упадёт, ибо размер массива сообщить некуда.
Если не передавать массив параметров (передать NULL), то такие конструкции будут считаться ошибкой синтаксиса.
Пользуйтесь на здоровье.