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

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

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

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

Анализ типичных ошибок при работе с диаграммой

Рассмотрим ситуацию: у нас есть переменная КолПО, в которой хранится количество правильных ответов, полученное в ходе выполнения теста. Автор темы пытался построить запрос к справочнику Ответы, чтобы заполнить диаграмму. Разберем, почему это не совсем верно, и проанализируем ошибки в коде.

Во-первых, запрос к справочнику Справочник.Ответы вернет информацию о всех записях, хранящихся в базе данных. Если в справочнике 100 ответов для разных тестов, диаграмма попытается отобразить их все, в то время как нам нужны данные только по текущему сеансу пользователя.

Во-вторых, в коде часто встречаются синтаксические опечатки. Посмотрим на пример некорректного кода:


Диаграмма.УстановитьЗначение(Точка, Серия, ВыборкаПравильныйОтвет., Серия.Расшифровка);

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

Пошаговое решение: программное заполнение диаграммы

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

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

  1. Точка — в круговой диаграмме это обычно один объект, представляющий весь "пирог".
  2. Серии — это части (сектора) круга. В нашем случае будет две серии: "Правильно" и "Ошибка".
  3. Значения — числовые показатели для каждой серии.

Разберем алгоритм реализации в процедуре на сервере:


&НаСервере
Процедура ВывестиРезультатыНаДиаграмме(КолПравильных, ВсегоВопросов)
    
    // Получаем объект диаграммы из реквизита формы
    ТекущаяДиаграмма = ЭтаФорма.Диаграмма;
    
    // Запрещаем обновление для ускорения работы и предотвращения мерцания
    ТекущаяДиаграмма.Обновление = Ложь;
    ТекущаяДиаграмма.Очистить();
    
    // 1. Создаем одну точку. Для круговой диаграммы этого достаточно.
    ТочкаРезультат = ТекущаяДиаграмма.Точки.Добавить("РезультатТеста");
    ТочкаРезультат.Текст = "Статистика ответов";
    
    // 2. Создаем серию для правильных ответов
    СерияПравильно = ТекущаяДиаграмма.Серии.Добавить("Правильно");
    СерияПравильно.Текст = "Правильно";
    СерияПравильно.Цвет = WebЦвета.Зеленый; // Назначаем наглядный цвет
    
    // 3. Создаем серию для неправильных ответов
    КолОшибок = ВсегоВопросов - КолПравильных;
    СерияОшибка = ТекущаяДиаграмма.Серии.Добавить("Ошибка");
    СерияОшибка.Текст = "Ошибки";
    СерияОшибка.Цвет = WebЦвета.ОгнеупорныйКирпич;
    
    // 4. Устанавливаем значения в диаграмму
    ТекущаяДиаграмма.УстановитьЗначение(ТочкаРезультат, СерияПравильно, КолПравильных);
    ТекущаяДиаграмма.УстановитьЗначение(ТочкаРезультат, СерияОшибка, КолОшибок);
    
    // Настраиваем внешний вид
    ТекущаяДиаграмма.ТипДиаграммы = ТипДиаграммы.Круговая;
    ТекущаяДиаграмма.ОбластьПостроения.ОтображатьПодписи = Истина;
    
    // Разрешаем обновление
    ТекущаяДиаграмма.Обновление = Истина;
    
КонецПроцедуры

Настройка динамического изменения количества вопросов

Проанализируем ситуацию, когда количество вопросов в тесте может меняться (удаляться или добавляться). Чтобы диаграмма всегда оставалась актуальной, не следует жестко прописывать число 22 в коде. Нам нужно динамически получать общее количество вопросов из справочника.

Посмотрим на пример функции, которая вычисляет актуальное количество вопросов:


&НаСервереБезКонтекста
Функция ПолучитьОбщееКоличествоВопросов()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Всего ИЗ Справочник.Вопросы";
    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда
        Возврат Результат.Всего;
    КонецЕсли;
    Возврат 0;
КонецФункции

Использование этой функции при завершении теста позволит корректно рассчитать сектор "Ошибки", даже если состав теста изменился за время его прохождения.

Улучшение визуализации: легенда и подписи

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

Проанализируем, как это реализовать в коде для лучшей читаемости:


// Включаем отображение подписей непосредственно на секторах диаграммы
ТекущаяДиаграмма.ОбластьПостроения.ТипПодписейАдресныхДанных = ТипПодписейДиаграммы.ТекстИПроцент;
ТекущаяДиаграмма.ОтображатьЛегенду = Истина;

Использование Таблицы Значений (альтернативный способ)

Если вы привыкли работать с табличными данными, рассмотрим еще один способ заполнения диаграммы — через ИсточникДанных. Это особенно полезно, если логика подсчета сложная (например, учитываются веса вопросов или категории сложности).

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

  1. Создаем объект ТаблицаЗначений.
  2. Добавляем колонки: "Категория" (строка) и "Количество" (число).
  3. Заполняем таблицу строками (Правильно/Неправильно).
  4. Привязываем таблицу к диаграмме.

ТЗ_Результаты = Новый ТаблицаЗначений;
ТЗ_Результаты.Колонки.Добавить("ТипОтвета", Новый ОписаниеТипов("Строка"));
ТЗ_Результаты.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"));

НоваяСтрока = ТЗ_Результаты.Добавить();
НоваяСтрока.ТипОтвета = "Верно";
НоваяСтрока.Число = КолПО;

НоваяСтрока = ТЗ_Результаты.Добавить();
НоваяСтрока.ТипОтвета = "Неверно";
НоваяСтрока.Число = ОбщееКол - КолПО;

// Привязываем данные
ТекущаяДиаграмма.ИсточникДанных = ТЗ_Результаты;

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

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

← На главную