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

10.10.13

Разработка - Работа с интерфейсом

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

Так уж получилось, что за более чем 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/

 

 

 

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61797    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54403    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16698    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10738    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9617    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3666    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12082    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 215 10.07.13 16:14 Сейчас в теме
А еще я ни разу не смог заставить 1с правильно построить диаграмму по источнику данных - таблице значений. Там логический баг, ИМХО. У кого-то получалось ?
2. vis_tmp 32 02.10.13 09:21 Сейчас в теме
А можно ли построить график такого вида?
http://savepic.su/3460493.png
На картинке выделены пустые область, т.е. шкала всегда 12 месяцев, к примеру, а данные показываем не за все месяцы, а только за часть из них.
С 3 по 10, к примеру.
Такое возможно сделать?
3. Сисой 87 02.10.13 11:55 Сейчас в теме
Если бы не было подписей, то можно было бы добавить фиктивную сeерию нужной размерности и установить для неё цвет фона. А то, что Вы хотите, возможно только в excel. Кстати, через неделю опубликую библиотеку отрисовки диаграмм из 1с в excel.
4. vis_tmp 32 11.10.13 07:04 Сейчас в теме
5. Сисой 87 11.10.13 08:37 Сейчас в теме
Ссылка в конце статьи.
6. Emela 21.01.15 10:28 Сейчас в теме
Можно на диаграмме вывести значения с тремя знаками после запятой?
Не получилось через Диаграмма.установитьЗначение(...,Формат(Значение,"ЧЦ=10;ЧДЦ=3");
не получилось в свойствах диаграммы - вывести значение и формат для подписей- никак на эти изменения не реагирует, выдает не более 2 х знаков после запятой.
7. Сисой 87 21.01.15 15:00 Сейчас в теме
(6) Emela, да, можно. Я сейчас попробовал это сделать в консоли компоновки.
Решающим оказалось прямое задание типа значения ресурса в настойках СКД.
8. Emela 22.01.15 11:57 Сейчас в теме
А если не используя СКД? Мы в тонком клиенте используем без СКД.У Вас статья тоже без применения СКД?
9. Сисой 87 22.01.15 13:21 Сейчас в теме
У меня получилось и без СКД, но в толстом клиенте. В тонком не проверял. Возможно. это баг тонкого клиента.
10. Гость 13.05.16 11:45
Здравствуйте, сломал всю голову. Подскажите, пожалуйста.
Создал Гистограмму на форме с Одной точкой и Тремя Сериями, получаю диаграмму(Гистограмма с накоплением горизонтальная объемная) (прин скрин прикладываю).
Значения заполняю в коде так: ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[2],Строка.КолЗН,,Строка.КолЗН).
Почему на диаграмме не выводятся значения??? Хочу видеть цифры прямо на диаграмме (в прин скрине обвел эти значения в красный кружек).

Прикрепленные файлы:
12. Азверин 3 21.11.17 14:24 Сейчас в теме
(10) вот тоже хочу именно это вывести, но никак не получилось пока(
13. Alex_mar 29.11.19 23:50 Сейчас в теме
(12) Такая же проблема, второй день мучаюсь, но вывести значения серий на самой гистограмме пока не получается.
У Вас получилось? Два года уж прошло, а проблема актуальна )
14. user1477397 11.03.22 11:37 Сейчас в теме
(10)Диаграмма.ВидПодписей = ВидПодписейКДиаграмме.СерияЗначение;
11. NittenRenegade 108 21.09.17 09:23 Сейчас в теме
Проблема 2 (более серьезная): мне неизвестен способ заставить 1С добавлять символ процента к значениям точек и легенде шкалы. Настройка везде идет через строку формата, а платформа не позволяет использовать в форматной строке числа произвольный символ. Объект Диаграмма позволяет работать с процентами, но только при анализе соотношения значений по сериям. Если серия одна, то выбирать способ вывода значений в процентах бессмысленно. Что ж, добавляем в заголовок примечание (в %).

Проблема решаема. В СКД создаём вычисляемое поле тип Строка, прописываем туда что-то вроде:
Формат(ПроцентИзменения, "ЧДЦ=0")+"%"
И выводим это значение как точку.
Оставьте свое сообщение