Суть
Допустим, что у вас есть формулы, введенные пользователем, и имеющие вид:
[1] * 20 / (90 * 10 - (60 / ([2] - [4] * 9) * [2] - (5 / [7] - 50) / 8) - 100 * [5])
Где есть Числа и [Переменные], значения которых будут получены при прогоне этой формулы через запрос с динамически сформированным текстом.
ВЫБРАТЬ ВТ.п1 * 20 / (90 * 10 - (60 / ВТ.п2 - Вт.п4 * 9) * ВТ.п2 - (5 / ВТ.п7 - 50) / 8) - 100 * ВТ.п5) Как ВТ.п99
Одной нулевой переменной достаточно для выпадения в деление на 0. Данный же метод в автоматическом режиме расставляет проверки через ВЫБОР КОГДА [1] = 0 ТОГДА 0 в ваших формулах. Несмотря на кажущуюся простоту, задача эта, внезапно, оказалась нетривиальной, в частности благодаря вложенным скобкам, следующим друг за другом делениям/умножениям и необходимостью соблюдать правильный порядок математических действий. Механизм проверялся на множестве больших формул и, по идее, должен исправно раскладывать формулы любой сложности и вложенности.
Результат обработки примера выше:
ВЫБОР КОГДА ((90) * (10) - (ВЫБОР КОГДА ([2] - [4] * (9)) = 0 ТОГДА 0 Иначе (60) / ([2] - [4] * (9)) Конец * [2] - ВЫБОР КОГДА (8) = 0 ТОГДА 0 Иначе (ВЫБОР КОГДА [7] = 0 ТОГДА 0 Иначе / [7] Конец - (50)) / (8) Конец ) - (100) * [5]) = 0 ТОГДА 0 Иначе [1] * (20) / ((90) * (10) - (ВЫБОР КОГДА ([2] - [4] * (9)) = 0 ТОГДА 0 Иначе (60) / ([2] - [4] * (9)) Конец * [2] - ВЫБОР КОГДА (8) = 0 ТОГДА 0 Иначе (ВЫБОР КОГДА [7] = 0 ТОГДА 0 Иначе / [7] Конец - (50)) / (8) Конец ) - (100) * [5]) КонецОсобенности:
- Поддерживаются переменные вида <слово> и [число]
- Между знаками/операндами должны быть пробелы (как в примере)
Код представлен на GitHub (одинокий файл Module.bsl)