При написании отчетов и сложных выборок в системе 1С:Предприятие разработчики нередко сталкиваются с необходимостью преобразовать отрицательные числа в положительные (вычислить модуль). На первый взгляд задача кажется простой, однако при использовании конструкции ВЫБОР часто возникают ошибки, приводящие к некорректным результатам или пустым колонкам в отчетах. Давайте разберем, почему это происходит и как правильно реализовать подобный расчет. При необходимости реализации других математических функций в запросах можно использовать способ вычисления квадратного корня в запросе.
Чаще всего при попытке вычислить модуль числа через ВЫБОР разработчики забывают про секцию ИНАЧЕ. В языке запросов 1С, если условие не выполняется (например, число положительное) и секция ИНАЧЕ не указана, система неявно возвращает значение NULL.
Это приводит к критической ошибке при суммировании: в языке запросов 1С любая арифметическая операция с NULL (например, NULL + 100) дает в результате NULL. В итоге вся итоговая колонка оказывается пустой, хотя данные в системе присутствуют.
Чтобы избежать появления NULL, необходимо всегда указывать ветку ИНАЧЕ. Если нам нужно превратить отрицательное число в положительное, а положительное оставить без изменений, мы должны явно указать это в запросе.
Рассмотрим структуру выражения для вычисления модуля:
ВЫБОР
КОГДА НачальныйОстаток < 0
ТОГДА -НачальныйОстаток
ИНАЧЕ НачальныйОстаток
КОНЕЦ
В этом примере мы «просим» систему проверить значение: если оно меньше нуля, мы умножаем его на -1 (или просто ставим минус перед полем), а если число положительное или равно нулю, мы возвращаем его исходное значение через ИНАЧЕ. Такой подход гарантирует, что мы всегда получим числовое значение, которое можно корректно просуммировать.
Допустим, у нас есть несколько полей, которые мы хотим просуммировать по модулю. Чтобы получить итоговый результат, нам нужно применить логику ВЫБОР к каждому слагаемому отдельно. Проанализируем алгоритм:
ВЫБОР ... ИНАЧЕ ... КОНЕЦ.ВЫБОР присутствует ключевое слово КОГДА перед условием.ИНАЧЕ, чтобы при положительных значениях мы не получали NULL.Давайте посмотрим, как будет выглядеть итоговый запрос для нашей задачи:
ВЫБОР
КОГДА НачальныйОстаток < 0 ТОГДА -НачальныйОстаток ИНАЧЕ НачальныйОстаток
КОНЕЦ +
ВЫБОР
КОГДА Приход < 0 ТОГДА -Приход ИНАЧЕ Приход
КОНЕЦ +
ВЫБОР
КОГДА Расход < 0 ТОГДА -Расход ИНАЧЕ Расход
КОНЕЦ +
ВЫБОР
КОГДА КонечныйОстаток < 0 ТОГДА -КонечныйОстаток ИНАЧЕ КонечныйОстаток
КОНЕЦ КАК СуммаПоМодулю
При написании подобных конструкций важно помнить о следующих нюансах:
ВЫБОР требует обязательного наличия ключевых слов КОГДА, ТОГДА, ИНАЧЕ и КОНЕЦ. Пропуск любого из них приведет к ошибке разбора запроса.NULL — это «инфекция» в запросах. Если хотя бы одно слагаемое в длинной цепочке превратится в NULL из-за отсутствия ИНАЧЕ, вся сумма станет невалидной.Теперь, когда мы проанализировали эту распространенную ловушку, вы можете быть уверены, что ваши отчеты будут корректно суммировать данные, даже если в исходных полях встречаются отрицательные значения.