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

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

Как написать калькулятор на 1С

Разбираем, как создать калькулятор на 1С: внешняя обработка, форма, код на встроенном языке, обработка ошибок деления на ноль и тестирование результата.

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

Для работы понадобится платформа 1С:Предприятие 8.3, конфигуратор и базовое понимание структуры метаданных. Никаких внешних библиотек не требуется — весь расчёт выполняется средствами встроенного языка. Время на создание простейшего варианта с четырьмя арифметическими операциями — примерно 30–60 минут с учётом тестирования.

Ниже разобран полный цикл: от создания обработки до проверки граничных случаев вроде деления на ноль. Код приведён для управляемых форм, которые используются во всех современных конфигурациях — УТ 11, ERP, Бухгалтерии 3.0.

Выбор формата: внешняя обработка или доработка конфигурации

Первое решение, которое нужно принять, — где будет жить калькулятор. Внешняя обработка (файл с расширением .epf) не требует изменения конфигурации, подключается через «Файл → Открыть» или механизм дополнительных отчётов и обработок и не нарушает поддержку типового решения. Это оптимальный вариант для учебной задачи и для инструментов, которыми пользуются единичные сотрудники.

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

Сравнение вариантов размещения

Внешняя обработка (.epf)

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

Расширение конфигурации (.cfe)

Подходит для рабочих доработок: калькулятор встраивается в интерфейс, типовая конфигурация остаётся на поддержке.

Изменение конфигурации

Только если расширение не покрывает задачу; усложняет обновления и требует снятия объектов с поддержки.

Создание внешней обработки и формы

Откройте конфигуратор, выберите «Файл → Новый → Внешняя обработка». Задайте имя, например «ПростойКалькулятор» — оно будет использоваться в коде при обращении к обработке. Затем в дереве обработки нажмите «Добавить форму» и создайте основную форму. Платформа автоматически сгенерирует управляемую форму с модулем.

На форму методом перетаскивания из панели реквизитов добавьте: два реквизита типа «Число» для операндов (назовите их Число1 и Число2, длина 15, точность 2), реквизит «Операция» типа «Строка» или перечисление со значениями «Сложение», «Вычитание», «Умножение», «Деление», и реквизит «Результат» типа «Число» с признаком «Только просмотр». Добавьте команду формы «Рассчитать» и перетащите её на форму как кнопку.

Для реквизита «Операция» удобнее всего в свойствах поля ввода установить «Режим выбора из списка» и заполнить список выбора четырьмя операциями — это исключит опечатки пользователя и упростит проверку в коде.

Порядок создания обработки
  1. 1
    Создайте новую внешнюю обработку в конфигураторе
  2. 2
    Добавьте основную форму обработки
  3. 3
    Создайте реквизиты формы: Число1, Число2 (Число), Операция (Строка), Результат (Число, только просмотр)
  4. 4
    Добавьте команду «Рассчитать» и кнопку на форму
  5. 5
    Напишите обработчик команды в модуле формы
  6. 6
    Сохраните обработку и проверьте в режиме предприятия

Код расчёта в модуле формы

Обработчик команды «Рассчитать» — это процедура с директивой компиляции &НаКлиенте, если расчёт простой и не требует обращения к базе данных. Для арифметики серверный вызов не нужен, и код выполнится мгновенно без обращения к серверу 1С.

&НаКлиенте

Процедура Рассчитать(Команда)

Если Операция = "Сложение" Тогда

Результат = Число1 + Число2;

ИначеЕсли Операция = "Вычитание" Тогда

Результат = Число1 - Число2;

ИначеЕсли Операция = "Умножение" Тогда

Результат = Число1 * Число2;

ИначеЕсли Операция = "Деление" Тогда

Если Число2 = 0 Тогда

ПоказатьПредупреждение(, "Деление на ноль невозможно");

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

Возврат;

КонецЕсли;

Результат = Число1 / Число2;

Иначе

ПоказатьПредупреждение(, "Выберите операцию");

КонецЕсли;

КонецПроцедуры

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

Расширение функционала: проценты, степень, история

Базовый калькулятор легко нарастить. Для расчёта процента от числа добавьте операцию «Процент» с формулой Результат = Число1 * Число2 / 100 — это востребовано в торговых задачах при расчёте скидок и наценок. Для возведения в степень во встроенном языке используется функция Pow(Число1, Число2), для квадратного корня — Sqrt(Число1) с обязательной проверкой, что аргумент неотрицателен.

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

1c
НоваяСтрока = История.Добавить();
НоваяСтрока.Выражение = Строка(Число1) + " " + Операция + " " + Строка(Число2);
НоваяСтрока.Результат = Результат;

Обработка ошибок и граничных случаев

Деление на ноль — не единственный источник проблем. Переполнение при очень больших числах, ввод значений с чрезмерной точностью, пустые поля ввода — всё это стоит предусмотреть. Пустое числовое поле в 1С интерпретируется как 0, что для умножения даст некорректный с точки зрения пользователя результат без всякой ошибки.

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

Типичные ошибки
01
Отсутствие проверки делителя на ноль — обработка падает с ошибкой выполнения
02
Использование модального Предупреждение() — ошибка в конфигурациях с запрещённым модальным режимом
03
Размещение кода на сервере (&НаСервере) для простой арифметики — лишние серверные вызовы и задержки
04
Отсутствие ветки Иначе в условии — при пустой операции пользователь не получает никакой реакции
05
Хранение истории в таблице значений с ожиданием её сохранения после закрытия — данные теряются

Проверка работоспособности

Тестируйте калькулятор в режиме 1С:Предприятие на заранее подготовленном наборе примеров: обычные операции, деление на ноль, работа с дробными числами, пустые поля, отрицательные значения. Результат каждой операции сверьте с эталонным расчётом. Особое внимание уделите округлению: при точности реквизита 2 знака результат деления 10 на 3 отобразится как 3,33, хотя внутри переменной хранится больше знаков.

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

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

Сложение 2 + 2
Норма

Результат равен 4

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

Пустой результат или ошибка выполнения

Деление на ноль
Норма

Предупреждение пользователю, результат не меняется или обнуляется

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

Обработка аварийно закрывается с ошибкой

Деление 10 / 3 при точности 2
Норма

Отображается 3,33

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

Округление до 3 или обрезание без округления

Пустое поле операции
Норма

Сообщение «Выберите операцию»

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

Тишина или расчёт по умолчанию

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

Можно ли написать калькулятор на 1С без конфигуратора?

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

Где разместить код: на клиенте или на сервере?

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

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

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

Почему результат деления отображается округлённым?

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

Можно ли сделать калькулятор с кнопками цифр, как в Windows?

Да: для каждой цифры создаётся команда формы, а в обработчике цифра дописывается к строковому реквизиту, который затем преобразуется в число. Это требует больше кода и аккуратной обработки ввода, поэтому для учебной задачи проще начать с полей ввода.

Итог

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

Простейший калькулятор на 1С — это внешняя обработка с управляемой формой, двумя числовыми реквизитами, выбором операции и клиентской процедурой расчёта. Обязательны проверка деления на ноль и ветка для пустой операции. Для встраивания в типовую конфигурацию используйте расширение, а не изменение конфигурации.