gifts2017

Микрографики в табличной части

Опубликовал Андрей C (an77) в раздел Программирование - Практика программирования

Пример использования микрографиков в табличной части

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

     Графическое представление находится ближе некуда, пользователь намного быстрее ощущает порядок цифр. Развивать идею каждый может относительно конкретной ситуации. Буду Smile, если кому - то пригодится.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Микрографики.epf
.epf 8,31Kb
02.07.13
490
.epf 8,31Kb 490 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Игорь Исхаков (Ish_2) 24.01.11 09:36
Техника исполнения оставляет желать лучшего.
При каждом выводе строки мы имеем вычисления в цикле (набираем нужную длину полоски)
Для к = 1 по (Процент*Масштаб) Цикл 	ПроцентГраф = ПроцентГраф + "|";	КонецЦикла;


Можно обойтись без цикла, Например
Перем Заготовка;
........
Процедура ПриВыводеСтроки(....)
.....
ПроцентГраф= Лев(Заготовка,Процент*Масштаб);
КонецПроцедуры

Заготовка = "|||||||||||||||||||||||||||||||||||";
...Показать Скрыть

DenSA; Istur; V_V_V; Rustig; +4 Ответить 5
2. Ийон Тихий (cool.vlad4) 24.01.11 09:39
Пожалуй в идее, что есть, за нее и плюс, а вот реализация по всей видимости действительно не очень.
3. Игорь Фрунзэ (gorodok11) 24.01.11 09:46
4. г. Казань Рустем Гумеров (Rustig) 24.01.11 10:41
+ за идею!

очень похоже на:
http://www.planetaexcel.ru/tip.php?aid=71

но все равно за идею плюс! :)
5. hasp_x 24.01.11 11:30
(0) можно индикатор подцветить вторым цветом после достижения, допустим, 100%
6. Андрей C (an77) 24.01.11 13:11
(1) Согласен, техника хромает, учтем. Просто хотелось показать именно идею.
(4) www.planetaexcel.ru - отличный сайт, много интересного было почерпнуто, но микрографики использовал в excel еще до знакомства с данным ресурсом.
(5) Вариантов масса: и условное форматирование и отображение многомерных данных (допустим группы символов через пробел), вывод различных символов, разного шрифта и размера и т.д. Творческая работа.
7. Ярослав Радкевич (WKBAPKA) 24.01.11 22:54
+ за идею.. .вот за что люблю жизнь, это за то, что все лежит на поверхности, нужно только обратить свое внимание!
8. Сергей (Che) Коцюра (CheBurator) 24.01.11 23:02
Сумму оплаты в отдельный столбец не выводит, отображать прямо на фоне индикатора оплаты, слева от процента.
9. Андрей Акулов (DrAku1a) 25.01.11 08:49
(1) А если в твоей строке "Заготовка" не хватит символов - если их будет меньше, чем "Процент*Масштаб"? Вариант с циклом может и медленнее, зато надежен.
10. Игорь Исхаков (Ish_2) 25.01.11 09:51
11. Ийон Тихий (cool.vlad4) 25.01.11 09:56
(9) Можно заготовку и заранее формировать в зависимости от Процент*Масштаб, все ж лучше чем для каждой строки в отдельности считать. Я плюсовал, действительно - оригинально, но я такой штукой все же пользоватся не буду - не нравится мне эти заморочки со строками привыводе строки, а тем более если пользователь начнет что-то менять - должно же пересчитыватся...для быстрой работы это явно не тянет... можно передавать число скриптовому движку, чтобы тот делал операцию побитого сдвига, а затем 1С делал СтрЗаменить, либо в 1С как-то формировать число, где в разрядах одно и тоже число, затем стрзаменить - но это так в порядке моего общего бреда, - в 1С очень медленно происходит сложение строк,через msscript быстрее наверное...
12. Ийон Тихий (cool.vlad4) 25.01.11 10:14
(0) (9) (10) А так интересно быстрее СтрЗаменить(Формат(0,"ЧЦ="+СколькоНадоЧерточек+";ЧН=; ЧВН=; ЧГ=0"),"0","|");?
13. Ийон Тихий (cool.vlad4) 25.01.11 10:38
(10) Не поленился я проверить, в общем каждый из наших способов имеет недостатки (про ваш сказал (9), а мой лучше только при маленьких строках), но если их объединить, то примерно в 1.5 раза лучше циклов -
надо моим способом сформировать заготовку

Перем Заготовка;
........
Процедура ПриВыводеСтроки(....)
.....
ПроцентГраф= Лев(Заготовка,Процент*Масштаб);
КонецПроцедуры

Заготовка = СтрЗаменить(Формат(0,"ЧЦ="+СколькоНадоЧерточек+";ЧН=; ЧВН=; ЧГ=0"),"0","|");
По всей видимости СколькоНадоЧерточек=Процент*Масштаб, где Процент=100%
ЗЫ СтрЗаменить(Формат(0,"ЧЦ="+СколькоНадоЧерточек+";ЧН=; ЧВН=; ЧГ=0"),"0","|") больше 127 не делает
14. Ийон Тихий (cool.vlad4) 25.01.11 11:23
бухгалтер меня на мысль навел(очередными своими дурацкими числами) - можно умножать например 10 на любое число, затем СтрЗаменить (отсекаем 1, и заменяем нули)- это к вопросу (13) как формировать заранее заготовку нужной длины.
ЗЫ Люблю я поизвращатся.
15. Алексей Константинов (alexk-is) 25.01.11 11:27
(1) (13) Вариант 1 самый быстрый, только Заготовка нужно собрать как в http://infostart.ru/public/71130/

// Получаем строку черточек длиной 10000 символов
Заготовка = СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0",
СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", "|"));

Так как СтрЗаменить(Формат(0,"ЧЦ="+СколькоНадоЧерточек+";ЧН=; ЧВН=; ЧГ=0"),"0","|"); при СколькоНадоЧерточек больше 127 выдаст только 127 черточек
16. Ийон Тихий (cool.vlad4) 25.01.11 11:29
(15) Согласен, как же близко я был от ответа :D
ЗЫ Про быстроту (1) я и сказал, но это условность - потому, что по хорошему формирование заготовки тоже надо брать в расчет.
17. Александр Рытов (Арчибальд) 25.01.11 11:33
За идею плюс. Для семерки здесь http://infostart.ru/public/80691/. Но с циклом, что бы там в (1) ни злопыхали.
18. Ийон Тихий (cool.vlad4) 25.01.11 11:35
(15) А кстати при меньше 127 эта конструкция Заготовка = СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0",
СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", "|")); действительно быстрее?
19. Алексей Константинов (alexk-is) 25.01.11 11:37
(18) Быстрее ПроцентГраф= Лев(Заготовка,Процент*Масштаб);
20. Ийон Тихий (cool.vlad4) 25.01.11 11:38
(19) Вы помоему совершенно не читаете, что я пишу - посмотрите (13) - я не отрицаю, что Лев надо использовать - я спрашиваю, быстрее ли формирование заготовки при строках меньше 127 вашим способом.
21. Ийон Тихий (cool.vlad4) 25.01.11 11:46
(19) И непонятно как формировать нечетные - к примеру мне нужно 63 черточек, как это сделать только с помощью такой конструкции СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0",
СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", "|"));
Точнее как формировать простые числа - 17 например, 11? Нечетные формируются произведением, если они не простые конечно.
22. Алексей Константинов (alexk-is) 25.01.11 11:51
(20) Нет, не быстрее, т.к. строка получается длиннее. Но ведь Заготовка формируется всего 1 раз, поэтому это не принципиально. 15 миллисекунд лишь незначительно скажутся на производительности при создании формы.

(21) Как-то так

Процедура ПриПолученииДанных()
...
ПроцентГраф = Лев(Заготовка, Процент*Масштаб);
// где Процент*Масштаб, например, 63
...
КонецПроцедуры

Заготовка = СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", "|"));
23. Сергей (Che) Коцюра (CheBurator) 25.01.11 11:52
24. Ийон Тихий (cool.vlad4) 25.01.11 11:53
(23) Я это предвидел, потому и съехидничал
как это сделать только с помощью такой конструкции
25. Ийон Тихий (cool.vlad4) 25.01.11 11:54
(22) Вы читаете вообще что я написал? (13) посмотрите
Перем Заготовка;
........
Процедура ПриВыводеСтроки(....)
.....
ПроцентГраф= Лев(Заготовка,Процент*Масштаб);
КонецПроцедуры

Заготовка = СтрЗаменить(Формат(0,"ЧЦ="+СколькоНадоЧерточек+";ЧН=; ЧВН=; ЧГ=0"),"0","|");


Я спрашиваю сейчас как быстро можно эту заготовку сформировать. Лев я не отрицаю.
При меньших 127 - ваш способ не уверен, что оптимален - два раза СтрЗаменить и округление могут испортить малину.
26. Ийон Тихий (cool.vlad4) 25.01.11 11:59
Наверное меня плохо поняли - я уже написал меня это не интересует, как сформировать строку и округлить я догадаюсь. Ради спортивного интереса, хочется узнать в данном случае самый быстрый и самый универсальный способ формирования Заготовки заранее. То, что ее надо заранее формировать заданной длины в зависимости от масштаба- вообще-то я первый подметил.
27. Алексей Константинов (alexk-is) 25.01.11 12:00
(25)
Заготовка = Лев(СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", "|")), 1111);
28. Ийон Тихий (cool.vlad4) 25.01.11 12:03
(27) Пардон, это самый быстрый способ?
29. Алексей Константинов (alexk-is) 25.01.11 12:03
(26) Исходная длина строки не так принципиальна. Может быть любой, лишь бы не короче максимальной. В дальнейшем в Лев() передается ссылка, а 10 Кб RAM найдется.
30. Ийон Тихий (cool.vlad4) 25.01.11 12:09
(29) Надо проверить - что это действительно быстро, а то может оказатся что и нет, тогда это будет похоже на индусский код ;) и во-вторых надо знать заранее, что в Лев(СтрЗаменить(Формат(0, "ЧЦ=A; ЧН=; ЧВН=; ЧГ="), "0", СтрЗаменить(Формат(0, "ЧЦ=B; ЧН=; ЧВН=; ЧГ="), "0", "|")), 1111); - произведение A*B больше 1111, их несложно подобрать, но как раз это тоже минус быстроте и универсальности.
31. Алексей Константинов (alexk-is) 25.01.11 12:12
(28) Придумаешь быстрее обязательно позвони мне. :)
32. Ийон Тихий (cool.vlad4) 25.01.11 12:14
(31) Это несерьезно :) ...а ведь мне лень замеры делать, но придется... :)
33. Антон Лыткин (Trise) 25.01.11 17:26
Заготовка = "||||||||||||||||||||||||||||||||||||||||||||||||..."; (100 в уме (=максимальный процент), при маштабе в 1)

//Больше чем 127*100 никто из бухгалтеров мне кажется точно смотреть не будет
Заготовка = СтрЗаменить(Заготовка,"|",Формат(0, "ЧЦ="+Маштаб+"; ЧН=; ЧВН=; ЧГ="));

//ИЛИ
НеобходимаяДлина = Маштаб*100;
Пока СтрДлина(Заготовка)<=Маштаб Цикл
Заготовка = СтрЗаменить(Заготовка,"|",Заготовка);
//После первой итерации у нас 100*100, после второй 10000*10000, тут уже по глаза хватит, правда зачем столько.
КонецЦикла;

//Даже как-то так бы написать, только времени нет:

ЗаготовкаМаштаб = "||||||||||||||||||||||||||||||||||||||||||||||||..."; (100 в уме, тут надо определиться с максимальным маштабом, или создать по какому-то из ранее придуманных алгоритмов)
Заготовка = СтрЗаменить(Заготовка,"|",Лев(ЗаготовкаМаштаб,Маштаб));

//Но в общем вариант alexk-is мне кажется самый быстрый, по крайней мере с наибольшим коэффициентом, у него возведение в кдадрат
34. Pashkaa (Pashkaa) 25.01.11 20:12
35. Алексей Константинов (alexk-is) 25.01.11 20:49
(33)
Заготовка = СтрЗаменить(Заготовка,"|",Формат(0, "ЧЦ="+Маштаб+"; ЧН=; ЧВН=; ЧГ="));
Попробуйте при масштабе 0.8. Что будет в результате? 80 палочек? Нет, 100 ноликов.

НеобходимаяДлина = Маштаб*100;
Пока СтрДлина(Заготовка)<=Маштаб Цикл
Заготовка = СтрЗаменить(Заготовка,"|",Заготовка);
//После первой итерации у нас 100*100, после второй 10000*10000, тут уже по глаза хватит, правда зачем столько.
КонецЦикла;

Попробуйте при маштабе 0.8. Что будет в результате? Правильно 100 палочек. А при масштабе 99? Опять 100 палочек.

Вот третий вариант вполне рабочий. Его можно упростить и записать одной командой, вместо 3.
Заготовка = СтрЗаменить("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", "|", Лев("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", Масштаб));
Ну, что тут сказать. Кому как нравится, тот так и записывает. В данном случае строка формируется всвего 1 раз и выжимать здесь что-то не имеет особого смысла.
36. Ийон Тихий (cool.vlad4) 26.01.11 00:00
(35) :D Меня все таки удивиляет, почему в 1С отсутствует такая простая функция как конструктор строки, которая есть во многих языках, в Delphi я бы использовал функцию StringOfChar, а в C# вообще строка объектный тип string str = new string ("|",5) , для VBScript есть string (кстати ее можно использовать )-
в vbscript -
TextScript="
|Function Run
| run = String(""" + Count + """, ""|"")
|End Function
|";

ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
ScrptCtrl.Language = "vbscript";
ScrptCtrl.AddCode(TextScript);
Сообщить( ScrptCtrl.Run("Run"));
еще можно сформировать строку извне, а потом передать указатель 1С, потому что ВК делать ради такой фигни не имеет смысла. Естественно для таких случаев есть dynwrapx.dll, и тут я узнал, что у нее уже есть функция
Space( Count [, Char] ) - создание строки (BSTR) заданной длины. Возвращает строковую переменную. Count - число символов (двухбайтных). Char - необязательный параметр: символ, которым будет заполнена строка. По умолчанию строка заполняется пробелами - так же, как это делает функция Space в VBScript. Чтобы заполнить строку двоичными нулями, нужно задать Char как пустую строку ("").

