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

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

Как возводить в степень в 1С

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

Во встроенном языке 1С нет привычного оператора «^» или «**» для возведения в степень — попытка написать 2^10 вызовет синтаксическую ошибку ещё на этапе проверки модуля. Вместо этого используется встроенная функция Pow(Основание, Показатель), доступная и на сервере, и на клиенте, в том числе в тонком и веб-клиенте.

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

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

Синтаксис функции Pow и базовые примеры

Общая форма вызова: Результат = Pow(Основание, Показатель);. Функция глобальная, её можно вызывать в любом модуле без подключения общих модулей. В английском синтаксисе имя то же — Pow, в русском варианте синтакс-помощник также показывает её как Pow.

Простейшие примеры:

Результат = Pow(2, 10);  // 1024

Результат = Pow(5, 3); // 125

Результат = Pow(10, 0); // 1 — любое число в нулевой степени

Результат = Pow(7, 1); // 7 — любое число в первой степени

В качестве аргументов можно передавать переменные, реквизиты объектов и результаты других выражений. Например, при расчёте сложных процентов: СуммаИтог = Сумма * Pow(1 + Ставка / 100, СрокМесяцев);.

bsl
Результат = Pow(Основание, Показатель);
Сообщить(Pow(2, 10)); // 1024
Сообщить(Pow(1.05, 12)); // примерно 1.79585632602213

Дробные и отрицательные показатели

Отрицательный показатель даёт обратную величину: Pow(2, -3) вернёт 0,125, то есть 1/8. Это удобно, когда нужно избежать явного деления в сложной формуле.

Дробный показатель соответствует извлечению корня: Pow(Число, 1/2) — квадратный корень, Pow(Число, 1/3) — кубический. Обратите внимание на порядок вычисления: сначала выполняется деление 1/2, и только потом результат передаётся в функцию. Запись Pow(Число, 0.5) эквивалентна.

Ограничение: извлечение чётного корня из отрицательного числа (например, Pow(-4, 0.5)) математически не определено в действительных числах. В зависимости от платформы такой вызов может вернуть ошибку или нечисловой результат, поэтому перед вычислением стоит проверять знак основания.

Возведение в целую степень через цикл

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

Функция СтепеньЦелая(Основание, Показатель)

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

Для Сч = 1 По Показатель Цикл

Результат = Результат * Основание;

КонецЦикла;

Возврат Результат;

КонецФункции

Функция Pow внутри использует логарифмы, поэтому Pow(2, 10) теоретически может дать значение вида 1024,0000000001 в промежуточных представлениях. На практике платформа округляет вывод, но при строгих сравнениях Если Pow(a, b) = ОжидаемоеЗначение безопаснее использовать цикл или сравнивать с допуском.

Pow или цикл умножения

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

Универсально: дробные и отрицательные показатели, короткая запись. Возможны погрешности плавающей арифметики.

Цикл умножения

Точный результат для целых неотрицательных показателей. Не работает с дробными и отрицательными степенями, дольше при больших показателях.

Округление результата для денежных и количественных расчётов

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

Правильный приём — явное округление функцией Окр() до разрядности реквизита: Сумма = Окр(Сумма * Pow(1 + Ставка, Периоды), 2);. Если нужен конкретный режим округления (вверх, вниз, банковское), используйте соответствующие параметры или собственную логику.

Также проверяйте квалификатор числа реквизита в конфигураторе: если у реквизита задано, например, 2 знака после запятой, а формула даёт 10 знаков, расхождения между «посчитано в коде» и «записано в базу» неизбежны без Окр().

Типичные ошибки при возведении в степень

Самая частая ошибка — попытка использовать оператор ^ или ** по привычке из других языков. Компилятор 1С выдаст синтаксическую ошибку, и модуль не сохранится.

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

Третья типичная ситуация — деление на ноль внутри показателя или нулевое основание с отрицательным показателем: Pow(0, -1) математически означает деление на ноль. Перед вычислением проверяйте граничные значения.

