Калькулятор в 1С 8.3: от встроенного до собственной обработки

· 9 мин

Содержание

В 1С 8.3 есть встроенный калькулятор, и запускать Windows-калькулятор рядом с базой не нужно. Он открывается из главного меню и всплывает прямо в полях ввода чисел — можно сложить, умножить, посчитать процент и перенести результат в документ одной клавишей.

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

Какой калькулятор выбрать под задачу

Прежде чем что-то настраивать, определитесь, что именно нужно. Вариантов три, и они не заменяют друг друга.

  • 🧮 Разово посчитать число — встроенный микрокалькулятор в поле ввода или общий калькулятор из меню. Ничего программировать не надо.
  • ⚙️ Повторяющаяся формула (наценка, пересчёт, сумма по реквизитам) — вычисления прямо в форме документа или своя внешняя обработка.
  • 🔌 Сложный алгоритм или внешний источник — расчёт на встроенном языке, обращение к внешней компоненте или к стороннему сервису по HTTP.
Что вам нужно от калькулятора?

Встроенный калькулятор в полях ввода

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

  1. Встаньте курсором в числовое поле — например, в сумму в документе.
  2. Нажмите кнопку калькулятора справа от поля или вызовите его клавишей, назначенной в вашей версии платформы (обычно это та же кнопка выпадающего списка поля).
  3. Наберите выражение: 1250 * 12, 80000 / 1.2, проценты — через кнопку %.
  4. Нажмите 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) менять формы напрямую не стоит — обновление затрёт правки. Правильный путь — расширение конфигурации : оно живёт отдельно от типовой и переживает обновления.

  1. Откройте конфигуратор, создайте расширение (Конфигурация → Расширения).
  2. Добавьте в расширение нужную форму документа и её реквизиты.
  3. Для поля, которое запускает пересчёт (например, «Количество»), создайте обработчик ПриИзменении.
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
    Строка = Элементы.Товары.ТекущиеДанные;
    Строка.Сумма = Строка.Количество * Строка.Цена;
КонецПроцедуры

Пример считает сумму строки табличной части при изменении количества. Тот же обработчик вешают на поле «Цена», чтобы пересчёт шёл в обе стороны.

Для расчёта общей суммы документа по всем строкам удобнее событие формы, а не отдельного поля:

&НаКлиенте
Процедура ПересчитатьИтог()
    Итог = 0;
    Для Каждого Строка Из Объект.Товары Цикл
        Итог = Итог + Строка.Сумма;
    КонецЦикла;
    Объект.СуммаДокумента = Итог;
КонецПроцедуры

Процедуру вызывают из обработчиков ПриИзменении количества и цены, чтобы итог обновлялся сразу. Так документ сам ведёт себя как калькулятор: вводите строки — внизу копится сумма.

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

Расчётные поля в отчётах

Отдельная история — калькулятор внутри отчёта. Здесь ничего программировать на форме не нужно, всё делается в системе компоновки данных (СКД).

  • Вычисляемые поля. На вкладке схемы компоновки добавляете поле и в выражении пишете формулу: Количество * Цена, Прибыль / Выручка * 100. Поле считается на лету при формировании отчёта.
  • Ресурсы. Для итогов по группировкам используйте ресурсы: Сумма(Сумма), Среднее(Цена). Платформа сама подведёт итоги по строкам и в целом по отчёту.
  • Пользовательские поля. В готовом отчёте пользователь может через Ещё → Изменить вариант добавить своё вычисляемое поле без конфигуратора — это встроенный «калькулятор» внутри отчёта.

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

Внешние расчёты и подключение сторонних сервисов

Если формула выходит за рамки арифметики — сложный математический алгоритм, обращение к чужой программе или к онлайн-сервису, — платформа умеет и это.

  • Внешние компоненты. Технология Native API позволяет подключить скомпилированную библиотеку (расчётное ядро на C++ и т. п.) и вызывать её методы из встроенного языка. Компонента регистрируется в конфигурации как макет и загружается методами работы с внешними компонентами.
  • HTTP-запрос к API. Когда расчёт делает сторонний сервис (курсы валют, тарифный калькулятор перевозчика), 1С отправляет запрос объектами HTTPСоединение и HTTPЗапрос, а ответ разбирает из JSON или XML.
  • COM-соединение. Для связки с установленными на том же компьютере программами (например, Excel как расчётный движок) используют COM — но это хрупкий способ, зависящий от окружения, и для сервера он не годится.

Внешние компоненты и COM работают там, где установлены, поэтому на веб-клиенте и в облаке они, как правило, недоступны. HTTP-запрос — самый универсальный вариант: он работает и в клиент-серверном режиме.

Конкретные адреса и параметры стороннего API смотрите в документации того сервиса, к которому подключаетесь, — универсального «калькулятора по API» в 1С нет.

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

Типичные ошибки

Разберём промахи, из-за которых калькулятор либо не считает, либо считает не то.

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

Ещё одна частая путаница — приоритет операций. В выражении 1000 + 500 * 0.2 сначала выполнится умножение. Если нужен другой порядок, ставьте скобки. Это касается и калькулятора в полях, и функции Вычислить().

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

Нужна ли лицензия или доплата за калькулятор в 1С?
Нет. Встроенный калькулятор и микрокалькулятор в полях ввода входят в платформу. Доплата нужна только за собственные доработки, если их заказывают у подрядчика.
Можно ли считать прямо в табличной части документа?
Да, через расчётное поле или обработчик ПриИзменении на колонке. Разово — встаньте в числовую ячейку и вызовите калькулятор поля ввода, как в обычной форме.
Чем `Вычислить()` отличается от `Выполнить()`?
Вычислить() возвращает значение выражения ("2+2" → 4), а Выполнить() исполняет оператор без возврата результата. Для калькулятора нужен именно Вычислить().
Будет ли мой калькулятор работать в веб-клиенте?
Обработка на встроенном языке и расчёты в форме — да. Внешние компоненты и COM в браузере обычно недоступны, для них нужен тонкий клиент или сервер.
Переживёт ли доработка обновление типовой конфигурации?
Если встроить вычисления через расширение конфигурации — да. Прямые правки типовых форм обновление затирает.