Вывод диаграмм в табличный документ и связанные с этим проблемы

Как я учился выводить диаграммы в табличный документ и какие проблемы при этом пришлось решать.

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

И вот оно наступило – время диаграмм. Я сейчас работаю в инвестиционной компании, которая занимается в том числе доверительным управлением средствами клиентов. Клиенты разные: от больших НПФ до частных инвесторов, которые  хотят выгодно вложить свои 2-3 миллиона рублей. Надо сказать, что при таком инвестировании можно получить доход выше процентной ставки по банковским депозитам даже при осторожной стратегии. Впрочем, можно и почти ничего не выиграть. Но если Вам нужно получить доход за небольшой срок (год-два), уходить для этого в недвижимость или золото навряд ли стоит.

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

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

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

Каждый табличный документ содержит коллекцию Рисунки. В нее могут входить как статические рисунки (логотипы,пиктограммы,  фотографии), так и диаграммы. В случае диаграммы у элемента коллекции Рисунок проинициализировано свойство Объект типа Диаграмма. Важно отметить, что если вы формируете  табличный документ путем последовательного вывода в него областей макета с диаграммами, никакого простого способа найти нужную диаграмму в итоговом документе не существует: индекс и имя рисунка всякий раз могут меняться при выводе области в документ, остается лишь искать по свойствам Объекта, например, Заголовок или ТипДиаграммы.

В Excel диаграмма 1С выгружается в виде рисунка.

Обычно диаграммы вставляются в макет отчета, настраиваются их свойства, а затем при выводе отчета программно формируются значения диаграммы. В этой статье не рассматривается вывод диаграмм в отчет с использованием СКД, там есть свои плюсы и минусы.

 Каждая диаграмма имеет тип (круговая, гистограмма, график и т.д.).  А отрисовывается она благодаря установке значений,  связанных с точками и сериями. Серии и точки (элементы коллекций Серии и Точки) можно задать сразу в Конфигураторе, это удобно, когда количество строго ограничено рамками задачи и/или необходимо жестко задать цвет, текст и некоторые другие параметры.

Кстати, при «кликании» на диаграмму в макете у вас может открыться окно свойств области построения диаграммы. Кликните еще раз – и у вас откроется окно свойств объекта Диаграмма.

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

Вырожденные случаи: в круговой диаграмме много серий, но одна точка, а гистограмму или график вполне можно построить по одной серии, но по нескольким точкам.

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

Например,

 

Если Область1.Рисунки[0].Объект.Точки.Количество()< Инд Тогда

                Область1.Рисунки[0].Объект.Точки.Добавить();

КонецЕсли;      

 Область1.Рисунки[0].Объект.Точки[Инд-1].Текст=”Февраль”;

 

А чтобы задать значение диаграммы, применяется метод УстановитьЗначение(), в который передаются индекс точки, индекс серии и собственно значение. Обычно этот метод вызывается в цикле обхода  таблицы значений или выборки запроса.

 Итак, нам надо нарисовать вот такую диаграмму:

 

Проблема 1:  1С не умеет изменять наклон подписей шкалы. Можно размещать подписи либо горизонтально, либо вертикально.  Делаем вертикально.

Проблема 2 (более серьезная): мне неизвестен способ заставить 1С добавлять символ процента к значениям точек и легенде шкалы. Настройка везде идет через строку формата, а платформа не позволяет использовать в форматной строке числа произвольный символ. Объект Диаграмма позволяет работать с процентами, но только при анализе соотношения значений по сериям. Если серия одна, то выбирать способ вывода значений в процентах бессмысленно. Что ж, добавляем в заголовок примечание (в %).

Переходим к следующей диаграмме:

 

Проблема 3. Первое, что бросается в глаза – пунктирное приращение на накопительной гистограмме в последней точке. Так 1С строить диаграммы не умеет, поэтому нам придется придумать для последней серии свой цвет фона.

Проблема 4. Кроме того, цвет подписи значений на диаграмме разный – для серии 1 он белый, для серии 2 он черный. Так 1С тоже не умеет. Придется использовать всюду белый цвет.

Обратите внимание – шкала ординат начинается со значения 307. Это сделано для того, чтобы наглядно увидеть приращение активов. Потому что если выводить шкалу с нуля, то сверху каждого столбика мы увидем малюсенькую полоску приращения, она ведь чуть более процента от значения по Серии 1.

Проблема 5. Казалось бы, у объекта Диаграмма есть свойство МинимальноеЗначение и никто нам не мешает его установить.  Устанавливаем. Упс. Выясняется, что для гистограмм оно не работает. Жаль. Но есть свойство БазовоеЗначение. Устанавливаем его в 307 и получаем то, что нужно.

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

 

Мне не удалось найти способ выводить накопительную гистограмму в нормализованном относительно минимального значения виде. После общения с разработчиками выснилось, что действительно, базовое значение считается всегда относительно Серия 1. Получается, что статическое задание серий в Конфигураторе — практически бесполезная фича, нужно программно анализировать значения серий перед выводом гистограммы и переназначать как Серия 1 ту, которая в первой точке имеет максимальное значение.

На партнерской конференции этот вопрос (неработающие свойства Минимальное и МаксимальноеЗначение) поднимался неоднократно, но воз и ныне там. Возможно не хватает настойчивости пользователей, которые довольно редко работают с диаграммами в 1С.

Почему редко? Потому что следующая ошибка ясно показала, насколько серьезные баги встречаются в механизме диаграмм 1С. Будь такого уровня баг в механизме расчета зарплаты или при работе СКД – его бы в момент вычислили.

Воспроизводится он очень просто.

Проблема 6. Делаем макет из нескольких горизонтальных секций. В каждой помещаем 2-3 диаграммы. Все это выводим в табличный документ, заполняя значения диаграмм программно. И вдруг видим, что исчезают подписи к горизонтальной шкале одной из диаграмм. В отладчике видим, что в заполненной области макета имена точек есть, но после выполнения метода

ТабДок.Вывести(Область1);

в ТабДок попадает диаграмма уже без имен точек. Ошибка «гуляет» от диаграммы к диаграмме, но воспроизводится стабильно. По крайней мере, на релизе 8.2.17.

Пришлось написать кусок кода, который повторно обходит Рисунки в итоговом табличном документе и устанавливает правильные имена точек. Чем-то напоминает древний баг платформы 7, когда значение переменной присваивалось только со второго-третьего раза.

Проблема 7.

Невозможно вывести в Excel прозрачную диаграмму 1С. У диаграммы 1С есть свойство «Прозрачный фон» и его можо использовать при выводе в табличный документ. Но при экспорте в Excel диаграммы 1С заменяются на картинки, причем непрозрачные.

Пытался средствами 1С произвести подмену диаграммы прозрачной картинкой. У диаграммы есть метод ПолучитьКартинку().
Далее через выгружал BMP-файл в двоичные данные (можно в файл)
и создавал конструктором новый объект Картинка. Если при создании картинки из источника установить второй параметр в Истина, то рисунок превратится в прозрачный. А прозрачный рисунок можно экспортировать в Excel, если РазмерРисунка=ИзменятьПропорционально.

Но вот незадача — подобная конвертация сильно искажает исходную диаграмму и практического смысла не имеет:

 

 

Но в целом инструмент полезный и довольно многофункциональный. Не ленитесь его использовать – и ваши отчеты будут выглядеть очень наглядно.

 


 

Что касается решения моей конкретной задачи, то в итоге я взял, да и нарисовал все диаграммы прямо в Excel. И все получилось.

Библиотеку отрисовки диаграмм в Excel вы можете взять из моей статьи тут:  

 //infostart.ru/public/203481/

 

 

 

13 Comments

  1. bulpi

    А еще я ни разу не смог заставить 1с правильно построить диаграмму по источнику данных — таблице значений. Там логический баг, ИМХО. У кого-то получалось ?

    Reply
  2. vis_tmp

    А можно ли построить график такого вида?

    http://savepic.su/3460493.png

    На картинке выделены пустые область, т.е. шкала всегда 12 месяцев, к примеру, а данные показываем не за все месяцы, а только за часть из них.

    С 3 по 10, к примеру.

    Такое возможно сделать?

    Reply
  3. Сисой

    Если бы не было подписей, то можно было бы добавить фиктивную сeерию нужной размерности и установить для неё цвет фона. А то, что Вы хотите, возможно только в excel. Кстати, через неделю опубликую библиотеку отрисовки диаграмм из 1с в excel.

    Reply
  4. vis_tmp

    (3) неделя уже прошла? )

    Reply
  5. Сисой

    Ссылка в конце статьи.

    Reply
  6. Emela

    Можно на диаграмме вывести значения с тремя знаками после запятой?

    Не получилось через Диаграмма.установитьЗначение(…,Формат(Значение,»ЧЦ=10;ЧДЦ=3″);

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

    Reply
  7. Сисой

    (6) Emela, да, можно. Я сейчас попробовал это сделать в консоли компоновки.

    Решающим оказалось прямое задание типа значения ресурса в настойках СКД.

    Reply
  8. Emela

    А если не используя СКД? Мы в тонком клиенте используем без СКД.У Вас статья тоже без применения СКД?

    Reply
  9. Сисой

    У меня получилось и без СКД, но в толстом клиенте. В тонком не проверял. Возможно. это баг тонкого клиента.

    Reply
  10. Гость

    Здравствуйте, сломал всю голову. Подскажите, пожалуйста.

    Создал Гистограмму на форме с Одной точкой и Тремя Сериями, получаю диаграмму(Гистограмма с накоплением горизонтальная объемная) (прин скрин прикладываю).

    Значения заполняю в коде так: ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[2],Строка.КолЗН,,Строка.КолЗН).

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

    Reply
  11. NittenRenegade
    Проблема 2 (более серьезная): мне неизвестен способ заставить 1С добавлять символ процента к значениям точек и легенде шкалы. Настройка везде идет через строку формата, а платформа не позволяет использовать в форматной строке числа произвольный символ. Объект Диаграмма позволяет работать с процентами, но только при анализе соотношения значений по сериям. Если серия одна, то выбирать способ вывода значений в процентах бессмысленно. Что ж, добавляем в заголовок примечание (в %).

    Проблема решаема. В СКД создаём вычисляемое поле тип Строка, прописываем туда что-то вроде:

    Формат(ПроцентИзменения, «ЧДЦ=0″)+»%»

    И выводим это значение как точку.

    Reply
  12. Азверин

    (10) вот тоже хочу именно это вывести, но никак не получилось пока(

    Reply
  13. Alex_mar

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

    У Вас получилось? Два года уж прошло, а проблема актуальна )

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *