Разработка и Конфигурация · 10 мин
Как сделать число отрицательным в 1С
Как сделать число отрицательным в 1С: унарный минус, умножение на -1, функция Макс, работа с запросами и формулами. Примеры кода, ошибки и проверка результата.
Смена знака числа — одна из базовых операций при разработке и настройке 1С. Она нужна при формировании сторнирующих проводок, расчёте возвратов, отражении отрицательных остатков, корректировке сумм в отчётах и обработке данных из внешних источников. Встроенный язык 1С даёт несколько способов получить отрицательное значение, и выбор зависит от контекста: код модуля, запрос, формула в отчёте или выражение в СКД.
Самый простой и правильный способ — унарный минус перед переменной или выражением. Однако на практике встречаются нюансы: нечисловые типы данных, значения NULL в запросах, необходимость инвертировать знак только при определённом условии. Ниже разобраны все рабочие варианты с примерами кода, типичными ошибками и способами проверки результата.
Унарный минус — основной способ
Унарный минус — это стандартный оператор встроенного языка 1С, который меняет знак числа на противоположный. Он ставится непосредственно перед числом, переменной или выражением в скобках:
Число = 150;
Отрицательное = -Число; // -150
Сумма = -(100 + 50); // -150
ДвойнойМинус = -(-Число); // 150Оператор работает с любыми числовыми значениями: целыми, дробными, положительными и уже отрицательными. Если применить унарный минус к отрицательному числу, результат станет положительным — это стоит учитывать, когда нужно именно «загнать число в минус» независимо от исходного знака.
Унарный минус имеет высокий приоритет, но при работе со сложными выражениями рекомендуется явно ставить скобки. Запись -Число 2 и -(Число 2) даст одинаковый результат, однако скобки делают намерение очевидным и защищают от ошибок при последующей доработке кода.
Альтернативные способы изменить знак
Помимо унарного минуса, существует несколько эквивалентных приёмов. Они дают тот же результат, но могут быть удобнее в отдельных ситуациях — например, когда знак вычисляется динамически.
Умножение на -1
Классический приём, понятный любому разработчику:
Результат = Число * (-1);
Этот способ удобен, когда коэффициент знака хранится в переменной. Например, документ возврата может содержать признак направления, и сумма умножается на 1 или -1 в зависимости от вида операции. Это делает код гибче, чем жёстко зашитый минус.
Вычитание из нуля
Менее распространённый, но рабочий вариант:
Результат = 0 - Число;
Такая запись иногда встречается в старом коде конфигураций. Функционально она идентична унарному минусу, однако читается хуже, поэтому в новых разработках предпочтительнее использовать -Число.
Сравнение способов
Основной и самый читаемый способ. Подходит для любого кода, запросов и выражений СКД.
Удобно, когда знак вычисляется динамически через переменную-коэффициент (1 или -1).
Рабочий, но устаревший стиль. Использовать только при поддержке старого кода.
Как гарантированно получить отрицательное число
Унарный минус инвертирует знак, а не устанавливает его. Если исходное значение уже отрицательное, результат станет положительным. Когда требуется, чтобы число было отрицательным при любом исходном знаке, используется комбинация с модулем:
// Гарантированно отрицательное значение
Результат = -Макс(Число, -Число);
// Или через условие
Если Число > 0 Тогда
Результат = -Число;
Иначе
Результат = Число;
КонецЕсли;Конструкция Макс(Число, -Число) всегда возвращает модуль числа: для положительного — само число, для отрицательного — его инверсию. Унарный минус перед всей конструкцией превращает модуль в гарантированно отрицательное значение. Этот приём часто применяется при формировании сторно-записей и корректировочных движений.
Аналогичная задача в языке запросов решается через ВЫБОР:
ВЫБОР
КОГДА Сумма > 0
ТОГДА -Сумма
ИНАЧЕ Сумма
КОНЕЦ КАК ОтрицательнаяСумма
Смена знака в запросах и СКД
В языке запросов 1С унарный минус ставится непосредственно перед полем:
ВЫБРАТЬ
-Остатки.СуммаОстаток КАК Сумма
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
Главная ловушка запросов — значения NULL. Если поле может содержать NULL (например, при левом соединении без совпадений), унарный минус вернёт NULL, а не число. Это приведёт к пустым значениям в отчёте или ошибкам при последующих вычислениях. Поэтому поле следует предварительно обработать:
ВЫБРАТЬ
-ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК Сумма
В СКД (системе компоновки данных) знак меняется либо в тексте запроса набора данных, либо в вычисляемом поле на закладке «Вычисляемые поля» — там выражение пишется на языке выражений СКД, где унарный минус также поддерживается. Для ресурсов отчёта предпочтительнее менять знак в запросе: тогда агрегирование и итоги будут корректными на всех уровнях группировок.
Работа с нечисловыми данными и типами
Унарный минус применим только к числам. Если переменная содержит строку, дату или Неопределено, выполнение кода прервётся с ошибкой «Операции сравнения/арифметики над значениями разных типов не поддерживаются». Перед сменой знака стоит убедиться в типе значения:
Если ТипЗнч(Значение) = Тип("Число") Тогда
Результат = -Значение;
Иначе
Результат = 0;
КонецЕсли;
Отдельный случай — числа, хранящиеся в строковом виде (например, загруженные из Excel или CSV). Их нужно сначала преобразовать через Число() или ОписаниеТипов, при этом строка должна содержать корректное числовое представление: точка или запятая как разделитель, отсутствие пробелов и посторонних символов. Попытка применить минус к строке "-150" не изменит значение — строка останется строкой.
В реквизитах объектов с составным типом (число и строка одновременно) проверка типа обязательна. Также учитывайте, что у реквизита может быть снят флаг неотрицательности в свойствах — если у числового реквизита установлено «Неотрицательное», записать в него отрицательное значение не получится: платформа выдаст ошибку при записи объекта.
Практические сценарии применения
Наиболее частая задача — формирование сторнирующих движений. При отмене документа или исправлении ошибочной операции в регистр записываются те же суммы с противоположным знаком:
Для Каждого СтрокаДвижения Из ИсходныеДвижения Цикл
НовоеДвижение = Движения.РегистрНакопления.Добавить();
ЗаполнитьЗначенияСвойств(НовоеДвижение, СтрокаДвижения);
НовоеДвижение.Количество = -СтрокаДвижения.Количество;
НовоеДвижение.Сумма = -СтрокаДвижения.Сумма;
КонецЦикла;
Второй сценарий — отчёты, где расход показывается отрицательным, а приход положительным. Знак формируется в запросе через ВЫБОР по виду движения. Третий сценарий — обработка возвратов от покупателей: суммы возвратного документа выводятся в минусе, чтобы корректно сворачиваться с продажами в итогах.
- 1Определите, где нужно сменить знак: в коде модуля, в запросе или в вычисляемом поле отчёта.
- 2Проверьте тип значения — оно должно быть числом, строки преобразуйте через Число().
- 3В запросе обработайте возможный NULL функцией ЕСТЬNULL.
- 4Примените унарный минус; если нужен гарантированный минус — используйте -Макс(Число, -Число).
- 5Проверьте результат в отладчике или выводом в сообщение, сравните с ожидаемым значением.
Проверка результата
После изменения знака убедитесь, что результат соответствует ожиданиям. Быстрый способ — вывод значения через Сообщить или точка останова в конфигураторе с просмотром переменной в табло. Проверяйте три вещи: знак результата, его тип (должен остаться числом) и абсолютное значение (должно совпадать с исходным по модулю).
Как проверить результат
Положительное исходное число стало отрицательным
Знак не изменился или изменился дважды
ТипЗнч возвращает «Число»
Строка или NULL — значит, преобразование не выполнено
Суммы сходятся с контрольными данными по модулю
Итоги удвоились или обнулились — знак применён не на всех строках
Что важно запомнить
Для смены знака в 1С используйте унарный минус перед числом или полем. Для гарантированно отрицательного значения применяйте -Макс(Число, -Число). В запросах обязательно обрабатывайте NULL, а перед операцией проверяйте, что значение является числом.
Частые вопросы
Как сделать отрицательным только положительное число, а отрицательное оставить как есть?
Используйте конструкцию -Макс(Число, -Число) — она берёт модуль и ставит минус перед ним. Альтернатива — условие: если число больше нуля, применить унарный минус, иначе оставить без изменений.
Почему в запросе после минуса поле стало пустым?
Поле содержит NULL — это типично при левых соединениях без совпадений. Арифметические операции с NULL возвращают NULL. Обёртка -ЕСТЬNULL(Поле, 0) решает проблему: вместо NULL подставится ноль.
Можно ли записать отрицательное число в реквизит документа?
Да, если у числового реквизита в конфигураторе не установлено свойство «Неотрицательное». Если оно включено, платформа откажется записывать объект с минусом. Снимите флаг в свойствах реквизита или пересмотрите логику хранения данных.
Чем отличается -Число от Число * (-1)?
Результат идентичен. Унарный минус короче и читается лучше, а умножение на коэффициент удобно, когда знак (1 или -1) вычисляется динамически и хранится в переменной — например, зависит от вида операции документа.
Как поменять знак у всех чисел в таблице значений?
Пройдите циклом по строкам таблицы и присвойте каждой ячейке инвертированное значение: Строка.Сумма = -Строка.Сумма;. Предварительно убедитесь, что колонка имеет числовой тип, иначе получите ошибку на нечисловых значениях.
Работает ли унарный минус в формулах произвольных выражений на форме?
Да, в выражениях элементов формы, форматных строках с вычислениями и вычисляемых полях СКД унарный минус поддерживается. Ограничение то же — операнд должен быть числом, иначе выражение вернёт ошибку.