Универсальный механизм построения диаграмм в 1С: Предприятие 7.7
диаграмма 1С конфигурирование 1С:Предприятие 7.7 универсальный механизм таблица значений построение
Недавно пришлось в рамках одного отчета строить довольно большое количество диаграмм, в итоге я пришел к универсальному механизму формирования диаграммы на основе таблицы значений.
Суть проблемы заключается в том, что формирование диаграммы происходит в своего рода процедуре обратного вызова. Когда в одном отчете диаграмм может быть множество всяких разных, то эта самая процедура может весьма "разбухнуть", да и с получением данных могут возникнуть проблемы. К счастью, в 1С: Предприятии есть объект ТаблицаЗначений, который нас в данном случае и выручит, ведь большинство видов диаграмм строится на основе табличных данных.
В 1С при построении диаграмм используются такие термины, как "серии" и "точки". Понятие серии в данном случае совпадает с "рядом данных" в Excel, ну а "точки" - это, скажем так, значения оси Х, или просто "значения" в терминах Excel. Так вот, чтобы механизм был более-менее универсальным, условимся, что таблица значений имеет следующую структуру: первая колонка - наименование серии, последующие колонки - это значения точек, причем заголовок колонки и будет являться наименованием точки. Ну а для заполнения таблицы значений существует множество методов, например, для реализации неких алгоритмов в цикле хорошо использовать метод УстановитьЗначение(<Строка>,<Колонка>,<Знач>)
. Однако формирование таблицы значений мы в рамках данной статьи оставим все же за кадром и сосредоточимся на выводе диаграммы. Допустим также, что перед диаграммой необходимо выводить таблицу, по которой эта самая диаграмма построена.
Начнем с "рисования" макета. Укажем ячейки с основным и дополнительным заголовками диаграммы (пусть для определенности это будут выражения ЗаголовокДиаграммы и ЗагДополн) и нарисуем таблицу из 4х ячеек. В первой ячейке можно написать, например, "Серия / Точка", во 2-м столбце первой строки - выражение НаименованиеТочки, во 2-й строке 1-го столбца - выражение НаименованиеСерии, и, наконец, в последней ячейке - выражение Значение. Определим горизонтальные секции: "Шапка", куда войдут заголовки и первая строка таблицы, и "Серия" - вторая строка таблицы. Определим вертикальные секции - "Боковик", куда войдет 1-й столбец таблицы, и "Точка", содержащая второй столбец таблицы.
Вставим в макет диаграмму. По умолчанию вставляется гистограмма с легендой, что лично меня устраивает, но, разумеется, можно выбрать и другое представление, а также поднастроить внешний вид. Заключим диаграмму в горизонтальную секцию "Гистограмма". В свойствах диаграммы (имеется в виду 1С-ное диалоговое окно "Свойства рисунка", а не всякого рода настройки диаграммы как OLE-объекта) на закладке текст в поле ввода введем:
СформироватьДиаграмму(Таб.ТекущийОбъект, Параметры)
Т.е. вызываем процедуру, которая будет непосредственно рисовать диаграмму. Второй параметр ("Параметры") как раз и будет представлять собой таблицу значений.
Примерный вид макета приведен на рисунке:
Что ж, переходим к коду. Первым делом напишем процедуру обратного вызова СформироватьДиаграмму
. В ней мы в соответствии с размером таблицы значений устанавливаем количество серий и точек, и в цикле по строкам и столбцам таблицы значений заполняем диаграмму, учитывая, что в первой колонке таблицы значений содержится наименование серии, а наименование точки необходимо получить из заголовка колонки. Используем следующие методы объекта Диаграмма
:
КоличествоСерий
- устанавливаем количество серий;КоличествоТочек
- устанавливаем количество точек;УстановитьИмяСерии
- назначаем имя серии;УстановитьИмяТочки
- аналогично;УстановитьЗначение
- основной метод, собственно говоря, указываем, какое значение соответствует комбинации серия/точка.
Также мы используем следующие методы объекта ТаблицаЗначений
:
КоличествоСтрок
,КоличествоКолонок
- получение размера таблицы;ПолучитьЗначение
- получение значения из таблицы значений по номеру строки и колонки;ПолучитьПараметрыКолонки
- с помощью этого метода мы в данном случае узнаем заголовок колонки, это один из необязательных параметров метода.
Процедура СформироватьДиаграмму(Диаграмма, Параметры) Диаграмма.Обновление(0); // Устанавливаем количество серий и точек КолСтрок = Параметры.КоличествоСтрок(); КолКолонок = Параметры.КоличествоКолонок(); Диаграмма.КоличествоСерий(КолСтрок); Диаграмма.КоличествоТочек(КолКолонок-1); // Цикл по значениям таблицы Для Сч = 1 По КолСтрок Цикл Диаграмма.УстановитьИмяСерии(Сч, СокрЛП(Параметры.ПолучитьЗначение(Сч, 1))); Для Сч2 = 2 По КолКолонок Цикл Если Сч = 1 Тогда НаименованиеТочки = ""; // Наименование точки возьмем из заголовка колонки Параметры.ПолучитьПараметрыКолонки(Сч2, , , , НаименованиеТочки); Диаграмма.УстановитьИмяТочки(Сч2 - 1, НаименованиеТочки); КонецЕсли; Диаграмма.УстановитьЗначение(Сч2 - 1, Сч, Параметры.ПолучитьЗначение(Сч, Сч2)); КонецЦикла; КонецЦикла; Диаграмма.Обновление(1); КонецПроцедуры
Далее напишем процедуру для вывода таблицы с "расшифровкой" диаграммы. Здесь аналогичным образом нам понадобится метод ПолучитьПараметрыКолонки
объекта ТаблицаЗначений
, цикл по ее строкам и столбцам и метод ПолучитьЗначение
. Процедура выглядит следующим образом:
Процедура ВывестиРасшифровкуДиаграммы(Таб, ЗаголовокДиаграммы, ЗагДополн, Параметры) Таб.ВывестиСекцию("Шапка|Боковик"); Для Сч2 = 2 По Параметры.КоличествоКолонок() Цикл НаименованиеТочки = ""; Параметры.ПолучитьПараметрыКолонки(Сч2, , , , НаименованиеТочки); Таб.ПрисоединитьСекцию("Шапка|Точка"); КонецЦикла; Для Сч = 1 По Параметры.КоличествоСтрок() Цикл НаименованиеСерии = СокрЛП(Параметры.ПолучитьЗначение(Сч, 1)); Таб.ВывестиСекцию("Серия|Боковик"); Для Сч2 = 2 По Параметры.КоличествоКолонок() Цикл Значение = Параметры.ПолучитьЗначение(Сч, Сч2); Таб.ПрисоединитьСекцию("Серия|Точка"); КонецЦикла; КонецЦикла; КонецПроцедуры
Параметры процедуры ЗаголовокДиаграммы
и ЗагДополн
в явном виде в ней не используются, но эти выражения используются в макете таблицы.
Собственно говоря, осталось всему этому делу "скормить" таблицу значений. Для примера я сделал поиск по картинкам (запрос "диаграмма"), и почти сразу же наткнулся на некую динамику стоимости жилья. Собственно, за май и июнь цифры я взял из статьи, а за июль "аппроксимировал".
Процедура Сформировать
для нашего примера выглядит совсем уж простой. Как обычно, инициализируем табличный документ, создаем таблицу значений, вызываем процедуру вывода расшифровки диаграммы, выводим секцию с гистограммой и показываем табличный документ на экране.
Процедура Сформировать() Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Таб.Опции(0,0,0,0); Параметры = СоздатьОбъект("ТаблицаЗначений"); Параметры.НоваяКолонка("Серия", "Строка", 100); Параметры.НоваяКолонка("Алмалинский", "Число", 10); Параметры.НоваяКолонка("Бостандыкский", "Число", 10); Параметры.НоваяКолонка("Жетысуский", "Число", 10); Параметры.НоваяКолонка("Турксибский", "Число", 10); Параметры.НоваяСтрока(); Параметры.Серия = "май"; Параметры.Алмалинский = 3739; Параметры.Бостандыкский = 3922; Параметры.Жетысуский = 3476; Параметры.Турксибский = 2790; Параметры.НоваяСтрока(); Параметры.Серия = "июнь"; Параметры.Алмалинский = 3805; Параметры.Бостандыкский = 3852; Параметры.Жетысуский = 3438; Параметры.Турксибский = 2859; Параметры.НоваяСтрока(); Параметры.Серия = "июль"; Параметры.Алмалинский = 3853; Параметры.Бостандыкский = 3786; Параметры.Жетысуский = 3398; Параметры.Турксибский = 2927; ВывестиРасшифровкуДиаграммы(Таб, "Динамика стоимости жилья по районам", "За период май - июль 2007 года", Параметры); Таб.ВывестиСекцию("Гистограмма"); Таб.ТолькоПросмотр(1); Таб.Показать("Динамика стоимости жилья"); КонецПроцедуры
Ну а результат показан на рисунке:
Вот, пожалуй, и все!
Приложение к статье - внешняя обработка с построенной диаграммой.
Категория: Программирование, веб | Опубликовано 31.10.2010 | Редакция от 20.01.2017
Похожие материалы
Особенности распределения Комплексной конфигурации 4.5 (для 1С 7.7)
В этой заметке предлагается способ избежать длительной первичной синхронизации Комплексной конфигурации после ее преобразования в распределенную (во всяком случае, это наблюдалось в релизе 7.70.459).
1С Управление торговлей 10.3. Ошибка при печати этикеток: V8 - не хватает памяти
Очень простое решение неочевидной проблемы с нехваткой памяти при печати этикеток. В моем случае - 1С: Предприятие 8.1, Управление торговлей 10.3, Windows 7 (или 8) x64, принтер этикеток Godex EZ-DT-2.
Максимальная длина строкового реквизита 1С: Предприятия 8
Как узнать длину строкового реквизита, указанную в конфигураторе, на примере дополнения числа ведущими нулями.
Проверка типа ссылки в запросах 1С: Предприятия 8
Очередная краткая заметка по не вполне очевидному оператору языка запросов 1С: Предприятия 8.
Позиционирование табличного поля в 1С: Предприятии 8
Рассматривается случай, когда после заполнения табличного поля нужно было выбрать определенную строку.
Таймер в 1С: Предприятии 8
Как выполнить какой-либо программный код спустя определенное время (разово), либо регулярно через определенные промежутки времени.