Калькулятор в 1С 8.3: от встроенного до собственной обработки
Содержание
В 1С 8.3 есть встроенный калькулятор, и запускать Windows-калькулятор рядом с базой не нужно. Он открывается из главного меню и всплывает прямо в полях ввода чисел — можно сложить, умножить, посчитать процент и перенести результат в документ одной клавишей.
Если же нужно не разовое действие, а повторяющийся расчёт — наценка, пересчёт валюты, формула по нескольким реквизитам — калькулятор собирают на встроенном языке через функцию Вычислить() в виде внешней обработки или встраивают вычисления в саму форму документа. Ниже — все три уровня: от готового инструмента до своего кода.
Какой калькулятор выбрать под задачу
Прежде чем что-то настраивать, определитесь, что именно нужно. Вариантов три, и они не заменяют друг друга.
- 🧮 Разово посчитать число — встроенный микрокалькулятор в поле ввода или общий калькулятор из меню. Ничего программировать не надо.
- ⚙️ Повторяющаяся формула (наценка, пересчёт, сумма по реквизитам) — вычисления прямо в форме документа или своя внешняя обработка.
- 🔌 Сложный алгоритм или внешний источник — расчёт на встроенном языке, обращение к внешней компоненте или к стороннему сервису по HTTP.
Встроенный калькулятор в полях ввода
Это самый частый сценарий и про него многие не знают. В любом числовом поле формы (сумма, количество, цена) при вводе появляется маленькая кнопка калькулятора.
- Встаньте курсором в числовое поле — например, в сумму в документе.
- Нажмите кнопку калькулятора справа от поля или вызовите его клавишей, назначенной в вашей версии платформы (обычно это та же кнопка выпадающего списка поля).
- Наберите выражение:
1250 * 12,80000 / 1.2, проценты — через кнопку%. - Нажмите Enter — результат подставится прямо в поле документа.
Так удобно считать, например, цену без НДС: ввели сумму с НДС, нажали калькулятор, разделили на 1.2 — и значение уже в поле, без промежуточных записей на бумажке.
Калькулятор в поле ввода понимает скобки и приоритет операций, поэтому 1000 + 500 * 0.2 даст 1100, а не 300. Если нужен другой порядок — ставьте скобки: (1000 + 500) * 0.2.
Ещё одна удобная мелочь: можно начать набирать выражение прямо в поле. Если ввести в сумму 1200+800 и уйти из поля, платформа сама посчитает и оставит 2000. Это работает почти во всех числовых полях типовых конфигураций и экономит клики, когда нужно быстро сложить несколько сумм из первички.
Калькулятор как отдельный инструмент
Когда поля под рукой нет, а посчитать надо, открывается общий калькулятор.
- Путь:
Главное меню → Сервис → Калькулятор(иконка главного меню — в левом верхнем углу интерфейса «Такси»). Название пункта меню в отдельных конфигурациях может отличаться, но он лежит именно в разделе «Сервис». - Рядом в том же меню обычно есть
Календарь— удобно для расчёта дней между датами.
Калькулятор работает в двух режимах — обычном (кнопки и ввод с клавиатуры) и формульном, где видно всю строку вычисления целиком. Формульный режим удобнее, когда считаете длинное выражение со скобками: видно, что именно набрано, и легко поправить ошибку, не начиная заново.
Результат можно скопировать в буфер обмена и вставить куда угодно — в поле документа, в письмо, в таблицу. Это и отличает штатный калькулятор от Windows-калькулятора: он открыт в том же окне программы, не нужно переключаться между приложениями и терять фокус с документа, который заполняете.
Это готовый инструмент платформы — его не нужно добавлять или устанавливать. Если в меню пункта нет, проверьте права пользователя: администратор мог скрыть команду в настройке интерфейса.
Свой калькулятор на встроенном языке
Когда штатного инструмента мало — например, нужен пересчёт по своей формуле с сохранением истории, — делают внешнюю обработку
. Ядро такого калькулятора — глобальная функция Вычислить(), которая выполняет строку как выражение встроенного языка.
Минимальная логика на форме обработки с полем ввода ВыражениеСтрокой и полем результата Результат:
&НаКлиенте
Процедура ПосчитатьНажатие(Команда)
Попытка
Результат = Вычислить(ВыражениеСтрокой);
Исключение
Результат = 0;
Сообщить("Не удалось посчитать: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Что здесь происходит:
Вычислить("1250 * 12")вернёт15000— функция понимает любое корректное выражение языка, включая встроенные функции вродеОкр()илиМакс().- Конструкция
Попытка … Исключениеловит опечатки: если в строке мусор, пользователь получит понятное сообщение, а не аварийное завершение. ОписаниеОшибки()подставит текст сбоя — полезно при отладке.
Чтобы обработка была полезной, добавьте несколько кнопок-пресетов: «+20% НДС» подставляет * 1.2, «−20%» — деление, «Округлить» оборачивает выражение в Окр(… , 2). Так калькулятор превращается в инструмент под конкретные бухгалтерские задачи.
Поскольку Вычислить() исполняет полноценное выражение языка, в обработке доступны все встроенные функции. Несколько примеров, которые пригодятся на практике:
Вычислить("Окр(80000 / 1.2, 2)") // цена без НДС, округлённая до копеек → 66666.67
Вычислить("Макс(1500, 2300, 900)") // наибольшее из значений → 2300
Вычислить("(100000 - 30000) * 0.13") // НДФЛ с разницы → 9100
Если хочется хранить историю расчётов, заведите в форме табличную часть и при каждом нажатии добавляйте строку с выражением и результатом. Пользователь видит, что считал раньше, и может вернуться к любой строке — получается полноценный калькулятор с лентой, как в бухгалтерском приложении.
Вычислить() исполняет произвольный код на встроенном языке. В обработке «для себя» это удобно, но не давайте вводить выражения из непроверенных источников и держите вызов в безопасном режиме, если обработку запускают разные пользователи.
Готовую обработку сохраняют в файл .epf и открывают через Файл → Открыть или подключают в справочник дополнительных обработок — тогда она доступна всем из списка без ручного открытия файла.
Автоматический расчёт прямо в документе
Чаще калькулятор нужен не отдельно, а внутри документа: ввели количество и цену — сумма посчиталась сама. Это делается не кнопкой, а обработчиком события поля.
Для типовых конфигураций (БП 3.0, ЗУП 3.1, УТ 11) менять формы напрямую не стоит — обновление затрёт правки. Правильный путь — расширение конфигурации : оно живёт отдельно от типовой и переживает обновления.
- Откройте конфигуратор, создайте расширение (
Конфигурация → Расширения). - Добавьте в расширение нужную форму документа и её реквизиты.
- Для поля, которое запускает пересчёт (например, «Количество»), создайте обработчик
ПриИзменении.
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
Строка = Элементы.Товары.ТекущиеДанные;
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецПроцедуры
Пример считает сумму строки табличной части при изменении количества. Тот же обработчик вешают на поле «Цена», чтобы пересчёт шёл в обе стороны.
Для расчёта общей суммы документа по всем строкам удобнее событие формы, а не отдельного поля:
&НаКлиенте
Процедура ПересчитатьИтог()
Итог = 0;
Для Каждого Строка Из Объект.Товары Цикл
Итог = Итог + Строка.Сумма;
КонецЦикла;
Объект.СуммаДокумента = Итог;
КонецПроцедуры
Процедуру вызывают из обработчиков ПриИзменении количества и цены, чтобы итог обновлялся сразу. Так документ сам ведёт себя как калькулятор: вводите строки — внизу копится сумма.
Если расчёт нужен только для подсказки, а в базу его писать не надо, заведите в форме служебный реквизит и показывайте результат в нём — документ останется чистым.
Расчётные поля в отчётах
Отдельная история — калькулятор внутри отчёта. Здесь ничего программировать на форме не нужно, всё делается в системе компоновки данных (СКД).
- Вычисляемые поля. На вкладке схемы компоновки добавляете поле и в выражении пишете формулу:
Количество * Цена,Прибыль / Выручка * 100. Поле считается на лету при формировании отчёта. - Ресурсы. Для итогов по группировкам используйте ресурсы:
Сумма(Сумма),Среднее(Цена). Платформа сама подведёт итоги по строкам и в целом по отчёту. - Пользовательские поля. В готовом отчёте пользователь может через
Ещё → Изменить вариантдобавить своё вычисляемое поле без конфигуратора — это встроенный «калькулятор» внутри отчёта.
Так, например, в отчёте по продажам одним вычисляемым полем добавляют наценку в процентах, не трогая исходные данные. Важная деталь: вычисляемое поле считается по каждой строке детальных записей, а итог по группировке даёт только ресурс. Если перепутать, процент наценки в строке «Итого» получится бессмысленным — поэтому проценты и отношения выносят в ресурс с правильной формулой агрегации, а не просто суммируют.
Внешние расчёты и подключение сторонних сервисов
Если формула выходит за рамки арифметики — сложный математический алгоритм, обращение к чужой программе или к онлайн-сервису, — платформа умеет и это.
- Внешние компоненты. Технология Native API позволяет подключить скомпилированную библиотеку (расчётное ядро на C++ и т. п.) и вызывать её методы из встроенного языка. Компонента регистрируется в конфигурации как макет и загружается методами работы с внешними компонентами.
- HTTP-запрос к API. Когда расчёт делает сторонний сервис (курсы валют, тарифный калькулятор перевозчика), 1С отправляет запрос объектами
HTTPСоединениеиHTTPЗапрос, а ответ разбирает из JSON или XML. - COM-соединение. Для связки с установленными на том же компьютере программами (например, Excel как расчётный движок) используют COM — но это хрупкий способ, зависящий от окружения, и для сервера он не годится.
Внешние компоненты и COM работают там, где установлены, поэтому на веб-клиенте и в облаке они, как правило, недоступны. HTTP-запрос — самый универсальный вариант: он работает и в клиент-серверном режиме.
Конкретные адреса и параметры стороннего API смотрите в документации того сервиса, к которому подключаетесь, — универсального «калькулятора по API» в 1С нет.
На практике к внешним расчётам прибегают редко: почти всё, что нужно бухгалтеру и пользователю, закрывают встроенный калькулятор и функция Вычислить(). Внешние компоненты оправданы, когда готовое расчётное ядро уже написано на другом языке и переписывать его на встроенном невыгодно, а HTTP-запрос — когда расчёт по своей природе зависит от внешних данных и должен быть всегда актуальным.
Типичные ошибки
Разберём промахи, из-за которых калькулятор либо не считает, либо считает не то.
80000 / 1.2, а не 1,2.ПриИзменении не привязан к полю или правки сделаны в форме, которую затёрло обновление. Делайте доработку через расширение конфигурации.Окр(Значение, 2) и указывайте режим округления; по умолчанию способ может отличаться от привычного бухгалтерского.Ещё одна частая путаница — приоритет операций. В выражении 1000 + 500 * 0.2 сначала выполнится умножение. Если нужен другой порядок, ставьте скобки. Это касается и калькулятора в полях, и функции Вычислить().
Частые вопросы
Нужна ли лицензия или доплата за калькулятор в 1С?
Можно ли считать прямо в табличной части документа?
ПриИзменении на колонке. Разово — встаньте в числовую ячейку и вызовите калькулятор поля ввода, как в обычной форме.Чем `Вычислить()` отличается от `Выполнить()`?
Вычислить() возвращает значение выражения ("2+2" → 4), а Выполнить() исполняет оператор без возврата результата. Для калькулятора нужен именно Вычислить().