|
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): тогда и прямыми можно выносить движения - итоги то пересчитывать не надо...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |