При разработке пользовательского интерфейса калькулятора на платформе 1С:Предприятие часто возникает задача последовательного набора цифр: когда пользователь нажимает кнопки с цифрами (например, «1», «1»), в дисплее калькулятора должно формироваться число «11», а не выполняться математическое сложение «1 + 1 = 2» на этапе ввода. Рассмотрим подробно, как правильно организовать обработку нажатия цифровых кнопок и выполнение дальнейших математических операций.
Основная идея заключается в том, чтобы реквизит формы, отображающий текущее введенное значение, имел тип Строка, а не Число. При нажатии на каждую кнопку с цифрой мы добавляем соответствующий символ к текущей строке дисплея.
Проанализируем пример реализации:
ПолеВвода0) тип Строка.
// При нажатии кнопки "1"
ЭтаФорма.ПолеВвода = ЭтаФорма.ПолеВвода + "1";
После того как пользователь сформировал число в виде строки (например, «4693178») и нажимает кнопку операции (например, «+»), мы сохраняем полученную строку во временную переменную, предварительно преобразуя ее в числовой тип с помощью встроенной функции Число(), а поле ввода очищаем для набора второго слагаемого.
При нажатии на кнопку «=» выполняем итоговое вычисление:
ПервоеЧисло = Число(СохраненнаяСтрока1);
ВтороеЧисло = Число(ЭтаФорма.ПолеВвода);
Результат = ПервоеЧисло + ВтороеЧисло;
// Выводим результат обратно на экран
ЭтаФорма.ПолеВвода = Строка(Результат);
Если реквизит формы имеет числовой тип, последовательный ввод можно реализовать с помощью арифметических операций без перевода в строку. Каждая новая введенная цифра сдвигает предыдущее значение на один разряд влево (умножением на 10):
// Переменная ЧисловоеПоле хранит текущее значение
ЧисловоеПоле = ЧисловоеПоле * 10 + ВведеннаяЦифра;
Посмотрим, как это работает на примере: если на экране число 46, и пользователь нажимает 9, операция 46 * 10 + 9 дает результат 469.
Чтобы не создавать отдельную процедуру для каждой из 10 цифровых кнопок (от 0 до 9), назначим единую процедуру-обработчик для всех цифровых кнопок на форме. Считывать нажатую цифру можно из заголовка кнопки:
&НаКлиенте
Процедура НажатиеЦифровойКнопки(Команда)
// Получаем значение из имени или заголовка кнопки
НажатаяЦифра = Элементы.ТекущийЭлемент.Заголовок;
// Обработка ведущего нуля
Если ЭтаФорма.ПолеВвода = "0" Тогда
ЭтаФорма.ПолеВвода = НажатаяЦифра;
Иначе
ЭтаФорма.ПолеВвода = ЭтаФорма.ПолеВвода + НажатаяЦифра;
КонецЕсли;
КонецПроцедуры
При практической реализации калькулятора важно учесть особенности платформы 1С:
Строка() может автоматически добавлять неразрывные пробелы для разделения триад (например, «4 693 178»). Чтобы избежать ошибок при последующем преобразовании, используйте функцию Формат() с отключенной группировкой:
СтроковоеЗначение = Формат(ЧисловоеЗначение, "ЧГ=0");
СтрНайти(). Перед вызовом функции Число() рекомендуется приводить разделители к стандартному виду с помощью СтрЗаменить(Строка, ".", ",").ТолькоПросмотр = Истина.
Попытка
Результат = Число1 / Число2;
Исключение
ВызватьИсключение "Ошибка: Деление на ноль!";
КонецПопытки;
Помните также, что в платформе 1С:Предприятие присутствует встроенный системный калькулятор, который вызывается комбинацией клавиш Ctrl + F2.