Как возвести число в степень во встроенном языке 1С
Содержание
Во встроенном языке 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¹ | 2 | 2⁶ | 64 |
| 2² | 4 | 2⁷ | 128 |
| 2³ | 8 | 2⁸ | 256 |
| 2⁴ | 16 | 2⁹ | 512 |
| 2⁵ | 32 | 2¹⁰ | 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.
Возведение в степень в языке запросов
Главное, что нужно знать: в языке запросов 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 — не бесплатная операция. Внутри она использует экспоненту и логарифм, поэтому заметно медленнее обычного умножения. На единичном вызове это незаметно, но в цикле на десятки и сотни тысяч итераций разница накапливается.
Что помогает ускорить массовые расчёты:
- Для квадрата и куба пишите умножение, а не
Pow.Число * Числоработает кратно быстрее, чемPow(Число, 2), и не теряет точность. - Выносите неизменяемые вычисления за цикл. Если основание или показатель в цикле не меняются, посчитайте степень один раз до начала цикла и используйте готовое значение.
- Считайте простые величины в запросе. Квадрат поля (
Поле * Поле) быстрее получить на стороне СУБД внутри запроса, чем перебирать результат построчно в коде. - Не вызывайте
Powради умножения на себя. Это самая частая лишняя нагрузка в отчётах с большими выборками. - Кэшируйте степени известного набора. Если в расчёте нужны одни и те же степени (например, коэффициенты по годам), посчитайте их один раз в соответствие
Год → Коэффициенти берите готовые значения.
Сравнение подходов для целых степеней:
| Задача | Быстро | Медленно |
|---|---|---|
| Квадрат | Х * Х | Pow(Х, 2) |
| Куб | Х * Х * Х | Pow(Х, 3) |
| Дробная степень, корень | Pow(Х, 0.5) / Sqrt(Х) | аналога нет |
Вывод простой: Pow незаменим для дробных и переменных показателей, но для фиксированных целых степеней почти всегда выигрывает обычное умножение.
Как показать степень надстрочным знаком в форме
Иногда «сделать степень» означает не вычислить её, а красиво вывести: написать м², м³ или степень в печатной форме и отчёте. Отдельной кнопки «надстрочный знак» в ячейке табличного документа 1С нет, поэтому степень подставляют готовым символом.
Для двойки и тройки есть прямые символы Юникода — ² и ³. Их можно просто вставить в строку или собрать функцией Символ:
Единица = "м" + Символ(178); // м² (178 — код символа ²)
Объём = "м" + Символ(179); // м³ (179 — код символа ³)
Для остальных цифр подойдут надстрочные символы из диапазона Юникода: ⁰ — код 8304, ⁴ — 8308, ⁵ — 8309 и далее подряд до ⁹ — 8313. Единица, двойка и тройка стоят особняком: их коды — 185, 178 и 179.
Если степень нужна в формуле на макете печатной формы, соберите строку с нужным надстрочным символом заранее в коде и передайте её в параметр макета. Так надпись S = a² отобразится корректно и в предпросмотре, и при печати.
Частые вопросы
Есть ли в 1С оператор `^` или `**` для степени?
Pow(Основание, Показатель).Почему `Pow(27, 1/3)` возвращает не 3, а 2,9999…?
Окр, если нужно целое число.Можно ли возвести в степень прямо в запросе?
Поле * Поле), а дробные степени считают в коде по результату запроса.Как быстрее всего возвести число в квадрат?
Число * Число. Это быстрее Pow(Число, 2) и не даёт дробной погрешности. Pow оставляйте для дробных и переменных показателей.