Как возвести число в степень во встроенном языке 1С

· 9 мин

Содержание

Во встроенном языке 1С нет оператора ** и нет значка ^ — возведение в степень делает глобальная функция Pow(Основание, Показатель). Например, Pow(2, 10) вернёт 1024, а Pow(10, 3) — 1000. Квадратный корень считает отдельная функция Sqrt().

Если вы искали оператор степени по аналогии с Python или Excel, его в языке 1С просто не предусмотрено. Всё, что относится к степеням, корням и дробным показателям, закрывает пара функций Pow и Sqrt из математического набора глобального контекста.

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

Почему оператора степени в 1С нет, а функция есть

Арифметические операторы языка 1С — это +, -, *, / и % (остаток от деления). Возведения в степень среди них нет. Поэтому запись вида 2 ** 10 или 2 ^ 10 вызовет синтаксическую ошибку при проверке модуля.

Вместо оператора работает функция Pow — она доступна и на клиенте, и на сервере, во всех вариантах платформы 8.3. Писать её имя нужно латиницей, русского синонима вроде Степень() у неё нет.

Чаще всего в ловушку попадают те, кто пришёл из Excel или других языков. В Excel степень — это ^, в Python — **, а в SQL бывает POWER(). В 1С ни один из этих вариантов не сработает. Заодно не путайте оператор %: в 1С это остаток от деления, а не процент.

Рядом с Pow в глобальном контексте лежат Sqrt (корень), Log (натуральный логарифм), Log10, Exp и тригонометрические функции. Это весь штатный математический арсенал — для сложных формул комбинируют именно их.

Синтаксис функции Pow и таблица степеней

Функция принимает два аргумента: основание и показатель степени.

Результат = Pow(Основание, Показатель);

Оба аргумента — числа. Показатель может быть целым, дробным, нулевым или отрицательным. Результат всегда число. Если передать в Pow строку или неопределённое значение, платформа выдаст ошибку приведения типа, поэтому аргументы, пришедшие из реквизитов или полей ввода, лучше заранее проверять на пустоту и тип.

Несколько рабочих примеров:

Сообщить(Pow(2, 10));   // 1024
Сообщить(Pow(10, 3));   // 1000
Сообщить(Pow(5, 2));    // 25
Сообщить(Pow(7, 0));    // 1 — любое число в нулевой степени даёт единицу
Сообщить(Pow(2, 1));    // 2

Для часто используемых степеней двойки удобно держать перед глазами таблицу — она помогает быстро прикинуть результат и проверить код:

СтепеньPow(2, n)СтепеньPow(2, n)
2¹22⁶64
2²42⁷128
2³82⁸256
2⁴162⁹512
2⁵322¹⁰1024

Квадрат и куб — самые частые случаи. Их пишут так:

Квадрат = Pow(Число, 2);
Куб     = Pow(Число, 3);

Но для целых степеней 2 и 3 чаще обходятся обычным умножением — об этом в разделе про производительность.

Дробные показатели: корни через Pow и Sqrt

Дробный показатель — это извлечение корня. Квадратный корень из числа равен возведению в степень 0,5, кубический — в степень 1/3, корень четвёртой степени — 0,25 и так далее.

Сообщить(Pow(144, 0.5));   // 12 — то же, что Sqrt(144)
Сообщить(Pow(27, 1/3));    // 3 — кубический корень
Сообщить(Pow(16, 0.25));   // 2 — корень четвёртой степени

Для квадратного корня есть отдельная функция Sqrt, она короче и понятнее:

Сообщить(Sqrt(144));   // 12
Сообщить(Sqrt(2));     // ≈ 1,4142135623731

Здесь важная тонкость. Pow с дробным показателем считается через логарифм и экспоненту, поэтому для «ровных» корней результат иногда приходит с хвостом: Pow(27, 1/3) может вернуть не 3, а 2,9999999999999.

Если результат корня должен быть целым или с фиксированной точностью, обязательно округляйте его функцией Окр. Иначе дальнейшие сравнения «на равенство» будут давать ложный результат.

