Имя: Пароль:
1C
 
Прогресс-бар
0 foxey
 
14.11.08
15:19
Есть ли готовая разработка сабж? Хотелось бы при выполнении запроса или формировании таблички или печатной формы отрисовать процесс выполнения задачи. Для формирования табличек понимаю как сделать, а вот для запроса... На время выполнения запроса 1С все равно в ступор уйдет, остается только рисовать процесс переваривания выборки запроса.
1 butterbean
 
14.11.08
15:21
можно вот так
||||||||||||||||||60%||||
2 ДенисЧ
 
14.11.08
15:25
лучше так
[=]/\/\/\/\/\/60%/\/\/\[:]
3 foxey
 
14.11.08
15:27
А куды все это выводить? Как думаете, лучше на форме в текстовом поле нарисовать или через Состояние() в статусбаре? Где прикольнее?
4 Санта Клаус
 
14.11.08
15:28
я делаю в Состоянии %
5 lea_220400
 
14.11.08
15:28
(0) поищи по форуму, уже было и вариант был как организовать параллельный процесс, там ВК если мне память не изменяет.
6 ДенисЧ
 
14.11.08
15:29
(3) в статус лучше. Стандартней.
7 Fragster
 
гуру
14.11.08
15:32
(6)+1... только выводи каждые 1000 итераций - а то времени много кушать вывод будет... у меня по терминалу на 10000 установок состояния (разного - наименований номенлатуры обрабатываемой) - ушло примерно 3 минуты... что по отладчику - составило 90% всего времени :)
8 Ёпрст
 
гуру
14.11.08
15:32
смотря какой запрос...
9 foxey
 
14.11.08
15:33
(7) Думаю, что не через 1000 надо, а общее число итераций делить на 20 к примеру. Правда, если шаг вычислить возможно будет...
10 YHVVH
 
14.11.08
15:34
ДА ладно у меня вот в 1с когда отчет вариться анегдот вываливается, чтоб юзвер не скучал :-)
11 ДенисЧ
 
14.11.08
15:35
(10) Лучше порнушку ему показывай...
12 YHVVH
 
14.11.08
15:35
(11) не
13 foxey
 
14.11.08
15:36
(11) Порнушку в статус-баре? А что, это будет забавно. Народ будет запускать отчеты и пристально всматриваться в низ монитора...
14 Sadovnikov
 
14.11.08
15:37
(0) Посмотри RiK_SQL, раздел "Окно сообщения".
15 povar
 
14.11.08
15:38
(13) ага, стриптиз, при 100% - снимается последняя часть одежды
16 ДенисЧ
 
14.11.08
15:38
(13) Анекдот в статусе - тоже забавно :-)
17 andrewalexk
 
14.11.08
15:43
(0)
:)
или вот
[:]||||||||||||||||||||||||||[:]
18 foxey
 
14.11.08
16:00
(14) - Спасибо. Красивая обработка. Сейчас прикручу...
19 Деметрио
 
14.11.08
16:08
(10) а к башоргу, за свежими анекдотами, у Вас отчет умеет подключаться?
20 Ёпрст
 
гуру
14.11.08
16:09
(19) это давно всё есть.. и на инфостарте валяется..
21 TitanLuchs
 
14.11.08
16:18
(0) Вот процедура:

Процедура Прогресс(Текущий, Максимальный) Экспорт
                 
   Перем СимволовМакс; // Сколько знакомест отводить для всей полосы прогресса
   Перем СимволовТек;
   
   Перем ПолосаПрогресса;
   
   Перем Ш; // Счетчик
   
   // Рассчитаем количество символов для линейки
   СимволовМакс = 60;
   СимволовТек =  Цел(Текущий * СимволовМакс / Максимальный);

  // Теперь начинаем формировать полосу прогресса
   ПолосаПрогресса = " <";
   Для Ш = 1 По СимволовТек Цикл
       ПолосаПрогресса = ПолосаПрогресса + "|";
   КонецЦикла;    
   Для Ш = 1 По (СимволовМакс - СимволовТек) Цикл
       ПолосаПрогресса = ПолосаПрогресса + "-";
   КонецЦикла;    
   ПолосаПрогресса = ПолосаПрогресса + ">";

   // И отобразим
   Состояние(ПолосаПрогресса);
   
КонецПроцедуры


Но тут с циклами, лучше переделать на вырезание подстроки нужной длины из строк-заготовок типа "|||||||||||||||||||||||||||||||||||||" и "-------------------------", будет быстрее
22 foxey
 
14.11.08
16:46
(21) - С помощью Rik-компоненты кошернее выглядит все.
Вот еще бы два прогресс-бара можно было показать! Один - общий для всех этапов формирования отчета, второй - для текущего этапа.
23 foxey
 
14.11.08
16:48
А есть в 7-ке обработчик прерывания пользователем?
24 ДенисЧ
 
