Разработка и Конфигурация · 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Определите, где вычисляется значение: в коде модуля или в запросе/СКД
- 2В коде примените ABS(Выражение) к нужной переменной или разности
- 3В запросе замените выражение на ВЫБОР КОГДА Поле < 0 ТОГДА -Поле ИНАЧЕ Поле КОНЕЦ
- 4Проверьте результат на отрицательном, положительном и нулевом значении
- 5Убедитесь, что сравнение с порогом учитывает возможные ошибки округления
Проверка результата и граничные случаи
Функция ABS корректно обрабатывает ноль: ABS(0) возвращает 0. С дробными числами проблем тоже нет — сохраняется точность исходного значения. Проверить поведение проще всего через «Вычислить выражение» (Shift+F9) в отладчике, введя ABS(-123.45).
Отдельный случай — передача в функцию нечислового значения. Если переменная имеет тип Строка или Неопределено, платформа выдаст ошибку времени выполнения. Перед вызовом в сомнительных местах полезно проверить тип: Если ТипЗнч(Значение) = Тип("Число") Тогда ....
При работе с очень большими отрицательными числами учитывайте разрядность типа Число в 1С (ограничена квалификаторами числа в метаданных). Для реквизитов с ограниченной разрядностью результат модуля всегда укладывается в ту же разрядность, так как знак не занимает разряд.
Как проверить результат
Возвращается положительное значение той же величины
Ошибка «функция не определена» — проверьте написание ABS латиницей
Возвращается то же значение без изменений
Значение меняется — вероятно, применена лишняя операция
Отрицательные обороты выводятся положительными
Отрицательные значения остались — пропущен унарный минус в ветке ТОГДА
Типичные ошибки
Первая ошибка — попытка использовать ABS в тексте запроса. Запрос просто не выполнится, платформа сообщит о синтаксической ошибке или неизвестной функции. Решение — конструкция ВЫБОР, описанная выше.
Вторая ошибка — написание имени функции кириллицей или как «Модуль()». Встроенный язык такой функции не содержит, и код не скомпилируется. Правильное имя — ABS.
Третья ошибка — применение ABS до сравнения, когда знак на самом деле важен. Например, при проверке переплаты и недоплаты модуль уничтожит информацию о направлении расхождения, и логика отчёта станет неверной. Сначала проанализируйте знак, потом при необходимости берите модуль.
Альтернативы и когда они оправданы
Вместо ABS иногда пишут ручную проверку: Если Х < 0 Тогда Х = -Х; КонецЕсли;. Результат идентичен, но код длиннее и менее читаем — встроенная функция предпочтительнее.
Ещё один вариант — Макс(Х, -Х). Он тоже даёт модуль, но это неочевидный приём, который затрудняет чтение кода коллегами. Использовать его стоит только если есть специфическая причина.
Сравнение вариантов
Стандартный и самый читаемый способ в коде; не работает в тексте запроса
Единственный вариант в запросах и вычисляемых полях СКД; громоздкий в коде
Работает, но неочевиден при чтении; подходит как редкий приём
FAQ
Как называется функция модуля числа в 1С?
ABS(). Она пишется латиницей даже в русском синтаксисе встроенного языка и доступна на клиенте и на сервере во всех современных версиях платформы.
Почему ABS не работает в запросе 1С?
Язык запросов 1С не содержит функции ABS. Модуль вычисляется конструкцией ВЫБОР КОГДА Поле < 0 ТОГДА -Поле ИНАЧЕ Поле КОНЕЦ — она даёт тот же результат.
Что вернёт ABS, если передать ноль?
Ноль. Модуль нуля равен нулю, функция отрабатывает корректно и не вызывает ошибок.
Что будет, если передать в ABS строку или Неопределено?
Возникнет ошибка времени выполнения, так как функция ожидает число. Перед вызовом проверяйте тип через ТипЗнч() или приводите значение к числу.
Как взять модуль разности двух чисел?
Передайте разность прямо в функцию: ABS(Число1 - Число2). Это стандартный приём для оценки отклонения без учёта знака.
Есть ли функция модуля в консоли кода или внешних обработках?
Да, любой код на встроенном языке — в консоли кода, внешней обработке, общем модуле — поддерживает ABS одинаково. Ограничение касается только текста запросов и выражений СКД.
Что важно запомнить
В коде 1С модуль числа берётся функцией ABS(Число), имя пишется только латиницей. В запросах и СКД ABS недоступна — используйте ВЫБОР КОГДА значение меньше нуля. Перед вызовом убедитесь, что аргумент числовой, и не применяйте модуль до анализа знака, если направление расхождения важно.