Корень = Окр(Pow(27, 1/3), 0);   // 3 — округлили до целого

Отрицательные основание и показатель

С отрицательным показателем проблем нет — это дробь. Pow(2, -1) даёт 0,5, Pow(2, -2) — 0,25. То есть отрицательная степень возвращает число, обратное положительной степени.

Сообщить(Pow(2, -1));   // 0,5
Сообщить(Pow(10, -2));  // 0,01

А вот отрицательное основание — зона риска. Поскольку Pow вычисляется через логарифм, а логарифм отрицательного числа не определён, возведение отрицательного числа в дробную степень вернёт ошибку или некорректный результат.

Не передавайте в Pow отрицательное основание с дробным показателем — результат непредсказуем. Если нужно возвести отрицательное число в целую степень, безопаснее сделать это умножением в цикле или обработать знак вручную:

// Возведение в целую степень, корректное для отрицательных чисел
Функция ЦелаяСтепень(Основание, Показатель)
    Результат = 1;
    Для Сч = 1 По Показатель Цикл
        Результат = Результат * Основание;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Такой вариант без логарифма даёт точный ответ: ЦелаяСтепень(-2, 3) вернёт -8, а ЦелаяСтепень(-3, 2) — 9. Для положительных оснований он тоже работает корректно, так что одной функцией можно закрыть все целые степени и не держать в голове ограничения Pow.

Проверьте себя
Чему равно `Pow(5, 3)`?
Как получить кубический корень из 64?
Что вернёт возведение в степень в языке запросов 1С?

Возведение в степень в языке запросов

Главное, что нужно знать: в языке запросов 1С нет функции возведения в степень. Ни Pow, ни POWER, ни оператора ^ в запросе не существует — доступны только +, -, *, /.

Отсюда следуют простые правила:

  • 🔹 Квадрат поля считается умножением его на себя: Сумма * Сумма.
  • 🔹 Куб — Сумма * Сумма * Сумма.
  • 🔹 Произвольная степень в запросе не считается — её вычисляют уже в коде по результату запроса.

Пример для квадрата отклонения прямо в запросе:

ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Сумма * Продажи.Сумма КАК СуммаВКвадрате
ИЗ
    РегистрНакопления.Продажи КАК Продажи

Оператор ВЫРАЗИТЬ здесь не поможет — он меняет тип значения, но не возводит в степень. Поэтому любую логику сложнее перемножения полей выносят из запроса.

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Степень = Pow(Выборка.Основание, Выборка.Показатель);
КонецЦикла;

Для чисто целых степеней (2, 3, 4) умножение в запросе работает и быстрее, и точнее, чем любой обходной трюк через логарифмы.

Практические расчёты: сложные проценты и формулы

В учётных задачах степень чаще всего нужна для формул со сложным процентом: проценты, которые начисляются на тело вместе с ранее накопленными процентами. Базовая формула — начальная сумма, умноженная на (1 + ставка) в степени числа периодов.

Пример: вклад или заём 100 000 ₽ под 8% годовых на 5 лет со сложным процентом.

Начальная = 100000;
Ставка    = 0.08;      // 8% в долях
Периодов  = 5;

Итог = Начальная * Pow(1 + Ставка, Периодов);
Сообщить(Формат(Окр(Итог, 2), "ЧДЦ=2; ЧРД=,"));   // 146 932,81

Проверка арифметики: 1,08⁵ = 1,4693280768, умноженное на 100 000 — это 146 932,81 ₽. За пять лет сумма выросла почти на 47%.

Обратная задача — дисконтирование, то есть приведение будущей суммы к сегодняшней стоимости. Здесь показатель уходит в знаменатель, что равнозначно отрицательной степени:

Будущая = 146932.81;
Ставка  = 0.08;
Периодов = 5;

Сегодня = Будущая * Pow(1 + Ставка, -Периодов);
Сообщить(Формат(Окр(Сегодня, 2), "ЧДЦ=2; ЧРД=,"));   // 100 000,00

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