14.11.08
16:51
(23) он там не нужен. выскакивает окно "Прервать?"
25 foxey
 
14.11.08
16:53
(24) Если использую Риковскую ВК, мне надо при прерывании формирования отчета пользователем убить окно прогресс-бара.
26 vde69
 
14.11.08
16:53
// функция возвращает строку индикатор длиной 100 символов
Функция Обмен_Индикатор(значение, максимум=100)
   Если максимум > 0 Тогда
       Длина=50;            
       
       Если значение<=0 тогда
           стр="";
           Для е = 1 по Длина Цикл
               стр=стр+".";
           КонецЦикла;    
   
           Возврат "[" + стр + "]";
       КонецЕсли;
       
       е1="";            
       Для е = 1 По Длина Цикл
           Если е<=((значение*Длина)/максимум) Тогда
               е1=е1+"|";
           Иначе
               е1=е1+".";
           КонецЕсли;        
       КонецЦикла;
       Возврат "[" + е1 + "]";
   Иначе
       Возврат "";
   КонецЕсли;
КонецФункции
27 vde69
 
14.11.08
16:54
(26)+

вид

[||||||.......]
28 ДенисЧ
 
14.11.08
16:56
(25) Я бы сделал так: текст на форму, в него функцию.
В функции проверка: если есть окно статуса, то убить его.
29 foxey
 
14.11.08
16:57
(28) чуточку недопонял:
В функции проверка: если есть окно статуса, то убить его.
Какое такое окно статуса?
30 ДенисЧ
 
14.11.08
16:58
(29) Пятница? Разумеется, прогресса :-)
31 foxey
 
14.11.08
17:03
(30) При этом подразумевается, что на форме отчета ничего не должно изменяться. Так ведь? У меня просто порой на форме рисуется количество считанных и обработанных документов...
32 ДенисЧ
 
14.11.08
17:05
(31) Почему подразумевается?
33 foxey
 
14.11.08
17:07
Если на форме что-то поменялось, то обработчик текстового поля сработает и убьет прогресс-бар. Или не так?
34 ДенисЧ
 
14.11.08
17:08
(33) А он нужен при интерактивной работе? А то, пока процедура отчета работает, эта функция вызываться не будет...
35 ДенисЧ
 
14.11.08
17:09
Данная функция вызывается только при интерактивной работе с формой.
36 foxey
 
14.11.08
17:10
Ну смотри: Отработал запрос, получили выборку, начинаем бегать по выборке, идет обработка. Здесь прогресс нужен и даже очень. А так как мы бегаем по выборке в цикле, то и прогресс будет рисовать актуальное состояние.
37 foxey
 
14.11.08
17:11
(35) - вот это уже понятнее. Попробую.
38 TitanLuchs
 
14.11.08
17:54
(26) Тоже цикл. Плохо.
39 TilanLuchs
 
14.11.08
18:34
Как вариант:
В справочнике Контрагенты, создать группу "НекоторыеКонтрагенты", туда побросать этих Контрагентов некоторых и уже при формировании отчета, смотреть входит ли Контрагент в эту группу или нет.:)
40 TitanLuchs
 
14.11.08
18:35
(39) Опять боты на сервер напали?
41 TitanLuchs
 
14.11.08
18:35
+(40) не на сервер, а на форум то есть
42 foxey
 
14.11.08
18:43
(38) можно так попробовать:
Перем РазмерБара,спТ,спП;
Процедура ПриОткрытии()
   РазмерБара = 60;
   Т = ".";
   П = "|";
   спТ = СоздатьОбъект("СписокЗначений");
   спП = СоздатьОбъект("СписокЗначений");
   Для Сч = 1 По РазмерБара Цикл
       спТ.ДобавитьЗначение(Т);
       спП.ДобавитьЗначение(П);
       Т = Т + ".";
       П = П + "|";
   КонецЦикла;
КонецПроцедуры
   
   Функция ПрогрессБар(ТекЗначение,ВсегоЗначений)
       Шаг = ЦЕЛ(ВсегоЗначений / РазмерБара);
       ТекПолосочка = ЦЕЛ(ТекЗначение / Шаг);
       Если ТекПолосочка = (ТекЗначение / Шаг) Тогда
           Состояние("["+спП.ПолучитьЗначение(ТекПолосочка+1)+спТ.ПолучитьЗначение(РазмерБара - ТекПолосочка)+"]");
       КонецЕсли;
   КонецФункции      

Чтобы циклов не было...
43 smaharbA
 
14.11.08
18:49
(42) не универсально, все должно быть внутри самой функции, и она еще возвращять должна, чтобы в любом разе использовать
+ при неизвестном максимуме должно бегать как в загрузке хп
45 Табуретко
 
14.11.08
18:50
(42)ашоб мерцания небылоб при таких СБ...
46 Табуретко
 
14.11.08
18:53
(44)пятницо?
47 foxey
 
14.11.08
19:01
(45) Если ТекПолосочка = (ТекЗначение / Шаг) Тогда
Вот тут анти-мерцание с заданным шагом...
48 foxey
 
14.11.08
19:02
(43) У меня все внутри, кроме текущего и максимального значений.
А как ты нарисуешь при неизвестном максимуме? На глазок?
50 smaharbA
 
14.11.08
19:04
спП.ПолучитьЗначение(ТекПолосочка+1) - это чо внутри
2. по времени и без внешних для функции переменных
51 TitanLuchs
 
17.11.08
11:40
(42) Да проще надо сделать:
Т = ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";
П = "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||";

и все
52 foxey
 
17.11.08
11:43
(51) Ну наверное все-таки надо добавить еще такую конструкцию:
Состояние Лев(П,ТекЗначение)+Лев(Т,РазмерБара-ТекЗначение);
53 skunk
 
17.11.08
11:48
ага ... вот только при запросе работать не будет... да и так тормозов добавит
54 smaharbA
 
17.11.08
12:06
С шагом в свое время не стал заморачиваться, сделал время

Функция глИндикатор(Предел=1,Текущий=0,Количество=100,Знак="|",Элемент="",Цвет=8388608, Проценты=-1,Комментарий="",Период=100,Начало=0,Сост=0,Стр="") Экспорт
// Функция отображения процесса выполнения
// Предел - максимальное значение процесса
// Текущий - текущее значение процесса
// Количество - количество знаков при 100%
// Знак - символ в строке прогресса
// Элемент - атрибут формы в котором выводится прогресс
// Проценты - режим вывода процента выполнения
//        Проценты = -1 - выводить проценты слева от прогресса
//        Проценты = 1 - выводить проценты справа от прогресса
// Период - период смены состояния прогресса в миллисекундах
// Начало - передается по ссылке, фиксирует предидущее состояние.
// Сост = 1 - выводить прогресс в строке состояния
// Стр - передается возвращаемая самой функцией (если необходимо)
//
// Пример вызова
//
// Максимум=КоличествоСтрок();
// Начало=_GetPerformanceCounter();
// Стр=глИндикатор(Максимум,,250,,Форма.Индикатор,,,"Обработка строк документа...",,Начало,1,Стр)
// ВыбратьСтроки();
// Пока ПолучитьСтроку()=1 Цикл
//     ОбработкаСтроки(НомерСтроки);//Какие то действия
//     Стр=глИндикатор(Максимум,НомерСтроки,250,,Форма.Индикатор,,,"Обработка строк документа...",,Начало,1,Стр)
// КонецЦикла;
//
   Перем СтрЛев,СтрПрав;
   Если (Предел=0) Тогда
       Текущий=1;
       Предел=1;
   КонецЕсли;
   Доля=Текущий/Предел;
   ТекущееКоличество=Количество*Доля;
   Если (_GetPerformanceCounter()-Начало<Период) и (ПустоеЗначение(Начало)=0) Тогда
       Возврат Стр;
   КонецЕсли;
   Стр=Формат(100*Доля,"Ч6.2")+"%";
   СтрПрав=РазделительСтрок+Комментарий;
   Если Проценты=-1 Тогда
       СтрЛев=Стр;
   ИначеЕсли Проценты=1 Тогда
       СтрПрав=Стр+СтрПрав;
   КонецЕсли;
   Стр=СтрЛев+СтрЗаменить(Формат("","С"+ТекущееКоличество)," ",Знак)+СтрПрав;
   Если ТипЗначенияСтр(Элемент)="НеизвестныйОбъект" Тогда
       Элемент.Цвет(Цвет);
       Элемент.Заголовок(Стр);
   КонецЕсли;
   Если Сост=1 Тогда
       Состояние(Стр);
   КонецЕсли;
   Начало=_GetPerformanceCounter();
   Возврат Стр;
КонецФункции    // глИндикатор
55 smaharbA
 
17.11.08
12:29
да там в состоянии лучче так

Состояние(СтрЛев+СтрЗаменить(Формат("","С"+(ТекущееКоличество*80/Передел))," ",Знак)+СтрПрав);

Да и Стр передавать и получать по ссылке
56 smaherbA
 
18.11.08
03:16
Вопрос следующий.
В ПУБе есть заявка - по совместительству счет (печатная форма). Отдельно электронного счета нет (точнее он был, а потом его убрали). При выписке счета вводим заявку, не проводя ее. Печатаем и ждем оплаты. После оплаты проводим. Проблема в том что после оплаты проходит много времени, вводят много документов, проводя ее портим последовательность. Кроме того резерв она рассчитывает, я посмотрел, на позицию документа. Т.е. если после нее этот товар уже зарезервировали другой заявкой, она все равно его зарезервирует, получиться что более поздней заявке потом не хватит количества.
Може я что не правильно делаю ?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс