Имя: Пароль:
1C
1C 7.7
v7: еще раз про прогрессор, как задать 100%
0 forest-rg
 
21.06.12
23:15
конфиг БП дописанная переписанная, там есть отчет по заявкам(данные берет из справочника заявок)в нем задается период, и тд и запускается заявок уже порядка 20 000, и делается порядка 5-8 часов, потом еще сохраняется в Excel часа 4-6.
Хотелось бы прикрутить какой нибудь прогресбар чтобы понять долго еще осталось.
Прикрутить не проблема это сделал не понимаю как сделать чтобы бралось правильное значение затраченного времени, те 100% это все заявки за заданный период, их может быть как 50 так и все 20 000, как правильно это прописать?
пробовал при запуске вставить счетчик, но это тоже не то, точнее то только счетчик тупо считает каждую заявку по мере формирования отчета
а должен посчитать кол-во заявок за заданный период и взять это значение за 100% и по мере прохода по заявкам отмечать какой процент от общего количества он уже сделал.
1 IamAlexy
 
21.06.12
23:16
заявки циклом перебераешь?

количество() получи из коллекции - вот тебе максимальное значение
2 smaharbA
 
21.06.12
23:21
100    - 500
1..100 - х

в школе не проходили ?
3 smaharbA
 
21.06.12
23:21
ну или наоборот
4 oleg_prg
 
21.06.12
23:31
Формула такая:

ПроцентВыполнения = НомерТекущейЗаявки / (КоличествоЗаявок/100);

Например:
НомерТекущейЗаявки = 200;
КоличествоЗаявок = 1000;
тогда ПроцентВыполнения = 200 / (1000/100) = 20%
5 oleg_prg
 
21.06.12
23:34
Можешь в цикле еще добавить определение текущего времени, делай замер прошедшего времени за 1% и умножай это на оставшийся процент, таким образом можешь выводить сколько осталось времени до завершения операции
6 Злопчинский
 
21.06.12
23:35
(21) это утебя какой-то мозг ленивый. все уже научились в эксель сохранять без ожидания 6-10 часов
7 Злопчинский
 
21.06.12
23:36
dct кгругом уроды. вычисляем колво заявок, приходящееся на один шаг прогрессора. считаем количество отработанных заявок. если = шагпргрессора - обновить прогрессор, счетчикзаявок обнулить.
8 oleg_prg
 
21.06.12
23:39
А вообще я иногда просто паражаюсь лени человеческой
9 forest-rg
 
21.06.12
23:48
а как работает количество(), искал в СП но не нашел того что нужно
простите за тупые вопросы, но я новичок в програмировании
10 oleg_prg
 
21.06.12
23:50
Тебе надо узнать количество элементов в справочнике? Какое количество интересует?
11 forest-rg
 
21.06.12
23:53
oleg_prg - за заданный период, про ПроцентВыполнения = НомерТекущейЗаявки / (КоличествоЗаявок/100); спасибо, не додумался

Злопчинский - видел тут на форуме тему про plugin_mxl_doctor, но как говорится руки пока не дошли, я не програмист я сис админ, да и вообще разнорабочий
12 oleg_prg
 
21.06.12
23:55
КоличествоЗаявок = 0;
   Док = СоздатьОбъект("Документ.Заявка");
   Док.ВыбратьДокументы(Дата1, Дата2);
   Пока Док.ПолучитьДокумент() = 1 Цикл
       Если (Док.Проведен() = 0) или (Док.ПометкаУдаления() = 1) Тогда
           Продолжить;
       КонецЕсли;
       КоличествоЗаявок = КоличествоЗаявок + 1;
   КонецЦикла;
13 zak555
 
21.06.12
23:57
(12) установитьФильтр() неее ?
14 oleg_prg
 
22.06.12
00:00
Причем здесь фильтр, надо пощитать кол-во документов. Или я чего-то незнаю... или недопонимаю?
15 zak555
 
22.06.12
00:01
(14) запрос с счётчиком
16 oleg_prg
 
22.06.12
00:02
(14) Согласен :) Запрос тоже можно, ток в 1С7.7. я их не люблю. брррр
17 forest-rg
 
22.06.12
00:03
вот счетчиком я как раз и сделал, но он считает по мере прохождения заявок, те не суммарное кол-во сразу


Док = СоздатьОбъект("Документ.Заявка");
{Отчет.ОтчетПоЗаявкам2.Форма.Модуль(901)}: Неудачная попытка создания объекта (Документ.Заявка)
18 forest-rg
 
22.06.12
00:06
пордон туплю
19 oleg_prg
 
22.06.12
00:06
(17) Док = СоздатьОбъект("Документ.Заявка"); Заявка это я к примеру написал, тебе надо поставить нужный документ Док = СоздатьОбъект("Документ.СюдаВпишиНужныйДокумент");
20 Злопчинский
 
22.06.12
00:09
(11) возьми готовый вариант - повесь кнопку на панель...
http://infostart.ru/public/14186/
21 zak555
 
22.06.12
00:09
Операции -> Журналы документов -> Полный -> считаем
22 Злопчинский
 
22.06.12
00:10
(13) фильтр тупо отсеет по типовым флажкам выборку - не надо по каждому документ удергать базу на проведенность и удаленность
23 forest-rg
 
22.06.12
00:12
блин, да я потом уж понял, когда написал туплю

Док = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");    
       
   Пока Док.ПолучитьЭлемент() = 1 Цикл    
       //Если (Док.Проведен() = 0) или (Док.ПометкаУдаления() = 1) Тогда    
       //    Продолжить;    
       //КонецЕсли;    
       КоличествоЗаявок = КоличествоЗаявок + 1;    
   КонецЦикла;  

но все равно не работает

да и ктому же помойму то получается тоже самое что у меня уже есть, те счетчик, или я не прав?


Счетчик = 0;        
Запрос = СоздатьОбъект("Запрос");        
   ТекстЗапроса =    
   "//{{ЗАПРОС(ЗапросПоЗаявкам)
   |ТекущийЭлемент = Справочник.я_СпискиЗаявокЭкспедирование.ТекущийЭлемент;
   |ДатаЗ = Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ;
   |Группировка ТекущийЭлемент без групп;
   |Условие(ДатаЗ >= Дата1);
   |Условие(ДатаЗ <= Дата2);
   |//}}ЗАПРОС"    
   ;    
   Запрос.Выполнить(ТекстЗапроса);        
       
   Таб=СоздатьОбъект("Таблица");    
       
   Таб.ВывестиСекцию("Шапка");    
   //СпрЗаявка=СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");    
   //СпрЗаявка.ВыбратьЭлементы();    
   //Пока СпрЗаявка.ПолучитьЭлемент()=1 цикл    
   Пока Запрос.Группировка(1) = 1 Цикл    
           
       Счетчик = Счетчик +1;
24 zak555
 
22.06.12
00:13
(22) УстановитьФильтр(1,0) не покатит ?
25 zak555
 
22.06.12
00:14
(23)

1. где выбратьЭлементы() ?

2. что за дата ?
26 Злопчинский
 
22.06.12
00:14
ТекстЗапроса = "
|Период с ДатаН по ДатаК;
|Обрабатывать Проведенные;
|ТекДок = Документ.ЗаявкаПокупателя.ТекущийДокумент;
|Функция Опочки = Счётчик();
|Группировка ТекДок;
|";
27 zak555
 
22.06.12
00:15
(26) у него справочник =)
28 МихаилМ
 
22.06.12
00:15
если скл то
можно переписать минут за 5 будет формироваться
29 oleg_prg
 
22.06.12
00:15
Док = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");    
       
   Пока Док.ПолучитьЭлемент() = 1 Цикл    
       Если (Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ>=Дата1) и ((Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ<=Дата2)) Тогда    
            КоличествоЗаявок = КоличествоЗаявок + 1;    
       КонецЕсли;        
   КонецЦикла;
30 oleg_prg
 
22.06.12
00:16
(29) так можешь определить количество заявок
31 zak555
 
22.06.12
00:17
Док = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");    
   Док.ВыбратьЭлементы(0);
   Пока Док.ПолучитьЭлемент() = 1 Цикл    
       Если (Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ>=Дата1) и ((Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ<=Дата2)) Тогда    
            КоличествоЗаявок = КоличествоЗаявок + 1;    
       КонецЕсли;        
   КонецЦикла;
32 zak555
 
22.06.12
00:18
> Док = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование")


это какой над тобой так издевался ?
33 oleg_prg
 
22.06.12
00:20
//Находим число обрабатываемых заявок
  Спр = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");    
  Пока Спр.ПолучитьЭлемент() = 1 Цикл    
       Если (Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ>=Дата1) и ((Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ<=Дата2)) Тогда    
            КоличествоЗаявок = КоличествоЗаявок + 1;    
       КонецЕсли;        
   КонецЦикла;

Пока Запрос.Группировка(1) = 1 Цикл    
           
       Счетчик = Счетчик +1;
          //Находим % обработанных заявок
       ПроцентВыполнения = Счетчик / (КоличествоЗаявок/100);
       Состояние("Выполнено:"+СокрЛП(Окр(ПроцентВыполнения))+"%");  //Выводим этот процент
34 oleg_prg
 
22.06.12
00:21
(32) Спокойствие, только спокойствие. )))))
35 zak555
 
22.06.12
00:23
жесть
36 zak555
 
22.06.12
00:23
переходите на 8ку
37 oleg_prg
 
22.06.12
00:23
(33) Ошибочка
Спр = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");  
Спр.ВыбратьЭлементы(); //ДОБАВЬ!  
  Пока Спр.ПолучитьЭлемент() = 1 Цикл
38 oleg_prg
 
22.06.12
00:24
(36) я уже там )))
39 oleg_prg
 
22.06.12
00:24
7.7 Это настальжи
40 forest-rg
 
22.06.12
15:23
а можно про это по подробнее "Можешь в цикле еще добавить определение текущего времени, делай замер прошедшего времени за 1% и умножай это на оставшийся процент, таким образом можешь выводить сколько осталось времени до завершения операции"

ведь 1 % может быть и 1 заявка и может и 101 и тд...

все сделал конечный код получился такой
Процедура Сформировать()
   счетчик =0;
   КоличествоЗаявок = 0;
   
   
   
   Итог_СтЗак=0;
   Итог_Дельта=0;
   Итог_СтПер=0;
   Итог_ОплатаРуб=0;
   Итог_СуммаПер=0;
       
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(ЗапросПоЗаявкам)
   |ТекущийЭлемент = Справочник.я_СпискиЗаявокЭкспедирование.ТекущийЭлемент;
   |ДатаЗ = Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ;
   |Группировка ТекущийЭлемент без групп;
   |Условие(ДатаЗ >= Дата1);
   |Условие(ДатаЗ <= Дата2);
   |"//}}ЗАПРОС
   ;
   Запрос.Выполнить(ТекстЗапроса);
       
   Таб=СоздатьОбъект("Таблица");
   
   Таб.ВывестиСекцию("Шапка");
   СпрЗаявка=СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");
   СпрЗаявка.ВыбратьЭлементы();
   Пока СпрЗаявка.ПолучитьЭлемент()=1 цикл
       Если (СпрЗаявка.ДатаЗ>=Дата1) и ((СпрЗаявка.ДатаЗ<=Дата2)) Тогда        
           КоличествоЗаявок = КоличествоЗаявок + 1;    
       КонецЕсли;            
   КонецЦикла;
   
   Пока Запрос.Группировка(1) = 1 Цикл
       СпрЗаявка = Запрос.ТекущийЭлемент;
           

       Счетчик = Счетчик +1;
       //Находим % обработанных заявок
       ПроцентВыполнения = Счетчик / (КоличествоЗаявок/100);

       ПроцентВ=Лев(Строка(ПроцентВыполнения),4)+"%";

ПроцентВ это соответственно на форму
41 shegy
 
22.06.12
17:14
Жесть, с начало делаем цикл по справочнику и курим бамбук, а потом еще и по запросу, автор тебе же написали используй Счетчик в запросе. Мне интересно, что за база или сервак такой, что отчет 5-6 часов делается?
42 shegy
 
22.06.12
17:17
Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(ЗапросПоЗаявкам)

   |ТекущийЭлемент = Справочник.я_СпискиЗаявокЭкспедирование.ТекущийЭлемент;
   |ДатаЗ = Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ;
   |Группировка ТекущийЭлемент без групп;
   |Функция Опочки = Счётчик();
   |Условие(ДатаЗ >= Дата1);
   |Условие(ДатаЗ <= Дата2);
   |"//}}ЗАПРОС

