Имя: Пароль:
1C
1C 7.7
v7: Как быстро удалить список документов в 1с77 торговля склад
,
0 VBMADD
 
23.12.12
19:49
Привет братьям по разуму.

Запустил обратотку на выполнение, а там оказалось 100 000 документов.
Уже 5 часов удаляет а конца не видно.

можно ли как то ускорить такой процесс, как для этого нужно модернизировать обработку

Процедура Выполнить()
//================================
Док = СоздатьОбъект("Документ.Чек");
   Док.ВыбратьДокументы(Дата1,Дата2);
   Колво=0;
   Пока Док.ПолучитьДокумент() = 1 Цикл
       Колво = Колво + 1;
   КонецЦикла;
Сообщить("Всего чеков - " + Колво);

   Пока Док.ПолучитьДокумент() = 1 Цикл
       Док.СделатьНеПроведенным();
       Состояние(Колво + "Удален Чек № " + СокрЛП(Док.НомерДок) + " от " + Док.ДатаДок);
       Док.Удалить();
       Колво = Колво + 1;
   КонецЦикла;
КонецПроцедуры


Спасибо всем кто откликнулся
1 Torquader
 
23.12.12
19:51
Чего-то у вас в обработке совсем не то написано.
По крайней мере, второй цикл выполняться не должен.

Потом, полезно удаление "завернуть" в транзакцию по 10-100 документов - будет быстрее.
Также нежелательно удалять документы сразу в выборке.
2 Скользящий
 
23.12.12
19:52
А не проще дбфку с нужным документом грохнуть? )
3 Cthulhu
 
23.12.12
19:53
(2): а движения - хренсними, Ок.
4 ДенисЧ
 
23.12.12
19:53
(3) А ТИИ на что? :-)
5 Torquader
 
23.12.12
19:54
(2) Во-первых, dbf-ки может быть и две (а иногда и ни одной), но журнале ссылки на документ останутся, да и распровести нужно, чтобы не было движений в регистрах от неизвестно кого.
6 Мимохожий Однако
 
23.12.12
19:54
Процедура Выполнить()
//================================

Док = СоздатьОбъект("Документ.Чек");
   Док.ВыбратьДокументы(Дата1,Дата2);
   Колво=0;
   Пока Док.ПолучитьДокумент() = 1 Цикл
   //    Колво = Колво + 1;
   //КонецЦикла;
//Сообщить("Всего чеков - " + Колво);

 //  Пока Док.ПолучитьДокумент() = 1 Цикл
       Док.СделатьНеПроведенным();
       Состояние(Колво + "Удален Чек № " + СокрЛП(Док.НомерДок) + " от " + Док.ДатаДок);
       Док.Удалить();
    //   Колво = Колво + 1;
   КонецЦикла;
КонецПроцедуры
7 VBMADD
 
23.12.12
19:54
Вот это выполняется но долго

Док = СоздатьОбъект("Документ.Чек");
   Колво=0;
Док.ВыбратьДокументы(Дата1,Дата2);
   Пока Док.ПолучитьДокумент() = 1 Цикл
        Док.СделатьНеПроведенным();
        Состояние(Колво + "Удален Чек № " + СокрЛП(Док.НомерДок) + " от " + Док.ДатаДок);
        Док.Удалить();
        Колво = Колво + 1;
   КонецЦикла;
8 Cthulhu
 
23.12.12
19:55
(4): быстрое такое, угу...
9 Torquader
 
23.12.12
19:55
Не - ребята - съезд дятлов в другой ветке - конечно - есть много способов - запоганить базу, но удалить dbf-это как раз из этого.
10 ДенисЧ
 
23.12.12
19:56
Док.ВыбратьДокументы(Дата1,Дата2);
сч = 0;
начать транзакцию();
   Пока Док.ПолучитьДокумент() = 1 Цикл
         Док.СделатьНеПроведенным();
        Состояние(Колво + "Удален Чек № " + СокрЛП(Док.НомерДок) + " от " + Док.ДатаДок);
        Док.Удалить();
        Колво = Колво + 1;

сч = сч +1;
Если сч >= 1000 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
   КонецЦикла;
ЗафиксироватьТранзакцию();
11 VBMADD
 
23.12.12
19:56
(6) Это выполняется но уж очень медленно, а хотца как бы побыстрее
12 VBMADD
 
23.12.12
19:57
(10) это будет быстрее ?
Почему?
13 Cthulhu
 
23.12.12
19:57
(10): так оно будет начиная с 1000-го документа на каждом документе фиксировать транзакцию... вот времени-то сэкономится!.. )))
14 Torquader
 
23.12.12
19:57
НачатьТранзакцию();
сч=1;
Колво=0;
док = СоздатьОбъект("Документ.Чек");
Док.ВыбратьДокументы(Дата1,Дата2);
Пока Док.ПолучитьДокумент() = 1 Цикл
Док.СделатьНеПроведенным();
Состояние(Колво + "Удален Чек № " + СокрЛП(Док.НомерДок) + " от " + Док.ДатаДок);
Док.Удалить();
сч=сч+1;
Колво = Колво + 1;
Если сч>100 Тогда
 ЗафиксироватьТранзакцию();
 сч=1;
 НачатьТранзакцию();
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
15 Скользящий
 
