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

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

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

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

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

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

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

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

Функция вызывается глобально, без обращения к какому-либо объекту. Первый параметр — основание степени, второй — показатель. Оба параметра приводятся к числу, поэтому передавать строку «2» технически возможно, но полагаться на неявное приведение не стоит: лучше заранее преобразовать значение через Число().

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

Квадрат = Pow(Сумма, 2); // квадрат числа

Куб = Pow(Сторона, 3); // объём куба

Степень = Pow(Основание, 0.5); // квадратный корень

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

bsl
Функция СложныйПроцент(Сумма, Ставка, Периодов)
	Возврат Сумма * Pow(1 + Ставка / 100, Периодов);
КонецФункции

Типичные сценарии использования

Финансовые расчёты

Самая частая прикладная задача — сложные проценты и дисконтирование. Формула наращения Сумма * Pow(1 + Ставка, Периоды) используется в расчётах кредитов, депозитов и приведения будущих платежей к текущей стоимости. Здесь критично следить за тем, чтобы ставка была выражена в долях (0,12), а не в процентах (12), иначе результат будет завышен на порядки.

Статистика и контроль качества

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

Геометрические и складские расчёты

Объём по линейным размерам, площадь круга через радиус, пересчёт упаковок — всё это степени 2 и 3. В таких задачах важна разрядность результата: если реквизит документа имеет точность 2 знака после запятой, а расчёт даёт 6 знаков, итог будет молча округлён при записи.

Возведение в степень в запросах

Язык запросов 1С не содержит функции Pow — прямо написать Pow(Поле, 2) в тексте запроса нельзя, запрос не скомпилируется. Это ограничение часто становится неожиданностью при построении отчётов.

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

// СКД: вычисляемое поле с выражением из общего модуля

// В общем модуле (сервер, вызов сервера):

Функция ВозвестиВСтепень(Значение, Показатель) Экспорт

Возврат Pow(Значение, Показатель);

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

В выражении вычисляемого поля СКД тогда пишут вызов вида ОбщийМодуль1.ВозвестиВСтепень(Поле, 2). Учтите, что функция будет вызываться для каждой строки результата — на больших выборках это заметно медленнее, чем расчёт во временной таблице.

Способы возведения в степень

Pow в коде

Универсально, любые показатели включая дробные и отрицательные. Не работает в тексте запроса.

Перемножение в запросе

Подходит для квадрата и куба прямо в запросе. Для высоких степеней громоздко.

Вычисляемые поля СКД

Гибко для отчётов, но требует общего модуля и медленнее на больших данных.

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

Контроль над точностью и целыми показателями, но больше кода и легко ошибиться в границах цикла.

Отрицательные и дробные показатели: ограничения

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

Ещё одна граница — переполнение. Возведение большого числа в большую степень быстро выходит за допустимую разрядность (по умолчанию числа в 1С ограничены 38 знаками). Если результат не помещается, при записи в реквизит или дальнейших операциях возникнет ошибка точности. Для больших показателей заранее оценивайте порядок результата.

Альтернатива: цикл и собственная функция

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

Быстрее всего проверить вычисление — в конфигураторе через отладку: поставьте точку останова, вызовите окно «Вычислить выражение» (Shift+F9) и выполните Pow(2, 10) прямо в нём. Это удобный способ подобрать параметры формулы до написания кода.

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

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

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

Pow(ЛюбоеЧисло, 0)
Норма

Возвращает 1

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

Ошибка или иной результат — проверьте передачу параметров

Pow(Основание, 1)
Норма

Равно основанию

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

Результат отличается — вероятно, перепутан порядок аргументов

Финансовая формула на тестовых данных
Норма

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

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

Расхождение в разы — ставка задана в процентах, а не долях

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

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

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

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

Отдельной функции корня нет. Используйте Pow(Число, 0.5). Для кубического корня — Pow(Число, 1/3). Перед вызовом убедитесь, что число неотрицательное, иначе получите ошибку выполнения.

Почему Pow не работает в запросе?

Язык запросов 1С имеет собственный ограниченный набор функций, и Pow в него не входит. Возведите значение в степень в коде и передайте параметром, перемножьте поле само на себя для квадрата или используйте вычисляемые поля СКД с функцией из общего модуля.

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

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

Как округлить результат возведения в степень?

Используйте функцию Окр(Значение, Разрядность), например Окр(Pow(1.05, 12), 2) для округления до копеек. При записи в реквизит с фиксированной точностью платформа округлит автоматически, но явное округление делает поведение предсказуемым в промежуточных расчётах.

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

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

Итог

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

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