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

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

Как сделать число отрицательным в 1С

Как сделать число отрицательным в 1С: унарный минус, умножение на -1, функция Макс, работа с запросами и формулами. Примеры кода, ошибки и проверка результата.

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

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

Унарный минус — основной способ

Унарный минус — это стандартный оператор встроенного языка 1С, который меняет знак числа на противоположный. Он ставится непосредственно перед числом, переменной или выражением в скобках:

bsl
Число = 150;
Отрицательное = -Число;        // -150
Сумма = -(100 + 50);           // -150
ДвойнойМинус = -(-Число);      // 150

Оператор работает с любыми числовыми значениями: целыми, дробными, положительными и уже отрицательными. Если применить унарный минус к отрицательному числу, результат станет положительным — это стоит учитывать, когда нужно именно «загнать число в минус» независимо от исходного знака.

Унарный минус имеет высокий приоритет, но при работе со сложными выражениями рекомендуется явно ставить скобки. Запись -Число 2 и -(Число 2) даст одинаковый результат, однако скобки делают намерение очевидным и защищают от ошибок при последующей доработке кода.

Альтернативные способы изменить знак

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

Умножение на -1

Классический приём, понятный любому разработчику:

Результат = Число * (-1);

Этот способ удобен, когда коэффициент знака хранится в переменной. Например, документ возврата может содержать признак направления, и сумма умножается на 1 или -1 в зависимости от вида операции. Это делает код гибче, чем жёстко зашитый минус.

Вычитание из нуля

Менее распространённый, но рабочий вариант:

Результат = 0 - Число;

Такая запись иногда встречается в старом коде конфигураций. Функционально она идентична унарному минусу, однако читается хуже, поэтому в новых разработках предпочтительнее использовать -Число.

Сравнение способов

Унарный минус (-Число)

Основной и самый читаемый способ. Подходит для любого кода, запросов и выражений СКД.

Умножение на -1

Удобно, когда знак вычисляется динамически через переменную-коэффициент (1 или -1).

Вычитание из нуля (0 - Число)

Рабочий, но устаревший стиль. Использовать только при поддержке старого кода.

Как гарантированно получить отрицательное число

Унарный минус инвертирует знак, а не устанавливает его. Если исходное значение уже отрицательное, результат станет положительным. Когда требуется, чтобы число было отрицательным при любом исходном знаке, используется комбинация с модулем:

bsl
// Гарантированно отрицательное значение
Результат = -Макс(Число, -Число);

// Или через условие
Если Число > 0 Тогда
    Результат = -Число;
Иначе
    Результат = Число;
КонецЕсли;

Конструкция Макс(Число, -Число) всегда возвращает модуль числа: для положительного — само число, для отрицательного — его инверсию. Унарный минус перед всей конструкцией превращает модуль в гарантированно отрицательное значение. Этот приём часто применяется при формировании сторно-записей и корректировочных движений.

Аналогичная задача в языке запросов решается через ВЫБОР:

ВЫБОР

КОГДА Сумма > 0

ТОГДА -Сумма

ИНАЧЕ Сумма

КОНЕЦ КАК ОтрицательнаяСумма

Смена знака в запросах и СКД

В языке запросов 1С унарный минус ставится непосредственно перед полем:

ВЫБРАТЬ

-Остатки.СуммаОстаток КАК Сумма

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

Главная ловушка запросов — значения NULL. Если поле может содержать NULL (например, при левом соединении без совпадений), унарный минус вернёт NULL, а не число. Это приведёт к пустым значениям в отчёте или ошибкам при последующих вычислениях. Поэтому поле следует предварительно обработать:

ВЫБРАТЬ

-ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК Сумма

В СКД (системе компоновки данных) знак меняется либо в тексте запроса набора данных, либо в вычисляемом поле на закладке «Вычисляемые поля» — там выражение пишется на языке выражений СКД, где унарный минус также поддерживается. Для ресурсов отчёта предпочтительнее менять знак в запросе: тогда агрегирование и итоги будут корректными на всех уровнях группировок.

Работа с нечисловыми данными и типами

Унарный минус применим только к числам. Если переменная содержит строку, дату или Неопределено, выполнение кода прервётся с ошибкой «Операции сравнения/арифметики над значениями разных типов не поддерживаются». Перед сменой знака стоит убедиться в типе значения:

Если ТипЗнч(Значение) = Тип("Число") Тогда

Результат = -Значение;

Иначе

Результат = 0;

КонецЕсли;

Отдельный случай — числа, хранящиеся в строковом виде (например, загруженные из Excel или CSV). Их нужно сначала преобразовать через Число() или ОписаниеТипов, при этом строка должна содержать корректное числовое представление: точка или запятая как разделитель, отсутствие пробелов и посторонних символов. Попытка применить минус к строке "-150" не изменит значение — строка останется строкой.

В реквизитах объектов с составным типом (число и строка одновременно) проверка типа обязательна. Также учитывайте, что у реквизита может быть снят флаг неотрицательности в свойствах — если у числового реквизита установлено «Неотрицательное», записать в него отрицательное значение не получится: платформа выдаст ошибку при записи объекта.

Типичные ошибки
01
Применение минуса к строке или NULL — ошибка выполнения или пустой результат вместо числа.
02
Двойная инверсия: знак меняется и в запросе, и в коде обработки — итог получается с исходным знаком.
03
Попытка записать отрицательное значение в реквизит со свойством «Неотрицательное» — ошибка при записи объекта.
04
Инверсия знака вместо гарантированного минуса: уже отрицательное число становится положительным и искажает сторно.
05
Игнорирование NULL в запросах с соединениями — в отчёте появляются пустые ячейки вместо нулей.

Практические сценарии применения

Наиболее частая задача — формирование сторнирующих движений. При отмене документа или исправлении ошибочной операции в регистр записываются те же суммы с противоположным знаком:

Для Каждого СтрокаДвижения Из ИсходныеДвижения Цикл

НовоеДвижение = Движения.РегистрНакопления.Добавить();

ЗаполнитьЗначенияСвойств(НовоеДвижение, СтрокаДвижения);

НовоеДвижение.Количество = -СтрокаДвижения.Количество;

НовоеДвижение.Сумма = -СтрокаДвижения.Сумма;

КонецЦикла;

Второй сценарий — отчёты, где расход показывается отрицательным, а приход положительным. Знак формируется в запросе через ВЫБОР по виду движения. Третий сценарий — обработка возвратов от покупателей: суммы возвратного документа выводятся в минусе, чтобы корректно сворачиваться с продажами в итогах.

Порядок действий
  1. 1
    Определите, где нужно сменить знак: в коде модуля, в запросе или в вычисляемом поле отчёта.
  2. 2
    Проверьте тип значения — оно должно быть числом, строки преобразуйте через Число().
  3. 3
    В запросе обработайте возможный NULL функцией ЕСТЬNULL.
  4. 4
    Примените унарный минус; если нужен гарантированный минус — используйте -Макс(Число, -Число).
  5. 5
    Проверьте результат в отладчике или выводом в сообщение, сравните с ожидаемым значением.

Проверка результата

После изменения знака убедитесь, что результат соответствует ожиданиям. Быстрый способ — вывод значения через Сообщить или точка останова в конфигураторе с просмотром переменной в табло. Проверяйте три вещи: знак результата, его тип (должен остаться числом) и абсолютное значение (должно совпадать с исходным по модулю).

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

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

Знак результата
Норма

Положительное исходное число стало отрицательным

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

Знак не изменился или изменился дважды

Тип значения
Норма

ТипЗнч возвращает «Число»

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

Строка или NULL — значит, преобразование не выполнено

Итоги отчёта
Норма

Суммы сходятся с контрольными данными по модулю

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

Итоги удвоились или обнулились — знак применён не на всех строках

Итог

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

Для смены знака в 1С используйте унарный минус перед числом или полем. Для гарантированно отрицательного значения применяйте -Макс(Число, -Число). В запросах обязательно обрабатывайте NULL, а перед операцией проверяйте, что значение является числом.

Частые вопросы

Как сделать отрицательным только положительное число, а отрицательное оставить как есть?

Используйте конструкцию -Макс(Число, -Число) — она берёт модуль и ставит минус перед ним. Альтернатива — условие: если число больше нуля, применить унарный минус, иначе оставить без изменений.

Почему в запросе после минуса поле стало пустым?

Поле содержит NULL — это типично при левых соединениях без совпадений. Арифметические операции с NULL возвращают NULL. Обёртка -ЕСТЬNULL(Поле, 0) решает проблему: вместо NULL подставится ноль.

Можно ли записать отрицательное число в реквизит документа?

Да, если у числового реквизита в конфигураторе не установлено свойство «Неотрицательное». Если оно включено, платформа откажется записывать объект с минусом. Снимите флаг в свойствах реквизита или пересмотрите логику хранения данных.

Чем отличается -Число от Число * (-1)?

Результат идентичен. Унарный минус короче и читается лучше, а умножение на коэффициент удобно, когда знак (1 или -1) вычисляется динамически и хранится в переменной — например, зависит от вида операции документа.

Как поменять знак у всех чисел в таблице значений?

Пройдите циклом по строкам таблицы и присвойте каждой ячейке инвертированное значение: Строка.Сумма = -Строка.Сумма;. Предварительно убедитесь, что колонка имеет числовой тип, иначе получите ошибку на нечисловых значениях.

Работает ли унарный минус в формулах произвольных выражений на форме?

Да, в выражениях элементов формы, форматных строках с вычислениями и вычисляемых полях СКД унарный минус поддерживается. Ограничение то же — операнд должен быть числом, иначе выражение вернёт ошибку.