Типичные ошибки
01
Использование оператора ^ или ** — в 1С их нет, модуль не пройдёт проверку синтаксиса
02
Передача строки вместо числа — ошибка преобразования типа; используйте Число() после проверки содержимого
03
Pow(0, -1) или отрицательное основание с дробным показателем — математически не определено, нужна предварительная проверка
04
Запись результата Pow в реквизит без Окр() — копеечные расхождения между расчётом и данными базы
05
Строгое сравнение результата Pow с ожидаемым числом — из-за погрешностей плавающей арифметики сравнивайте с допуском

Как проверить правильность вычислений

Быстрый способ проверить функцию — выполнить код в консоли кода (внешняя обработка «Консоль кода» или аналогичный инструмент) и сравнить с эталоном: Pow(2, 10) обязано дать 1024, Pow(9, 0.5) — ровно 3.

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

При строгих сравнениях в коде используйте допуск вместо точного равенства: Если Abs(Результат - Ожидаемое) < 0.000001 Тогда... Это стандартная практика для любых вычислений с плавающей точкой, не только в 1С.

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

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

Pow(2, 10) в консоли кода
Норма

Результат 1024

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

Ошибка или иное значение — проверьте синтаксис вызова

Сумма после расчёта и записи в документ
Норма

Совпадает с расчётом на калькуляторе после округления

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

Копеечные расхождения — добавьте Окр() перед записью

Граничные значения (ноль, отрицательные числа)
Норма

Код содержит проверки перед вызовом Pow

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

Ошибка времени выполнения на нестандартных данных

Практические сценарии использования

Сложные проценты и индексация

Классическая задача — начисление процентов на остаток: ИтоговаяСумма = НачальнаяСумма * Pow(1 + Ставка / 100, КоличествоПериодов);. Аналогично считается индексация цен или задолженности за несколько периодов.

Извлечение корней

Квадратный корень: Корень = Pow(Значение, 0.5);. Корень произвольной степени: Pow(Значение, 1 / Степень). Для квадратного корня также существует отдельная функция Sqrt(), которая читается нагляднее.

Шкалирование и нормировка

В аналитических расчётах степень применяется для нелинейных шкал: например, штрафной коэффициент, растущий квадратично от просрочки, — Коэффициент = Pow(1 + ДнейПросрочки / 100, 2);. Такие формулы обязательно документируйте комментариями, чтобы при доработке было понятно экономическое обоснование.

Итог

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

В 1С степень вычисляется функцией Pow(Основание, Показатель); операторов ^ и ** нет. Для целых показателей подходит цикл умножения с точным результатом. Перед записью в реквизиты округляйте результат через Окр(), а перед вызовом проверяйте граничные значения — ноль с отрицательным показателем и отрицательное основание с дробным.

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

Можно ли использовать оператор ^ для возведения в степень в 1С?

Нет. Во встроенном языке 1С операторы ^ и ** отсутствуют, их использование вызовет синтаксическую ошибку при проверке модуля. Единственный штатный способ — функция Pow(Основание, Показатель) или цикл умножения для целых показателей.

Как извлечь квадратный корень в 1С?

Два способа: функция Sqrt(Значение) или Pow(Значение, 0.5). Оба дают одинаковый результат. Sqrt читается нагляднее, Pow универсальнее — позволяет извлекать корни любой степени через показатель 1/N.

Почему Pow(2, 10) в сравнении иногда не равен 1024?

Pow использует вычисления с плавающей точкой, поэтому внутреннее представление результата может незначительно отличаться от точного целого. Для сравнений используйте допуск вида Abs(Результат - 1024) < 0.000001 или вычисляйте целые степени циклом умножения.

Что вернёт Pow(0, 0) и Pow(0, -1)?

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

Как возвести в степень число из строки, полученной от пользователя?

Сначала преобразуйте строку функцией Число(), предварительно убедившись, что строка содержит корректное числовое значение (без букв и лишних символов). Затем передайте результат в Pow. Прямая передача строки вызовет ошибку преобразования типа.

Работает ли Pow в тонком и веб-клиенте?

Да, Pow — глобальная функция встроенного языка и доступна в любом контексте выполнения: на сервере, в толстом, тонком и веб-клиенте. Директивы компиляции (&НаСервере, &НаКлиенте) на её доступность не влияют.