IE 2016

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

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

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

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

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

Файлы

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

См. также

Лучшие комментарии

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


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

Заготовка = "|||||||||||||||||||||||||||||||||||";
...Показать Скрыть
Ответили: (6) (9) (15) (17) (43)
+ 4 [ DenSA; Istur; V_V_V; Rustig; ]
# Ответить
14. cool.vlad4 25.01.2011 11:23
бухгалтер меня на мысль навел(очередными своими дурацкими числами) - можно умножать например 10 на любое число, затем СтрЗаменить (отсекаем 1, и заменяем нули)- это к вопросу (13) как формировать заранее заготовку нужной длины.
ЗЫ Люблю я поизвращатся.
+ 1 [ e.kogan; ]
# Ответить
2. cool.vlad4 24.01.2011 09:39
Пожалуй в идее, что есть, за нее и плюс, а вот реализация по всей видимости действительно не очень.
+ 1 [ Istur; ]
# Ответить

Комментарии

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


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

Заготовка = "|||||||||||||||||||||||||||||||||||";
...Показать Скрыть
Ответили: (6) (9) (15) (17) (43)
+ 4 [ DenSA; Istur; V_V_V; Rustig; ]
# Ответить
2. cool.vlad4 24.01.2011 09:39
Пожалуй в идее, что есть, за нее и плюс, а вот реализация по всей видимости действительно не очень.
+ 1 [ Istur; ]
# Ответить
3. gorodok11 (файл скачал) 24.01.2011 09:46
+ за идею.
# Ответить
4. Rustig (файл скачал) 24.01.2011 10:41
+ за идею!

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

Вот третий вариант вполне рабочий. Его можно упростить и записать одной командой, вместо 3.
Заготовка = СтрЗаменить("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", "|", Лев("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", Масштаб));
Ну, что тут сказать. Кому как нравится, тот так и записывает. В данном случае строка формируется всвего 1 раз и выжимать здесь что-то не имеет особого смысла.
Ответили: (36)
# Ответить
36. cool.vlad4 26.01.2011 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.2011 00:15
ЗЫ Насчет быстроты это я так...никто ж не измерял...
# Ответить
38. cool.vlad4 26.01.2011 00:22
по скорости com все таки проигрывает...
# Ответить
39. cool.vlad4 26.01.2011 01:07
Наврал это я все...скорость нормальная...конечно, через весь батальон средств 1С - формат,стрзаменить,лев - быстрее, но зато так мы формируем строку заданной длины(до ограничения по типу BSTR), и это заставило меня пустится во все тяжкие - эти стройные ряды черточек, напомнили мне чем-то фракталы, теперь надо в 1С это сделать...через Сообщить, так интереснее, а еще ASCII art...надо ВК сделать что ли...
Ответили: (41)
# Ответить
40. DrAku1a (файл скачал) 26.01.2011 02:39
(22) Верная мысль.

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

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

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

Прикрутил к УТ 10, в табличных частях теперь показывается так сумма и отклонение от плановой.
Сразу видно визуально, что занимает по сумме и по марже "львиную" долю в документе.
# Ответить
47. ms200999 25.01.2012 08:38
Познавательно, спасибо.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016