23.12.12
19:59
Прямыми запросами можно быстро удалить. но это надо темой владеть )
16 Torquader
 
23.12.12
20:00
100 000 чеков - ну вы и наторговали под новый год.
17 ДенисЧ
 
23.12.12
20:00
(13) Ви непоеврите, но таки да, оно будет таки быстрее. На дбф.
18 VBMADD
 
23.12.12
20:01
(15) Ну дык раскрой тепу то по подробней...
19 ДенисЧ
 
23.12.12
20:01
(12) Транзакции - они, с**а, такие... Пока не зафиксируешь - в памяти сидят... (для дбф)
20 Torquader
 
23.12.12
20:02
(15) Основное время тратится на "СделатьНепроведенным" - его прямыми запросами очень сложно ускорить, так как нужно смотреть все движения, которые этот документ формирует, и удалять их.
А удаление - оно и штатно быстро выполняется.
21 VBMADD
 
23.12.12
20:04
(17) Эдак процентов на 5 бастрее что ли
Вон спец про запросы тему поднял а раскравать подробней не хочет...
(20) Может убрать из обработки сделать непроведенным...
22 Torquader
 
23.12.12
20:07
(21) И чем это поможет ?
Распроведение документов - достаточно медленная операция, и ускорить её можно только прямым выполнением того, что делает 1С при распроведении документа.
При удалении система сама распрводит документ, так что убирать эту команду не стоит.
23 VBMADD
 
23.12.12
20:10
Запустил обработку от (14) с транзакциями засек время будем посмотреть
24 Базис
 
naïve
23.12.12
20:14
ТА уже вспомнили?
25 Скользящий
 
23.12.12
20:15
(18) Мне специалист по прямым запросам удалял документы из базы скульной где было около 25млн документов. В дбф вряд ли поможет. )
26 Cthulhu
 
23.12.12
20:17
(17): Ви не поверите, но таки у Вас чито-то с глазами или где-то между ними и затылком. прочитать попробуйте по слогам и мой комментарий, и Ваш код (в котором обнуление щоччика при фиесации транзакций так мило позабыто).
27 Скользящий
 
23.12.12
20:17
Поскольку база была бух, код тебе мало поможет. Сначала удалялись периодические реквизиты, потом очистка движений документов, потом удаление документов с контролем ссылочной целостности.

Для примера как удалялись движения в скуле.
Процедура Сформировать()
   Мета = СоздатьОбъект("MetaDatawork");
   Запрос = СоздатьОбъект("ODBCRecordset");
   Запрос.УстановитьТекстовыйПараметр("ВыбОперация",ВыбОперация);
   Сообщить("Время начала: "+ТекущееВремя());
   ТекстЗапроса = "
   |delete from _1sentry where Date_Time_DocId<:ВыбОперация~~~~";
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   
   ТекстЗапроса = "
   |delete from _1soper where Date_Time_DocId<:ВыбОперация~~~~";
   Запрос.УстановитьТекстовыйПараметр("ВыбОперация",ВыбОперация);
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТекстЗапроса = "
   |drop table [dbo].[_1SSBSEL]";
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТекстЗапроса = "
   |drop table [dbo].[_1SACCSEL]";
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТекстЗапроса = "
   |drop table _1sbkttl";
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТекстЗапроса = "
   |drop table _1sbkttlc";
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТекстЗапроса = "
   |update _1sjourn set closed = 0, ismark = 1 where Date_Time_Iddoc<:ВыбОперация~~~~";
   Запрос.УстановитьТекстовыйПараметр("ВыбОперация",ВыбОперация);
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   
   Сообщить("Время окончания: "+ТекущееВремя());
КонецПроцедуры
28 Тьма
 
23.12.12
20:21
(24)Прямые запросы проще, непонятно, что ли.
29 VBMADD
 
23.12.12
20:29
(28) Если знаешь как дык черкни основной код
30 VBMADD
 
23.12.12
20:30
Вобщем за 10 минут порядка 6000 документов удаляет по коду от(14)
31 VBMADD
 
23.12.12
20:31
Не ошибся за 20 минут
32 Мимохожий Однако
 
23.12.12
20:33
Иногда полезно ТА поставить перед дата1
33 Torquader
 
23.12.12
20:42
(30) С транзакциями проще прерывать транзакцию (Зафиксировать Начать) после трёх-четырёх секунд выполнения - как показала практика, система упирается в кеширование памяти на диск и кардинальное замедление работы как только не хватает места для хранения сделанных изменений.
34 Cthulhu
 
23.12.12
23:18
(32): тогда и прямыми можно выносить движения - итоги то пересчитывать не надо...
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.