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

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

Как написать программу в 1С: принимает радиус круга и возвращает площадь

Как написать программу на встроенном языке 1С, которая принимает радиус круга и возвращает его площадь: код функции, проверка ввода, примеры и типичные ошибки.

Задача «написать программу, которая принимает радиус круга и возвращает его площадь» — классическое учебное упражнение, и на встроенном языке 1С она решается буквально в несколько строк. Формула известна из школьной геометрии: площадь круга равна произведению числа π на квадрат радиуса (S = π × R²). В 1С для этого используется функция возведения в степень и числовой литерал для π.

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

Все примеры написаны на встроенном языке платформы 1С:Предприятие 8 и работают как в толстом, так и в тонком клиенте, если не оговорено иное. Код можно вставить в общий модуль, модуль формы или выполнить во внешней обработке — например, в консоли кода.

Формула и базовая функция вычисления площади

Математическая основа задачи — формула S = π × R². Во встроенном языке 1С нет предопределённой константы «Пи», поэтому значение числа π задаётся литералом. Для большинства прикладных расчётов достаточно записать 3.14159, но если важна точность, используйте больше знаков: 3.14159265358979.

Возведение в квадрат выполняется стандартной функцией Pow(Радиус, 2). Можно также просто перемножить радиус сам на себя: Радиус * Радиус — такой вариант работает чуть быстрее и нагляднее для квадрата.

Простейшая функция выглядит так:

Функция ПлощадьКруга(Радиус) Экспорт

Возврат 3.14159265358979 Радиус Радиус;

КонецФункции

Функция объявлена с ключевым словом Экспорт, чтобы её можно было вызывать из других модулей, если она размещена в общем модуле. Вызов: Площадь = ПлощадьКруга(5); — вернёт примерно 78.5398.

Интерактивный ввод радиуса от пользователя

Если программа должна именно «принимать» радиус от пользователя, понадобится диалог ввода. В тонком клиенте используется механизм оповещений: метод ПоказатьВводЧисла работает асинхронно и не блокирует интерфейс.

&НаКлиенте

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

Оповещение = Новый ОписаниеОповещения("ПослеВводаРадиуса", ЭтотОбъект);

ПоказатьВводЧисла(Оповещение, 0, "Введите радиус круга", 10, 2);

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

&НаКлиенте

Процедура ПослеВводаРадиуса(Радиус, ДополнительныеПараметры) Экспорт

Если Радиус = Неопределено Тогда

Возврат; // пользователь нажал «Отмена»

КонецЕсли;

Площадь = 3.14159265358979 Радиус Радиус;

ПоказатьПредупреждение(, "Площадь круга: " + Площадь);

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

Обратите внимание: если пользователь нажал «Отмена», в обработчик приходит значение Неопределено, и его нужно обработать отдельно, иначе расчёт выполнится с пустым значением и выдаст ошибку или неверный результат.

В толстом клиенте обычного приложения допустим синхронный вызов ВвестиЧисло(Радиус, "Введите радиус", 10, 2), но в управляемых формах и веб-клиенте этот метод недоступен — ориентируйтесь на асинхронный вариант.

Порядок создания программы
  1. 1
    Создайте внешнюю обработку или откройте общий модуль конфигурации
  2. 2
    Добавьте функцию ПлощадьКруга с параметром Радиус и формулой π × R²
  3. 3
    Добавьте команду формы с диалогом ПоказатьВводЧисла для ввода радиуса
  4. 4
    Реализуйте обработчик оповещения с проверкой на Неопределено и отрицательные значения
  5. 5
    Запустите обработку, введите радиус 1 и сверьте результат с числом π

Проверка входных данных

Радиус — физическая величина, которая не может быть отрицательной. Если пользователь введёт −5, формула всё равно вернёт положительное число (квадрат убирает знак), и молчаливый неверный результат может уйти дальше в расчёты. Поэтому входное значение стоит проверять явно.

Функция ПлощадьКруга(Радиус) Экспорт

Если ТипЗнч(Радиус) <> Тип("Число") Тогда

ВызватьИсключение "Радиус должен быть числом";

КонецЕсли;

Если Радиус < 0 Тогда

ВызватьИсключение "Радиус не может быть отрицательным";

КонецЕсли;

Возврат 3.14159265358979 Радиус Радиус;

КонецФункции

Нулевой радиус — допустимый вырожденный случай: площадь равна нулю. Запрещать его не нужно, если только прикладная логика не требует обратного. Также учитывайте, что при вводе через диалог пользователь может ввести дробное число — тип «Число» в 1С это полностью поддерживает, дополнительных действий не требуется.

Округление и точность результата

Результат вычисления почти всегда содержит длинную дробную часть. Для вывода пользователю его удобно округлить функцией Окр(Площадь, 2) или отформатировать строкой: Формат(Площадь, "ЧДЦ=2"). Разница в том, что Окр меняет само число, а Формат — только его отображение.

Если площадь участвует в дальнейших расчётах (например, расход материала на круглую заготовку), округляйте только итоговое значение на последнем шаге. Промежуточное округление накапливает погрешность, и итог может отличаться от ожидаемого на величину, заметную при больших объёмах вычислений.

Для точности π не стоит изобретать собственные константы с малым числом знаков вроде 3.14 — при больших радиусах ошибка становится ощутимой. Например, при радиусе 1000 разница между π = 3.14 и полным значением даёт расхождение в площади более тысячи квадратных единиц.

Где разместить код: модуль формы, общий модуль или консоль

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

Если расчёт нужен в нескольких объектах (документы, отчёты, обработки), функцию правильно вынести в общий серверный модуль с признаком «Сервер» и, при необходимости, «Вызов сервера». Тогда клиентский код вызывает её как МодульРасчетов.ПлощадьКруга(Радиус).

Для интерактивного сценария с формой (поле ввода радиуса и кнопка «Рассчитать») создайте внешнюю обработку с формой: реквизит «Радиус» типа Число, команда с обработчиком на клиенте. Это самый наглядный вариант для обучения и демонстрации.

Где разместить код расчёта

Консоль кода / внешняя обработка без формы

Быстрый запуск и отладка; не подходит для регулярного использования пользователями

Общий модуль

Переиспользование во всей конфигурации; требует изменения конфигурации и прав на доработку

Внешняя обработка с формой

Удобный диалог для пользователя без изменения конфигурации; расчёт доступен только внутри этой обработки

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

Проверить корректность функции просто: при радиусе 1 площадь должна равняться π (примерно 3.14159), при радиусе 0 — нулю, при радиусе 10 — примерно 314.159. Этих трёх контрольных точек достаточно, чтобы убедиться, что формула записана правильно.

Частые ошибки в этой задаче: использование π = 3.14 с потерей точности; отсутствие обработки отмены ввода (значение Неопределено); попытка сложить число со строкой при выводе без преобразования — в 1С конкатенация числа со строкой выполняется неявно, но лучше использовать Строка(Площадь) или Формат() для предсказуемого результата.

Ещё одна типичная ситуация — функция объявлена в общем модуле без слова Экспорт, и вызов извне завершается ошибкой «Процедура или функция с указанным именем не определена». Проверяйте также флажки «Сервер» и «Вызов сервера» у общего модуля, если обращение идёт с клиента.

Типичные ошибки
01
π = 3.14 — заметная погрешность при больших радиусах; используйте минимум 3.14159
02
Нет проверки на Неопределено после диалога ввода — ошибка при нажатии «Отмена»
03
Нет проверки на отрицательный радиус — формула молча возвращает положительную площадь
04
Округление промежуточных результатов — накопление погрешности в цепочке расчётов
05
Функция в общем модуле без Экспорт — недоступна из других модулей
Контрольные точки

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

Радиус = 1
Норма

Площадь ≈ 3.14159

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

Любое другое значение — ошибка в формуле

Радиус = 0
Норма

Площадь = 0 без ошибок

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

Исключение или Неопределено

Отмена диалога ввода
Норма

Программа молча завершает работу

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

Ошибка выполнения или расчёт с пустым значением

Радиус = −5
Норма

Понятное сообщение о некорректном вводе

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

Возвращается площадь ≈ 78.54 как ни в чём не бывало

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

Есть ли в 1С встроенная константа числа π?

Нет, предопределённой константы π во встроенном языке нет. Значение задаётся литералом, например 3.14159265358979. Если константа нужна в нескольких местах, удобно объявить функцию ЧислоПи() в общем модуле и возвращать значение из одного места.

Можно ли выполнить этот код без изменения конфигурации?

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

Как вычислить площадь, если известен диаметр, а не радиус?

Разделите диаметр на два и передайте результат в ту же функцию: ПлощадьКруга(Диаметр / 2). Формулу S = π × D² / 4 тоже можно записать напрямую, но переиспользование одной функции снижает риск расхождений.

Почему ПоказатьВводЧисла не работает в моём коде?

Метод доступен только на клиенте и требует обработчика оповещения. Если вызов размещён в серверной процедуре (директива &НаСервере), код не скомпилируется. Перенесите диалог в клиентскую процедуру, а расчёт при необходимости вызывайте на сервере отдельно.

Как вывести результат с фиксированным числом знаков после запятой?

Используйте Формат(Площадь, "ЧДЦ=2") для строки с двумя знаками или Окр(Площадь, 2), если нужно округлить само число. Для отображения в поле формы достаточно настроить формат редактирования у реквизита.

Итог

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

Площадь круга в 1С считается формулой π × R² с литералом π и умножением радиуса самого на себя. Обязательно проверяйте ввод: отмену диалога (Неопределено), тип и отрицательные значения. Округляйте только итоговый результат, а переиспользуемый расчёт выносите в общий модуль с Экспорт.