Запрос.Выполнить(ТекстЗапроса);
КоличествоЗаявок = Запрос.Опочки;
43 oleg_prg
 
22.06.12
17:39
(42) Я все понимаю что по документации надо пользоваться запросами, НО!!! НЕ В ЭТОМ СЛУЧАЕ! НУЖЕН ЦИКЛ И ПЕРЕБОР. Я ток что накидал обработку

Процедура Сформировать()
   Сообщить("Страт "+СокрЛП(ТекущееВремя()));
   Кол = 0;
   Спр = СоздатьОбъект("Справочник.Материалы");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент() = 1 Цикл
       Кол = Кол + 1;
   КонецЦикла;
   
   Сообщить(Кол);
   Сообщить("конец тест 1 "+СокрЛП(ТекущееВремя()));
   
   
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса ="//{{ЗАПРОС(ЗапросПоЗаявкам)
   |ТекущийЭлемент = Справочник.Материалы.ТекущийЭлемент;
   //|ДатаЗ = Справочник.я_СпискиЗаявокЭкспедирование.ДатаЗ;
   |Группировка ТекущийЭлемент без групп;
   |Функция Опочки = Счётчик();
   //|Условие(ДатаЗ >= Дата1);
   //|Условие(ДатаЗ <= Дата2);
   |";//}}ЗАПРОС


   Запрос.Выполнить(ТекстЗапроса);
   КоличествоЗаявок = Запрос.Опочки;
   Сообщить("конец тест 2 "+СокрЛП(ТекущееВремя()));
КонецПроцедуры


Вот результат выполнения

Страт 16:36:32
31432   <= Кстати - это количество элементов в моем справочнике
конец тест 1 16:36:33
конец тест 2 16:36:38

СМОТРИ ВИДНО ЧТО ЦИКЛОМ ОПРЕДЕЛИЛИ КОЛИЧЕСТВО ЭЛЕМЕНТОВ ЗА 1  СЕКУНДУ!!! А ЗАПРОСОМ 5 СЕКУНД!!!

ЧТО СКАЖИТЕ ;)  shegy
44 Mikeware
 
22.06.12
17:41
За отчет 8 часов и сохранение 4 часа полагается 7 лет расстрела....
45 Попытка1С
 
22.06.12
17:51
(28) А если dbf переписать нельзя?
46 oleg_prg
 
22.06.12
17:57
(45) Да все можно, просто ТС не программист а админ, которому поручили эту задачку... Как показывает практика, там работает хреново, где мало платят, и спецов не ценят
47 Попытка1С
 
22.06.12
18:02
(43) Ну как бы ничего удивительного, единственное время выполнения модно считать через _getperformancecounter  =)
48 forest-rg
 
23.06.12
15:42
oleg_prg попробовал у себя такое сделать, получил следующее,

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

Старт 15:40:00
19359
конец тест 1 15:40:01 (1 сек)
конец тест 2 15:40:10 (9 сек)

но на деле оказалось так, в работающем отчете

когда был запрос 26 сек на обработку 56 элементов
получить элементы 28 сек на те же 56 элементов
49 mehfk
 
23.06.12
16:40
(1) Переходи на 7-ку, там это не реализовано.
50 forest-rg
 
23.06.12
21:16
а как в счетчик вставить еще несколько условий?
например выбор заказчика, они в оригинале есть но тут не хотят работать
точнее работают но не так считают. нужно если значания попадает в дату, а потом в этой дате есть заявки с определенным заказчиком то их отбирать

Процедура Сформировать()
   Сообщить("Старт "+СокрЛП(ТекущееВремя()));
   Кол = 0;
   
   Спр = СоздатьОбъект("Справочник.я_СпискиЗаявокЭкспедирование");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент() = 1 Цикл
       Если (Спр.ДатаЗ>=Дата1) и ((Спр.ДатаЗ<=Дата2))  Тогда  
           Продолжить;    
       Конецесли;
       Если(ВыбЗаказчик.Выбран()=1)и(Спр.Заказчик<>ВыбЗаказчик)Тогда
           Продолжить;
       Конецесли;        
       Кол = Кол + 1;    
   КонецЦикла;
   
   Сообщить(Кол);  
   
   Сообщить("конец тест 1 "+СокрЛП(ТекущееВремя()));
   
   
 
КонецПроцедуры
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший