К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как в 1С взять число по модулю

Как в 1С взять число по модулю: функция ABS(), примеры кода на встроенном языке, работа с запросами, типичные ошибки и проверка результата.

Во встроенном языке 1С модуль числа возвращается функцией ABS() (синоним на русском — МодульЧисла() в некоторых старых конфигурациях не используется, стандартная функция именно ABS). Она принимает один числовой аргумент и возвращает его абсолютное значение: ABS(-15.75) даст 15.75, а ABS(10) — 10.

Задача взять число по модулю возникает постоянно: при расчёте разниц между суммами, при сравнении отклонений плановых и фактических показателей, при обработке сторнирующих записей, где важна величина, а не знак. Ниже разобраны все практические сценарии: вызов в коде, в запросе, в СКД, а также типичные ошибки и способы проверки результата.

Функция ABS во встроенном языке 1С

Синтаксис предельно простой: ABS(Число). Аргумент — значение типа Число, результат — неотрицательное число того же типа. Функция доступна везде, где выполняется код на встроенном языке: на сервере, на клиенте (толстый и тонкий клиент), в общих модулях, модулях объектов и форм.

Пример базового использования:

Разница = ФактСумма - ПланСумма;

Отклонение = ABS(Разница);

Если Отклонение > ДопустимыйПорог Тогда

Сообщить("Превышено допустимое отклонение: " + Отклонение);

КонецЕсли;

Обратите внимание: функция называется именно ABS латиницей, даже если весь остальной код пишется на русском синтаксисе. Это одно из немногих исключений во встроенном языке 1С, и попытка написать «Модуль()» вызовет ошибку «Процедура или функция с указанным именем не определена».

Модуль числа в запросе 1С

В языке запросов 1С функции ABS нет — это частая точка затруднения. Модуль вычисляют через конструкцию ВЫБОР:

ВЫБРАТЬ

ВЫБОР

КОГДА Продажи.СуммаОборот < 0

ТОГДА -Продажи.СуммаОборот

ИНАЧЕ Продажи.СуммаОборот

КОНЕЦ КАК СуммаПоМодулю

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

Такой приём корректно работает и с суммами, и с количеством, и с любыми вычисляемыми выражениями. Важно не забыть унарный минус перед полем в ветке ТОГДА — без него отрицательное значение вернётся как есть.

Модуль в СКД и вычисляемых полях

В системе компоновки данных для вычисляемых полей действует тот же язык выражений, что и в запросах, поэтому используется аналогичная конструкция ВЫБОР. Если поле вычисляется уже на этапе расшифровки в коде, там доступна обычная функция ABS.

Типичные сценарии применения

Самый частый случай — сравнение двух величин по величине расхождения, когда знак не важен. Например, контроль расхождения между суммой документа и суммой оплаты: Если ABS(СуммаДокумента - СуммаОплаты) > 0.01 Тогда .... Порог в копейку защищает от ложных срабатываний из-за округления.

Второй сценарий — нормализация сторнирующих и возвратных движений. Если в отчёте нужно показать оборот по абсолютной величине независимо от того, возврат это или продажа, модуль применяют либо в запросе через ВЫБОР, либо уже при обходе выборки через ABS.

Третий сценарий — сортировка или поиск максимального отклонения. Чтобы найти строку с наибольшим расхождением независимо от знака, сравнивают ABS текущей разницы с ABS сохранённого максимума.

Порядок действий
  1. 1
    Определите, где вычисляется значение: в коде модуля или в запросе/СКД
  2. 2
    В коде примените ABS(Выражение) к нужной переменной или разности
  3. 3
    В запросе замените выражение на ВЫБОР КОГДА Поле < 0 ТОГДА -Поле ИНАЧЕ Поле КОНЕЦ
  4. 4
    Проверьте результат на отрицательном, положительном и нулевом значении
  5. 5
    Убедитесь, что сравнение с порогом учитывает возможные ошибки округления

Проверка результата и граничные случаи

Функция ABS корректно обрабатывает ноль: ABS(0) возвращает 0. С дробными числами проблем тоже нет — сохраняется точность исходного значения. Проверить поведение проще всего через «Вычислить выражение» (Shift+F9) в отладчике, введя ABS(-123.45).

Отдельный случай — передача в функцию нечислового значения. Если переменная имеет тип Строка или Неопределено, платформа выдаст ошибку времени выполнения. Перед вызовом в сомнительных местах полезно проверить тип: Если ТипЗнч(Значение) = Тип("Число") Тогда ....

При работе с очень большими отрицательными числами учитывайте разрядность типа Число в 1С (ограничена квалификаторами числа в метаданных). Для реквизитов с ограниченной разрядностью результат модуля всегда укладывается в ту же разрядность, так как знак не занимает разряд.

Контрольные точки

Как проверить результат

Вызов ABS с отрицательным числом
Норма

Возвращается положительное значение той же величины

Тревожный признак

Ошибка «функция не определена» — проверьте написание ABS латиницей

ABS с нулём и положительным числом
Норма

Возвращается то же значение без изменений

Тревожный признак

Значение меняется — вероятно, применена лишняя операция

Модуль в запросе через ВЫБОР
Норма

Отрицательные обороты выводятся положительными

Тревожный признак

Отрицательные значения остались — пропущен унарный минус в ветке ТОГДА

Типичные ошибки

Первая ошибка — попытка использовать ABS в тексте запроса. Запрос просто не выполнится, платформа сообщит о синтаксической ошибке или неизвестной функции. Решение — конструкция ВЫБОР, описанная выше.

Вторая ошибка — написание имени функции кириллицей или как «Модуль()». Встроенный язык такой функции не содержит, и код не скомпилируется. Правильное имя — ABS.

Третья ошибка — применение ABS до сравнения, когда знак на самом деле важен. Например, при проверке переплаты и недоплаты модуль уничтожит информацию о направлении расхождения, и логика отчёта станет неверной. Сначала проанализируйте знак, потом при необходимости берите модуль.

Типичные ошибки
01
Использование ABS в тексте запроса — запрос падает с ошибкой, нужна конструкция ВЫБОР КОГДА
02
Написание имени функции кириллицей — код не компилируется, правильно только ABS
03
Применение ABS до анализа знака — теряется информация о направлении расхождения
04
Передача строки или Неопределено в ABS — ошибка времени выполнения, нужна проверка типа

Альтернативы и когда они оправданы

Вместо ABS иногда пишут ручную проверку: Если Х < 0 Тогда Х = -Х; КонецЕсли;. Результат идентичен, но код длиннее и менее читаем — встроенная функция предпочтительнее.

Ещё один вариант — Макс(Х, -Х). Он тоже даёт модуль, но это неочевидный приём, который затрудняет чтение кода коллегами. Использовать его стоит только если есть специфическая причина.

Сравнение вариантов

ABS(Х)

Стандартный и самый читаемый способ в коде; не работает в тексте запроса

ВЫБОР КОГДА Х < 0 ТОГДА -Х ИНАЧЕ Х КОНЕЦ

Единственный вариант в запросах и вычисляемых полях СКД; громоздкий в коде

Макс(Х, -Х)

Работает, но неочевиден при чтении; подходит как редкий приём

FAQ

Как называется функция модуля числа в 1С?

ABS(). Она пишется латиницей даже в русском синтаксисе встроенного языка и доступна на клиенте и на сервере во всех современных версиях платформы.

Почему ABS не работает в запросе 1С?

Язык запросов 1С не содержит функции ABS. Модуль вычисляется конструкцией ВЫБОР КОГДА Поле < 0 ТОГДА -Поле ИНАЧЕ Поле КОНЕЦ — она даёт тот же результат.

Что вернёт ABS, если передать ноль?

Ноль. Модуль нуля равен нулю, функция отрабатывает корректно и не вызывает ошибок.

Что будет, если передать в ABS строку или Неопределено?

Возникнет ошибка времени выполнения, так как функция ожидает число. Перед вызовом проверяйте тип через ТипЗнч() или приводите значение к числу.

Как взять модуль разности двух чисел?

Передайте разность прямо в функцию: ABS(Число1 - Число2). Это стандартный приём для оценки отклонения без учёта знака.

Есть ли функция модуля в консоли кода или внешних обработках?

Да, любой код на встроенном языке — в консоли кода, внешней обработке, общем модуле — поддерживает ABS одинаково. Ограничение касается только текста запросов и выражений СКД.

Итог

Что важно запомнить

В коде 1С модуль числа берётся функцией ABS(Число), имя пишется только латиницей. В запросах и СКД ABS недоступна — используйте ВЫБОР КОГДА значение меньше нуля. Перед вызовом убедитесь, что аргумент числовой, и не применяйте модуль до анализа знака, если направление расхождения важно.