Одной из интересных и полезных задач в разработке на платформе 1С:Предприятие 8.3 является визуализация данных, не связанных напрямую с объектами базы данных. Построение математических графиков (например, парабол, синусоид или сложных тяговых характеристик) требует понимания работы с объектом Диаграмма и умения программно манипулировать её сериями и точками. В этой статье мы подробно разберем, как позволить пользователю ввести произвольную формулу и превратить её в наглядный график в управляемом интерфейсе.
Перед началом реализации важно определиться с инструментом. Рассмотрим два основных пути:
Для решения задачи, описанной в теме форума, возможностей стандартной диаграммы 1С вполне достаточно. Разберем пошагово, как это реализовать.
Для начала создадим новую обработку и добавим на её управляемую форму реквизит Диаграмма с типом Диаграмма. Разместим его на форме. Также нам понадобятся реквизиты:
МатематическаяФормула (Тип: Строка) — здесь пользователь напишет, например, "x * x + 1".НачалоДиапазона и КонецДиапазона (Тип: Число) — пределы по оси X.Шаг (Тип: Число) — точность графика (чем меньше шаг, тем более гладкой будет линия).В свойствах элемента формы Диаграмма установим тип диаграммы как График или Точечная. Точечная диаграмма более предпочтительна для математических функций, так как она корректно отображает зависимости, где значения X могут идти с произвольным шагом.
Рассмотрим ситуацию, когда нам нужно программно сформировать график. В 1С диаграмма состоит из Серий (линии графика) и Точек (значения по оси абсцисс). Разберем основной код процедуры, которая будет выполняться на сервере:
&НаСервере
Процедура ПостроитьГрафикНаСервере()
// Очищаем диаграмму перед новым построением
Диаграмма.Очистить();
Диаграмма.Обновление = Ложь; // Отключаем перерисовку для ускорения
// Создаем серию (саму линию графика)
НоваяСерия = Диаграмма.Серии.Добавить("График функции");
ТекущийX = НачалоДиапазона;
Пока ТекущийX <= КонецДиапазона Цикл
// Формируем строку для вычисления, заменяя "x" на конкретное число
// Важно: Число нужно преобразовать в строку без разделителей групп разрядов
СтрЗначениеX = Формат(ТекущийX, "ЧРД=.; ЧГ=0");
СтрокаВычисления = СтрЗаменить(МатематическаяФормула, "x", СтрЗначениеX);
Попытка
// Используем функцию Вычислить() для исполнения строки как кода
РезультатY = Вычислить(СтрокаВычисления);
// Устанавливаем точку на оси X
НоваяТочка = Диаграмма.УстановитьТочку(ТекущийX);
// Задаем значение Y для этой точки в нашей серии
Диаграмма.УстановитьЗначение(НоваяТочка, НоваяСерия, РезультатY);
// Добавим текст всплывающей подсказки (координаты)
Диаграмма.УстановитьЗначение(НоваяТочка, НоваяСерия, РезультатY, , "X: " + ТекущийX + " Y: " + РезультатY);
Исключение
// Если функция не определена в этой точке (например, деление на ноль) - пропускаем
КонецПопытки;
ТекущийX = ТекущийX + Шаг;
КонецЦикла;
Диаграмма.Обновление = Истина; // Включаем перерисовку обратно
КонецПроцедуры
Проанализируем важный нюанс: пользователь привык писать формулы в математическом виде, например, x^2, в то время как 1С понимает функцию Pow(x, 2). Чтобы программа не выдавала ошибку, нам нужно выполнить предварительную замену символов перед вызовом Вычислить().
Рассмотрим пример функции-обработчика:
Функция ПодготовитьФормулуДля1С(ИсходнаяФормула)
Результат = ИсходнаяФормула;
Результат = СтрЗаменить(Результат, "^", ","); // Часть подготовки для Pow
// Здесь можно добавить более сложную логику замены x^y на Pow(x,y)
// А также замену математических констант и функций:
Результат = СтрЗаменить(Результат, "sin", "Sin");
Результат = СтрЗаменить(Результат, "cos", "Cos");
Возврат Результат;
КонецФункции
Важно: Использование функции Вычислить() со строкой, введенной пользователем, является потенциально опасным (инъекция кода). В реальных задачах рекомендуется проверять строку на наличие опасных слов вроде УдалитьОбъекты или Запрос.
Выясним, как выполнить требования пользователя по отображению конкретных значений. В свойствах диаграммы можно включить Отображение подсказок. В коде выше мы использовали пятый параметр метода УстановитьЗначение, чтобы задать текст этой подсказки. Теперь при наведении мышки на график пользователь увидит точные координаты точки.
Для настройки пределов осей программно используются следующие свойства:
Диаграмма.ОсьЗначений.МинимальноеЗначение — фиксирует нижний предел Y.Диаграмма.ОсьЗначений.МаксимальноеЗначение — фиксирует верхний предел Y.Диаграмма.ОсьЗначений.АвтоОпределениеДиапазона = Ложь — позволяет задать границы вручную.Чтобы график не выглядел как набор угловатых отрезков, проанализируем свойство Сглаживание. В управляемом приложении у объекта Диаграмма можно установить режим сглаживания кривых. Это превратит ломаную линию в плавную математическую кривую, что значительно улучшит визуальное восприятие.
Рассмотрим пример включения сглаживания в коде:
Диаграмма.ВидПодписей = ВидПодписейКДиаграмме.Текст;
Диаграмма.Сглаживание = Истина; // Только для определенных типов диаграмм
Мы разобрали, что построение математического графика в 1С — это процесс перевода абстрактной формулы в массив конкретных точек. Основной секрет успеха заключается в использовании цикла Пока или Для, методе Вычислить() для динамического расчета y(x) и правильной настройке объекта Диаграмма. Используя этот подход, вы сможете создавать мощные аналитические инструменты внутри ваших конфигураций.