wrap = Новый COMОбъект("DynamicWrapperX");
str = wrap.Space( Count, "|");
Сообщить(str);
А Затем можно и Лев( делать
PS не принимайте сильно всерьез - просто пытался врапером некоторые api функции вызывать и тут заметил функ. space, на которую раньше внимания не обращал.
37. Ийон Тихий (cool.vlad4) 26.01.11 00:15
ЗЫ Насчет быстроты это я так...никто ж не измерял...
38. Ийон Тихий (cool.vlad4) 26.01.11 00:22
по скорости com все таки проигрывает...
39. Ийон Тихий (cool.vlad4) 26.01.11 01:07
Наврал это я все...скорость нормальная...конечно, через весь батальон средств 1С - формат,стрзаменить,лев - быстрее, но зато так мы формируем строку заданной длины(до ограничения по типу BSTR), и это заставило меня пустится во все тяжкие - эти стройные ряды черточек, напомнили мне чем-то фракталы, теперь надо в 1С это сделать...через Сообщить, так интереснее, а еще ASCII art...надо ВК сделать что ли...
40. Андрей Акулов (DrAku1a) 26.01.11 02:39
(22) Верная мысль.

Но ведь Заготовка формируется всего 1 раз, поэтому это не принципиально. 15 миллисекунд лишь незначительно скажутся на производительности при создании формы.

Да делайте вы ее хоть самым медленным циклом - это не принципиально. Это делается один раз и ДО показа формы. Скорость прорисовки формы при этом не уменьшится.
Кроме того, давайте не будем жертвовать читабельностью кода - ведь разбираться, что делает участок из 10 строк кода, с вызовом функции VBScript гораздо тяжелей, чем
СтоНолей = Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ=");
Заготовка = СтрЗаменить(СтоНолей, "0", СтрЗаменить(СтоНолей, "0", "|")); // 10 000 черточек

Но вот вопрос - а сколько нужно, чтобы точно хватило?
СтоНолей = Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ=");
Заготовка = СтрЗаменить(СтоНолей, "0", СтрЗаменить(СтоНолей, "0", СтрЗаменить(СтоНолей, "0", "|"))); // 1 000 000 черточек
41. Алексей Константинов (alexk-is) 26.01.11 06:31
(39) Теперь нужно всё загнать в ВК?
1С как интерпретатор всегда будет проигрывать компилятору. Вывод: хочешь чтобы работало, ну, очень быстро - не используй 1С вообще, пиши сразу на ассемблере для своего процессора.
42. Ийон Тихий (cool.vlad4) 26.01.11 10:05
(40)(41) Да, это я так для затравки - думаете я сидел и озадачивался проблемой как это сделать быстрее всего - быстрее всего будет работать хорошо и специально написанная для этого функция на ассемблере, а для 1С хорошо, то что в 1С
(41) ничего вы не поняли - если у вас без ВК или без помощи других языков (на чистом 1С)получится сделать в 1С ASCII art, то в этот раз звоните вы мне(тобишь перевод из картинки в ASCII символы)
43. Ийон Тихий (cool.vlad4) 26.01.11 10:11
(40) И если уж вы такие точные - то эта верная мысль прозвучала сначала в (1), а потом в (11)-(13), а VBScript я привел для разнообразия. Как если бы я привел powershell или f# скрипты - это была бы скорее экзотика, чем руководство к действию
44. Ийон Тихий (cool.vlad4) 26.01.11 10:16
Конечно текст в 1С сделать особого труда не составит
45. AMuradA (AMuradA) 06.12.11 11:00
Просто и со вкусом. Автор молодец
46. Miffka (mikhailv) 22.12.11 12:05
Классная идея! Мне очень понравилась. Автору респект!

Прикрутил к УТ 10, в табличных частях теперь показывается так сумма и отклонение от плановой.
Сразу видно визуально, что занимает по сумме и по марже "львиную" долю в документе.
47. igor sarafanov (ms200999) 25.01.12 08:38
Познавательно, спасибо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа