Как построить график с несколькими показателями разного масштаба в 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки управленческих отчетов в среде 1С:Предприятие 7.7 программисты часто сталкиваются с задачей визуализации данных. Типичный пример: необходимо вывести на один график динамику продаж, где присутствуют два показателя — Сумма (исчисляемая тысячами или миллионами) и Количество (единицы или десятки). При попытке стандартного вывода линии графиков ведут себя некорректно: линия суммы отображается нормально, а линия количества «лежит» на нулевой отметке. Проанализируем, почему это происходит, и рассмотрим несколько способов решения данной проблемы.

Причина проблемы: ограничение вертикальной шкалы

Разберем ситуацию подробно. В платформе 1С 7.7 встроенный объект Диаграмма обладает существенным ограничением: он поддерживает только одну вертикальную ось (ось Y). Когда вы передаете в диаграмму значения разных порядков (например, сумму 500 000 и количество 10), система автоматически выстраивает масштаб шкалы таким образом, чтобы в нее поместилось максимальное значение. На фоне полумиллиона значение «10» составляет всего 0.002% от высоты графика, что визуально неотличимо от нулевой линии.

Рассмотрим стандартный, но проблемный код инициализации такой диаграммы:


Диаграмма.Обновление(0);
Диаграмма.Заголовок = "Продажи";
Диаграмма.УстановитьИмяСерии(1, "Сумма");
Диаграмма.УстановитьИмяСерии(2, "Количество");
А = 1;
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    Диаграмма.УстановитьИмяТочки(А, ТЗ.ВремяЧека);
    Диаграмма.УстановитьЗначение(А, 1, ТЗ.Сумма); 
    Диаграмма.УстановитьЗначение(А, 2, ТЗ.Количество); // Значение слишком мало для общей шкалы
    А = А + 1;
КонецЦикла;
Диаграмма.Обновление(1);

Решение 1: Искусственное масштабирование (метод коэффициента)

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

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

Рассмотрим пример реализации с коэффициентом:


Коэффициент = 1000; // Подбирается динамически или фиксированно
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    Диаграмма.УстановитьИмяТочки(А, ТЗ.ВремяЧека);
    // Сумму выводим как есть
    Диаграмма.УстановитьЗначение(А, 1, ТЗ.Сумма, СокрЛП(ТЗ.Сумма));
    // Количество масштабируем для визуализации, но в подписи оставляем реальное число
    Диаграмма.УстановитьЗначение(А, 2, ТЗ.Количество * Коэффициент, СокрЛП(ТЗ.Количество));
    А = А + 1;
КонецЦикла;

Важный нюанс: при использовании этого метода в легенде или заголовке стоит указать, что показатель «Количество» отображается в масштабе (например, «Количество (x1000)»).

Решение 2: Нормирование данных (процентное отношение)

Проанализируем другой подход, который часто применяется в бизнес-аналитике. Вместо того чтобы пытаться отобразить абсолютные значения, мы можем перевести их в проценты от максимума. В этом случае обе кривые будут колебаться в диапазоне от 0 до 100, что позволит наглядно сравнить их динамику и корреляцию.

Выполним следующие шаги для реализации этого метода:

  1. Найдем максимальное значение суммы и максимальное количество в таблице значений.
  2. В цикле заполнения диаграммы разделим текущее значение на найденный максимум и умножим на 100.
  3. В качестве текстовой подписи выведем оригинальное значение.

МаксСумма = ТЗ.Итог("Сумма"); // Для более точного масштаба лучше найти именно Макс(), а не Итог()
МаксКол = ТЗ.Итог("Количество"); 
// Допустим, мы заранее нашли МаксСумма и МаксКол через перебор ТЗ

ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ЗначСумма = ?(МаксСумма = 0, 0, (ТЗ.Сумма / МаксСумма) * 100);
    ЗначКол = ?(МаксКол = 0, 0, (ТЗ.Количество / МаксКол) * 100);
    
    Диаграмма.УстановитьЗначение(А, 1, ЗначСумма, Строка(ТЗ.Сумма));
    Диаграмма.УстановитьЗначение(А, 2, ЗначКол, Строка(ТЗ.Количество));
    А = А + 1;
КонецЦикла;

Решение 3: Разделение на две диаграммы

Если требования к отчету позволяют, рассмотрим вариант размещения двух объектов Диаграмма на одной печатной форме или форме обработки. Расположив их одну над другой, мы решим проблему масштабирования в корне: у каждого графика будет своя независимая шкала. Это наиболее «чистый» с точки зрения математики способ, так как он не искажает визуальное представление данных.

Технические советы по оптимизации

Работая с объектом Диаграмма в 1С 7.7, необходимо помнить о производительности. Посмотрим на методы управления обновлением:

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

Альтернативные варианты (ActiveX и Excel)

Для продвинутых задач, когда требуется полноценная поддержка двух осей Y или логарифмическая шкала, возможностей штатной диаграммы 7.7 будет недостаточно. В таких случаях программисты применяют следующие инструменты:

  1. Внешние компоненты (MSChart): Использование системных библиотек Windows через механизмы ActiveX.
  2. Выгрузка в Excel: Самый популярный способ формирования сложной отчетности. Через СоздатьОбъект("Excel.Application") выгружаем данные в таблицу, а затем программно строим график в Excel, используя все его мощные средства визуализации.

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

← На главную