Деньги храните и выводите с округлением до копеек через Окр(Значение, 2). Промежуточный результат Pow почти всегда приходит с длинным дробным хвостом, и без округления в отчёт попадут лишние знаки.

Производительность при массовых вычислениях

Pow — не бесплатная операция. Внутри она использует экспоненту и логарифм, поэтому заметно медленнее обычного умножения. На единичном вызове это незаметно, но в цикле на десятки и сотни тысяч итераций разница накапливается.

Что помогает ускорить массовые расчёты:

  1. Для квадрата и куба пишите умножение, а не Pow. Число * Число работает кратно быстрее, чем Pow(Число, 2), и не теряет точность.
  2. Выносите неизменяемые вычисления за цикл. Если основание или показатель в цикле не меняются, посчитайте степень один раз до начала цикла и используйте готовое значение.
  3. Считайте простые величины в запросе. Квадрат поля (Поле * Поле) быстрее получить на стороне СУБД внутри запроса, чем перебирать результат построчно в коде.
  4. Не вызывайте Pow ради умножения на себя. Это самая частая лишняя нагрузка в отчётах с большими выборками.
  5. Кэшируйте степени известного набора. Если в расчёте нужны одни и те же степени (например, коэффициенты по годам), посчитайте их один раз в соответствие Год → Коэффициент и берите готовые значения.

Сравнение подходов для целых степеней:

ЗадачаБыстроМедленно
КвадратХ * ХPow(Х, 2)
КубХ * Х * ХPow(Х, 3)
Дробная степень, кореньPow(Х, 0.5) / Sqrt(Х)аналога нет

Вывод простой: Pow незаменим для дробных и переменных показателей, но для фиксированных целых степеней почти всегда выигрывает обычное умножение.

Как показать степень надстрочным знаком в форме

Иногда «сделать степень» означает не вычислить её, а красиво вывести: написать м², м³ или степень в печатной форме и отчёте. Отдельной кнопки «надстрочный знак» в ячейке табличного документа 1С нет, поэтому степень подставляют готовым символом.

Для двойки и тройки есть прямые символы Юникода — ² и ³. Их можно просто вставить в строку или собрать функцией Символ:

Единица = "м" + Символ(178);   // м²  (178 — код символа ²)
Объём   = "м" + Символ(179);   // м³  (179 — код символа ³)

Для остальных цифр подойдут надстрочные символы из диапазона Юникода: ⁰ — код 8304, ⁴ — 8308, ⁵ — 8309 и далее подряд до ⁹ — 8313. Единица, двойка и тройка стоят особняком: их коды — 185, 178 и 179.

Если степень нужна в формуле на макете печатной формы, соберите строку с нужным надстрочным символом заранее в коде и передайте её в параметр макета. Так надпись S = a² отобразится корректно и в предпросмотре, и при печати.

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

Есть ли в 1С оператор `^` или `**` для степени?
Нет. В языке 1С таких операторов не существует, их использование даёт синтаксическую ошибку. Возведение в степень делает только функция Pow(Основание, Показатель).
Почему `Pow(27, 1/3)` возвращает не 3, а 2,9999…?
Дробная степень считается через логарифм, поэтому для «ровных» корней появляется погрешность в последних знаках. Округлите результат функцией Окр, если нужно целое число.
Можно ли возвести в степень прямо в запросе?
Нет, функции степени в языке запросов нет. Квадрат и куб получают умножением поля на себя (Поле * Поле), а дробные степени считают в коде по результату запроса.
Как быстрее всего возвести число в квадрат?
Умножением Число * Число. Это быстрее Pow(Число, 2) и не даёт дробной погрешности. Pow оставляйте для дробных и переменных показателей.
Работает ли `Pow` на тонком клиенте и в старых релизах 8.3?
Да. Это функция глобального контекста, она доступна и на клиенте, и на сервере во всех версиях платформы 8.3 без дополнительных подключений.