Разработка и Конфигурация · 9 мин
Как написать калькулятор на 1С
Разбираем, как создать калькулятор на 1С: внешняя обработка, форма, код на встроенном языке, обработка ошибок деления на ноль и тестирование результата.
Калькулятор — классическая учебная задача на встроенном языке 1С, но одновременно и полезный практический инструмент: простой расчётный модуль можно встроить в обработку для менеджеров, кладовщиков или бухгалтеров. Задача решается двумя путями: созданием внешней обработки с формой (самый наглядный вариант) или добавлением функции расчёта в существующую конфигурацию.
Для работы понадобится платформа 1С:Предприятие 8.3, конфигуратор и базовое понимание структуры метаданных. Никаких внешних библиотек не требуется — весь расчёт выполняется средствами встроенного языка. Время на создание простейшего варианта с четырьмя арифметическими операциями — примерно 30–60 минут с учётом тестирования.
Ниже разобран полный цикл: от создания обработки до проверки граничных случаев вроде деления на ноль. Код приведён для управляемых форм, которые используются во всех современных конфигурациях — УТ 11, ERP, Бухгалтерии 3.0.
Выбор формата: внешняя обработка или доработка конфигурации
Первое решение, которое нужно принять, — где будет жить калькулятор. Внешняя обработка (файл с расширением .epf) не требует изменения конфигурации, подключается через «Файл → Открыть» или механизм дополнительных отчётов и обработок и не нарушает поддержку типового решения. Это оптимальный вариант для учебной задачи и для инструментов, которыми пользуются единичные сотрудники.
Доработка конфигурации оправдана, когда калькулятор — часть бизнес-процесса: например, калькулятор стоимости доставки внутри заказа клиента или расчёт маржи в карточке номенклатуры. В этом случае расчётный код размещают в общем модуле, а элементы ввода — на форме конкретного документа или справочника. Помните, что любое изменение типовой конфигурации усложняет её обновление, поэтому логику по возможности выносят в расширение конфигурации (файл .cfe).
Сравнение вариантов размещения
Подходит для учебных задач и редких инструментов; не затрагивает конфигурацию, но не видна в штатном интерфейсе без подключения.
Подходит для рабочих доработок: калькулятор встраивается в интерфейс, типовая конфигурация остаётся на поддержке.
Только если расширение не покрывает задачу; усложняет обновления и требует снятия объектов с поддержки.
Создание внешней обработки и формы
Откройте конфигуратор, выберите «Файл → Новый → Внешняя обработка». Задайте имя, например «ПростойКалькулятор» — оно будет использоваться в коде при обращении к обработке. Затем в дереве обработки нажмите «Добавить форму» и создайте основную форму. Платформа автоматически сгенерирует управляемую форму с модулем.
На форму методом перетаскивания из панели реквизитов добавьте: два реквизита типа «Число» для операндов (назовите их Число1 и Число2, длина 15, точность 2), реквизит «Операция» типа «Строка» или перечисление со значениями «Сложение», «Вычитание», «Умножение», «Деление», и реквизит «Результат» типа «Число» с признаком «Только просмотр». Добавьте команду формы «Рассчитать» и перетащите её на форму как кнопку.
Для реквизита «Операция» удобнее всего в свойствах поля ввода установить «Режим выбора из списка» и заполнить список выбора четырьмя операциями — это исключит опечатки пользователя и упростит проверку в коде.
- 1Создайте новую внешнюю обработку в конфигураторе
- 2Добавьте основную форму обработки
- 3Создайте реквизиты формы: Число1, Число2 (Число), Операция (Строка), Результат (Число, только просмотр)
- 4Добавьте команду «Рассчитать» и кнопку на форму
- 5Напишите обработчик команды в модуле формы
- 6Сохраните обработку и проверьте в режиме предприятия
Код расчёта в модуле формы
Обработчик команды «Рассчитать» — это процедура с директивой компиляции &НаКлиенте, если расчёт простой и не требует обращения к базе данных. Для арифметики серверный вызов не нужен, и код выполнится мгновенно без обращения к серверу 1С.
&НаКлиенте
Процедура Рассчитать(Команда)
Если Операция = "Сложение" Тогда
Результат = Число1 + Число2;
ИначеЕсли Операция = "Вычитание" Тогда
Результат = Число1 - Число2;
ИначеЕсли Операция = "Умножение" Тогда
Результат = Число1 * Число2;
ИначеЕсли Операция = "Деление" Тогда
Если Число2 = 0 Тогда
ПоказатьПредупреждение(, "Деление на ноль невозможно");
Результат = 0;
Возврат;
КонецЕсли;
Результат = Число1 / Число2;
Иначе
ПоказатьПредупреждение(, "Выберите операцию");
КонецЕсли;
КонецПроцедуры
Обратите внимание на три момента. Во-первых, проверка делителя на ноль выполняется до операции деления — это защищает от падения с ошибкой. Во-вторых, ветка «Иначе» ловит ситуацию, когда пользователь не выбрал операцию. В-третьих, ПоказатьПредупреждение используется вместо устаревшего модального Предупреждение(), что соответствует требованиям современных версий платформы.
Расширение функционала: проценты, степень, история
Базовый калькулятор легко нарастить. Для расчёта процента от числа добавьте операцию «Процент» с формулой Результат = Число1 * Число2 / 100 — это востребовано в торговых задачах при расчёте скидок и наценок. Для возведения в степень во встроенном языке используется функция Pow(Число1, Число2), для квадратного корня — Sqrt(Число1) с обязательной проверкой, что аргумент неотрицателен.
Историю расчётов удобно хранить в реквизите формы типа «ТаблицаЗначений» с колонками «Выражение» и «Результат»: после каждого успешного расчёта добавляйте строку. Помните, что таблица значений живёт только в рамках сеанса формы — при закрытии обработки история пропадёт. Если нужно постоянное хранение, потребуется регистр сведений, а это уже доработка конфигурации.
НоваяСтрока = История.Добавить();
НоваяСтрока.Выражение = Строка(Число1) + " " + Операция + " " + Строка(Число2);
НоваяСтрока.Результат = Результат;Обработка ошибок и граничных случаев
Деление на ноль — не единственный источник проблем. Переполнение при очень больших числах, ввод значений с чрезмерной точностью, пустые поля ввода — всё это стоит предусмотреть. Пустое числовое поле в 1С интерпретируется как 0, что для умножения даст некорректный с точки зрения пользователя результат без всякой ошибки.
Универсальная защита — конструкция Попытка/Исключение вокруг расчёта. В блоке Исключение выведите пользователю понятное сообщение через ИнформацияОбОшибке().Описание. Однако не заменяйте явные проверки исключениями: проверка делителя на ноль перед операцией читается лучше и работает быстрее, чем перехват ошибки.
Проверка работоспособности
Тестируйте калькулятор в режиме 1С:Предприятие на заранее подготовленном наборе примеров: обычные операции, деление на ноль, работа с дробными числами, пустые поля, отрицательные значения. Результат каждой операции сверьте с эталонным расчётом. Особое внимание уделите округлению: при точности реквизита 2 знака результат деления 10 на 3 отобразится как 3,33, хотя внутри переменной хранится больше знаков.
Как проверить результат
Результат равен 4
Пустой результат или ошибка выполнения
Предупреждение пользователю, результат не меняется или обнуляется
Обработка аварийно закрывается с ошибкой
Отображается 3,33
Округление до 3 или обрезание без округления
Сообщение «Выберите операцию»
Тишина или расчёт по умолчанию
Частые вопросы
Можно ли написать калькулятор на 1С без конфигуратора?
Полноценно — нет: создание обработки, формы и модуля выполняется в конфигураторе. В режиме 1С:Предприятие можно только запускать готовую обработку. Альтернатива без конфигуратора — встроенный калькулятор, который платформа предоставляет в числовых полях ввода (открывается по кнопке или сочетанию клавиш у поля ввода).
Где разместить код: на клиенте или на сервере?
Для чистой арифметики — на клиенте (&НаКлиенте): расчёт мгновенный и не нагружает сервер. Серверный вызов нужен, только если расчёт обращается к данным базы, например подставляет курс валюты или цену из регистра сведений.
Как добавить калькулятор в типовую конфигурацию без снятия с поддержки?
Используйте расширение конфигурации: создайте расширение, добавьте в него обработку или общий модуль с расчётом и подключите к информационной базе. Типовая конфигурация при этом остаётся на полной поддержке и обновляется штатно.
Почему результат деления отображается округлённым?
Точность отображения задаётся в свойствах реквизита формы: параметр «Точность» числового типа. Увеличьте её до нужного числа знаков. Учтите, что при дальнейших расчётах с отображаемым значением могут накапливаться ошибки округления — используйте функцию Окр() там, где требуется контролируемое округление.
Можно ли сделать калькулятор с кнопками цифр, как в Windows?
Да: для каждой цифры создаётся команда формы, а в обработчике цифра дописывается к строковому реквизиту, который затем преобразуется в число. Это требует больше кода и аккуратной обработки ввода, поэтому для учебной задачи проще начать с полей ввода.
Что важно запомнить
Простейший калькулятор на 1С — это внешняя обработка с управляемой формой, двумя числовыми реквизитами, выбором операции и клиентской процедурой расчёта. Обязательны проверка деления на ноль и ветка для пустой операции. Для встраивания в типовую конфигурацию используйте расширение, а не изменение конфигурации.