Встроенный калькулятор 1С:Предприятия и вычисление выражений во встроенном языке
Содержание
Встроенный калькулятор 1С:Предприятия 8.3 открывается сочетанием Ctrl+F2 или из главного меню, раздел Сервис. В числовых полях форм он появляется по кнопке выбора, и результат сразу попадает в поле. Это инструмент платформы, поэтому он одинаково работает в Бухгалтерии, ЗУП, УТ и любой другой конфигурации на 8.3.
За кнопками калькулятора стоит та же арифметика, что и во встроенном языке: десятичные числа, фиксированный порядок операций, строгие правила приведения типов. Если вы пишете формулы в обработках, видах расчёта или схеме компоновки, эти правила работают так же.
Как устроен калькулятор 1С и где его открыть
У пользователя есть три способа добраться до калькулятора:
- ⌨️
Ctrl+F2— из любого места программы, открывает отдельное окно калькулятора; - 📂 главное меню (кнопка с тремя полосками в заголовке окна) →
Сервис→Калькулятор; - 🔢 кнопка выбора в числовом поле формы — калькулятор открывается выпадающей панелью прямо под полем.
Отдельное окно — это «черновик»: считаете, копируете результат и вставляете куда нужно. Панель у поля удобнее: начальным значением калькулятора становится число из поля, а после = или Enter итог записывается обратно.
Работа с клавиатуры
Мышь калькулятору не нужна. Цифры, знаки +, -, *, / и точку можно набирать на цифровом блоке клавиатуры. Enter работает как «равно», Esc закрывает окно без переноса результата.
Буфер обмена тоже работает: Ctrl+C копирует текущее значение, Ctrl+V вставляет число, скопированное, например, из отчёта или из Excel. Это быстрый способ проверить итог в табличном документе: скопировали сумму, вставили, досчитали.
Синтаксис выражений и порядок вычислений
Когда формулу записывают в коде, в реквизите вида расчёта или в вычисляемом поле, её разбирает интерпретатор встроенного языка. Набор арифметических операций небольшой.
| Операция | Знак | Пример | Результат |
|---|---|---|---|
| Сложение | + | 120 + 30 | 150 |
| Вычитание | - | 120 - 30 | 90 |
| Умножение | * | 120 * 3 | 360 |
| Деление | / | 120 / 8 | 15 |
| Остаток от деления | % | 17 % 5 | 2 |
| Унарный минус | - | -(120 - 30) | -90 |
Оператора возведения в степень нет. Для этого есть функция Pow(), о ней ниже.
Приоритет операций
Порядок такой же, как в школьной математике:
- Скобки.
- Унарный минус.
- Умножение, деление и остаток (
*,/,%) — слева направо. - Сложение и вычитание — слева направо.
- Сравнения (
=,<>,<,>,<=,>=). - Логические
НЕ, затемИ, затемИЛИ.
Пример: 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, 0, Сумма / Норма).Число() или в арифметику попала строка с буквами, пробелами-разделителями или пустая строка. Очистите строку через СтрЗаменить() и проверьте её перед преобразованием.Перехват исключений
Если формулу вводит пользователь, ошибку лучше поймать и показать понятным текстом:
Попытка
Результат = Вычислить(Формула);
Исключение
Результат = 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.