Как реализовать построение графика по заданной математической функции в управляемом приложении 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Выбор инструмента: Диаграмма или Поле HTML?

Перед началом реализации важно определиться с инструментом. Рассмотрим два основных пути:

  1. Стандартный объект «Диаграмма»: Это встроенный элемент управления 1С. Он отлично подходит для большинства задач, поддерживает интерактивность (всплывающие подсказки при наведении на точку) и легко настраивается через свойства в конфигураторе. Именно этот метод мы разберем как основной.
  2. Поле HTML-документа: Позволяет интегрировать внешние JavaScript-библиотеки (например, Chart.js или Google Charts). Этот метод сложнее в реализации, так как требует передачи данных через JSON и написания скриптов, но он дает практически безграничные возможности по кастомизации дизайна.

Для решения задачи, описанной в теме форума, возможностей стандартной диаграммы 1С вполне достаточно. Разберем пошагово, как это реализовать.

Шаг 1. Подготовка формы и объекта Диаграмма

Для начала создадим новую обработку и добавим на её управляемую форму реквизит Диаграмма с типом Диаграмма. Разместим его на форме. Также нам понадобятся реквизиты:

В свойствах элемента формы Диаграмма установим тип диаграммы как График или Точечная. Точечная диаграмма более предпочтительна для математических функций, так как она корректно отображает зависимости, где значения X могут идти с произвольным шагом.

Шаг 2. Алгоритм расчета точек и серий

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


&НаСервере
Процедура ПостроитьГрафикНаСервере()
    
    // Очищаем диаграмму перед новым построением
    Диаграмма.Очистить();
    Диаграмма.Обновление = Ложь; // Отключаем перерисовку для ускорения
    
    // Создаем серию (саму линию графика)
    НоваяСерия = Диаграмма.Серии.Добавить("График функции");
    
    ТекущийX = НачалоДиапазона;
    
    Пока ТекущийX <= КонецДиапазона Цикл
        
        // Формируем строку для вычисления, заменяя "x" на конкретное число
        // Важно: Число нужно преобразовать в строку без разделителей групп разрядов
        СтрЗначениеX = Формат(ТекущийX, "ЧРД=.; ЧГ=0");
        СтрокаВычисления = СтрЗаменить(МатематическаяФормула, "x", СтрЗначениеX);
        
        Попытка
            // Используем функцию Вычислить() для исполнения строки как кода
            РезультатY = Вычислить(СтрокаВычисления);
            
            // Устанавливаем точку на оси X
            НоваяТочка = Диаграмма.УстановитьТочку(ТекущийX);
            
            // Задаем значение Y для этой точки в нашей серии
            Диаграмма.УстановитьЗначение(НоваяТочка, НоваяСерия, РезультатY);
            
            // Добавим текст всплывающей подсказки (координаты)
            Диаграмма.УстановитьЗначение(НоваяТочка, НоваяСерия, РезультатY, , "X: " + ТекущийX + " Y: " + РезультатY);
            
        Исключение
            // Если функция не определена в этой точке (например, деление на ноль) - пропускаем
        КонецПопытки;
        
        ТекущийX = ТекущийX + Шаг;
        
    КонецЦикла;
    
    Диаграмма.Обновление = Истина; // Включаем перерисовку обратно

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

Шаг 3. Обработка пользовательского ввода (Парсинг)

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

Рассмотрим пример функции-обработчика:


Функция ПодготовитьФормулуДля1С(ИсходнаяФормула)
    Результат = ИсходнаяФормула;
    Результат = СтрЗаменить(Результат, "^", ","); // Часть подготовки для Pow
    // Здесь можно добавить более сложную логику замены x^y на Pow(x,y)
    // А также замену математических констант и функций:
    Результат = СтрЗаменить(Результат, "sin", "Sin");
    Результат = СтрЗаменить(Результат, "cos", "Cos");
    Возврат Результат;
КонецФункции

Важно: Использование функции Вычислить() со строкой, введенной пользователем, является потенциально опасным (инъекция кода). В реальных задачах рекомендуется проверять строку на наличие опасных слов вроде УдалитьОбъекты или Запрос.

Шаг 4. Настройка осей и интерактивности

Выясним, как выполнить требования пользователя по отображению конкретных значений. В свойствах диаграммы можно включить Отображение подсказок. В коде выше мы использовали пятый параметр метода УстановитьЗначение, чтобы задать текст этой подсказки. Теперь при наведении мышки на график пользователь увидит точные координаты точки.

Для настройки пределов осей программно используются следующие свойства:

Дополнительные возможности: Сглаживание

Чтобы график не выглядел как набор угловатых отрезков, проанализируем свойство Сглаживание. В управляемом приложении у объекта Диаграмма можно установить режим сглаживания кривых. Это превратит ломаную линию в плавную математическую кривую, что значительно улучшит визуальное восприятие.

Рассмотрим пример включения сглаживания в коде:


Диаграмма.ВидПодписей = ВидПодписейКДиаграмме.Текст;
Диаграмма.Сглаживание = Истина; // Только для определенных типов диаграмм

Резюме

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

← На главную