Встроенный калькулятор 1С:Предприятия и вычисление выражений во встроенном языке

· 9 мин

Содержание

Встроенный калькулятор 1С:Предприятия 8.3 открывается сочетанием Ctrl+F2 или из главного меню, раздел Сервис. В числовых полях форм он появляется по кнопке выбора, и результат сразу попадает в поле. Это инструмент платформы, поэтому он одинаково работает в Бухгалтерии, ЗУП, УТ и любой другой конфигурации на 8.3.

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

Как устроен калькулятор 1С и где его открыть

У пользователя есть три способа добраться до калькулятора:

  • ⌨️ Ctrl+F2 — из любого места программы, открывает отдельное окно калькулятора;
  • 📂 главное меню (кнопка с тремя полосками в заголовке окна) → Сервис → Калькулятор;
  • 🔢 кнопка выбора в числовом поле формы — калькулятор открывается выпадающей панелью прямо под полем.

Отдельное окно — это «черновик»: считаете, копируете результат и вставляете куда нужно. Панель у поля удобнее: начальным значением калькулятора становится число из поля, а после = или Enter итог записывается обратно.

Работа с клавиатуры

Мышь калькулятору не нужна. Цифры, знаки +, -, *, / и точку можно набирать на цифровом блоке клавиатуры. Enter работает как «равно», Esc закрывает окно без переноса результата.

Буфер обмена тоже работает: Ctrl+C копирует текущее значение, Ctrl+V вставляет число, скопированное, например, из отчёта или из Excel. Это быстрый способ проверить итог в табличном документе: скопировали сумму, вставили, досчитали.

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

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

ОперацияЗнакПримерРезультат
Сложение+120 + 30150
Вычитание-120 - 3090
Умножение*120 * 3360
Деление/120 / 815
Остаток от деления%17 % 52
Унарный минус--(120 - 30)-90

Оператора возведения в степень нет. Для этого есть функция Pow(), о ней ниже.

Приоритет операций

Порядок такой же, как в школьной математике:

  1. Скобки.
  2. Унарный минус.
  3. Умножение, деление и остаток (*, /, %) — слева направо.
  4. Сложение и вычитание — слева направо.
  5. Сравнения (=, <>, <, >, <=, >=).
  6. Логические НЕ, затем И, затем ИЛИ.

Пример: 1000 - 200 / 4 * 2 — сначала 200 / 4 = 50, потом 50 * 2 = 100, затем 1000 - 100 = 900.

Сумма = 1000 - 200 / 4 * 2;       // 900
Сумма = (1000 - 200) / (4 * 2);   // 100
Остаток = 1000 % 7;                // 6, потому что 7 * 142 = 994

Тернарный оператор в формулах

Для условий внутри выражения есть ?(Условие, ЕслиИстина, ЕслиЛожь). Он удобен в формулах, где нужно ограничить сумму сверху или снизу.

Премия = ?(Выручка > 500000, Выручка * 0.05, 0);

При выручке 600 000 премия составит 30 000, при 400 000 — ноль.

Типы данных и их преобразование при расчётах

Арифметика 1С десятичная. Это главное отличие от многих языков программирования, где числа хранятся в двоичном виде. В 1С 0.1 + 0.2 = 0.3 даёт Истина, и копейки при сложении не «уплывают».

Деление может дать бесконечную дробь (10 / 3). Платформа хранит результат с большим, но конечным числом знаков, поэтому для денег результат деления округляют явно.

Как платформа приводит типы

Правило простое: тип результата определяет левый операнд.

ВыражениеРезультатПочему
10 + "5"15левый — число, строка приводится к числу
"10" + 5“105”левый — строка, идёт склейка
"Итого: " + 1500“Итого: 1 500”число превращается в строку с разделителем разрядов
ТекущаяДата() + 86400дата на сутки позжек дате прибавляются секунды
Дата2 - Дата1число секундразность двух дат

Третья строка — частая причина «кривых» текстов в печатных формах и выгрузках. Неявное преобразование ставит неразрывный пробел между разрядами. Для чисел в строках используйте Формат():

Текст = "Итого: " + Формат(1500, "ЧГ=0");              // "Итого: 1500"
Текст = "Сумма: " + Формат(1234.5, "ЧДЦ=2; ЧГ=0");     // "Сумма: 1234,50"

Явные преобразования

  • 🔢 Число("125.40") — строку в число. Если в строке не число, будет исключение.
  • 🔤 Строка(125.4) — число в строку по правилам форматирования по умолчанию.
  • 📅 Дата(2026, 3, 31) — дата из частей; НачалоМесяца(), КонецМесяца() — границы периода.
  • ✅ Булево(1) — Истина; ноль даёт Ложь.

Количество дней между датами получают делением разности на 86400: (КонецПериода - НачалоПериода) / 86400. Учтите время: если вторая дата — КонецДня(), результат будет дробным, его стоит обернуть в Цел() или Окр().

Калькулятор в полях формы и реквизитах

Что можно ввести в поле, определяет тип реквизита. У числового типа два квалификатора:

  • Длина — общее число цифр;
  • Точность — сколько из них после запятой.

Реквизит «Сумма» с длиной 15 и точностью 2 хранит до 13 цифр в целой части и копейки. Если результат калькулятора длиннее, лишние знаки после запятой поле не сохранит. Поэтому перенос 1000 / 3 в такое поле даст 333,33.

Ещё один квалификатор — Неотрицательное. Он запрещает ввод значений меньше нуля, и минус из калькулятора поле не примет.

Кнопка калькулятора на своей форме

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

Если нужно, чтобы поле пересчитывало связанные реквизиты, повесьте обработчик ПриИзменении. Он срабатывает и после ручного ввода, и после переноса значения из калькулятора:

&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
	Объект.Сумма = Объект.Количество * Объект.Цена;
КонецПроцедуры

Расчёт в ПриИзменении срабатывает только при интерактивном вводе. Если значения меняются программно или загрузкой, пересчитывайте сумму ещё и в модуле объекта, например в ПередЗаписью.

Математические функции встроенного языка

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

ФункцияЧто делаетПримерРезультат
Окр(Ч, Разр)округление до разрядовОкр(1234.565, 2)1234.57
Окр(Ч, -2)округление до сотенОкр(1234.5, -2)1200
Цел(Ч)целая часть, без округленияЦел(7.9)7
Макс(...), Мин(...)наибольшее и наименьшееМакс(3, 11, 7)11
Pow(Осн, Ст)степеньPow(1.1, 2)1.21
Sqrt(Ч)квадратный кореньSqrt(144)12
Exp(Ч), Log(Ч)экспонента, натуральный логарифмLog(Exp(2))2
Log10(Ч)десятичный логарифмLog10(1000)3
Sin, Cos, Tanтригонометрия, аргумент в радианахCos(0)1
ASin, ACos, ATanобратные функцииATan(1) * 4≈ 3.14159

Режим округления

У Окр() есть третий параметр — режим. По умолчанию действует РежимОкругленияЧисла.Окр15как20: пятёрка округляется вверх, Окр(2.5) даёт 3. Режим Окр15как10 округляет пятёрку вниз: Окр(2.5, 0, РежимОкругленияЧисла.Окр15как10) даёт 2.

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

Проценты и сложный процент

Процентов как отдельной операции в языке нет, их записывают дробью:

НДС = Окр(Сумма * 20 / 120, 2);          // выделить 20% из суммы с НДС
Наценка = Окр(Себестоимость * 1.35, 2);  // +35%
Наращенная = Окр(100000 * Pow(1 + 0.12 / 12, 12), 2); // 12% годовых, ежемесячная капитализация

Последняя строка даёт 112 682,50: множитель Pow(1.01, 12) ≈ 1,1268250.

Пользовательские формулы: Вычислить() и где формулы задают без кода

Функция Вычислить(Строка) считает выражение, записанное строкой, — это и есть «калькулятор» для программиста. В выражении доступны переменные той процедуры, где вызывается функция:

Оклад = 50000;
Отработано = 15;
НормаДней = 22;
Формула = "Окр(Оклад * Отработано / НормаДней, 2)";
Результат = Вычислить(Формула); // 34090.91

Проверка: 50 000 × 15 = 750 000; 750 000 / 22 = 34 090,909…, после округления 34 090,91.

Вычислить() принимает только выражение. Операторы вроде Если или циклов в нём не работают — для этого есть Выполнить(), которая исполняет фрагмент кода целиком.

Не передавайте в Вычислить() и Выполнить() строки, которые ввёл пользователь, без безопасного режима. В такой строке может оказаться вызов, который удалит данные или прочитает файл на сервере. Перед вычислением включают УстановитьБезопасныйРежим(Истина). В типовых конфигурациях на БСП для этого есть готовая обёртка ОбщегоНазначения.ВычислитьВБезопасномРежиме().

Формулы без программирования

В типовых решениях формулы часто задаёт пользователь, а не программист:

  • 💼 ЗУП 3.1 — у вида начисления задаётся формула из показателей (оклад, отработанные дни, норма). Платформа подставляет значения показателей и считает результат по тем же правилам приоритета.
  • 📊 Схема компоновки данных — вычисляемые поля и ресурсы с выражениями. Язык выражений СКД похож на встроенный, но отличается набором функций: например, есть ВычислитьВыражение() для расчётов по группировкам.
  • 🧾 Пользовательские поля в отчётах — в настройках отчёта можно добавить поле-формулу из существующих колонок без доступа к конфигуратору.

Ошибки вычислений и отладка формул

Большинство ошибок в расчётах сводится к нескольким сообщениям платформы.

Диагностика: выберите симптом

Перехват исключений

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

Попытка
	Результат = Вычислить(Формула);
Исключение
	Результат = 0;
	Сообщить("Формула не вычислена: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Отладчик как калькулятор

В режиме отладки из конфигуратора есть окно Вычислить выражение (Shift+F9). Остановитесь на точке останова, введите любое выражение с текущими переменными — и увидите результат и его тип.

Так быстро проверяют гипотезы: что вернёт Окр() с нужным режимом, какой тип у значения из запроса, не строка ли там вместо числа. Переменные, за которыми нужно следить постоянно, удобнее вынести в Табло.

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

Почему в 1С 0.1 + 0.2 точно равно 0.3?
Числа во встроенном языке десятичные, а не двоичные с плавающей точкой. Поэтому при сложении копеек погрешности не накапливаются, округлять нужно только результаты деления.
Можно ли в 1С возвести число в степень знаком ^?
Нет, такого оператора нет. Используйте функцию Pow(Основание, Степень), например Pow(2, 10) даёт 1024.
Почему в тексте печатной формы у числа появился пробел?
При склейке строки с числом срабатывает неявное преобразование с разделителем разрядов. Оберните число в Формат(Число, "ЧГ=0").
Чем Цел() отличается от Окр(Число, 0)?
Цел() отбрасывает дробную часть: Цел(7.9) = 7. Окр(7.9, 0) округляет: результат 8.
Можно ли вызвать Вычислить() на клиенте?
Да, функция доступна и на клиенте, и на сервере. Но формулы из справочников и пользовательского ввода надёжнее считать на сервере в безопасном режиме, там же доступны данные базы.