|
v7: Удалить много элементов справочника быстро в 7.7 | ☑ | ||
---|---|---|---|---|
0
Хуан_Перейро
14.12.12
✎
11:08
|
Здравствуйте!
Подскажите какие есть идеи, как можно за короткое время удалить много элементов одного справочника в 1С 7.7. Стандартно - перебором каждого элемента, занимает много времени. Справочник включен в конфигурацию, поэтому доступ к нему через объект XBase и использование метода ОчиститьФайл() - не приносит результатов. Заранее спасибо за ответ. |
|||
1
Скользящий
14.12.12
✎
11:08
|
дбфку справочника грохнуть, потом заполнить нужное.
|
|||
2
Godofsin
14.12.12
✎
11:09
|
файловая?
|
|||
3
Хуан_Перейро
14.12.12
✎
11:10
|
(2) Да, файловая версия.
(1) Сейчас это так и реализовано, но это все таки варварский метод. |
|||
4
Mikeware
14.12.12
✎
11:11
|
Ну удаляй в транзакции...
|
|||
5
Хуан_Перейро
14.12.12
✎
11:12
|
(4) Использование транзакции тоже не дает производительности при удалении.
|
|||
6
Voronve
14.12.12
✎
11:13
|
(5) Кусками по 200-300 элементов удаляй в транзакции
|
|||
7
Mikeware
14.12.12
✎
11:17
|
(5)"мальчик жестом объяснил, что его зовут Хуан"©
просто не умеешь... |
|||
8
Хуан_Перейро
14.12.12
✎
11:18
|
(6) Пробовал. Такой метод используется в обработке загрузки на диске итс. Результат незначительный. Все равно ждешь до 15 минут.
|
|||
9
Хуан_Перейро
14.12.12
✎
11:20
|
Я только рад это научиться))
|
|||
10
Voronve
14.12.12
✎
11:21
|
(8) Удаляешь сразу или только метишь на удаление ?
|
|||
11
Хуан_Перейро
14.12.12
✎
11:21
|
(7) Я только рад этому научиться, но может помимо транзакции существуют какие-нибудь альтернативные методы работы?
|
|||
12
Voronve
14.12.12
✎
11:22
|
(11) Альтернативный - грохать дбф'ку. Пересоздавать и заполнять по новой
|
|||
13
Хуан_Перейро
14.12.12
✎
11:27
|
Это то, что используется сейчас. Жду 15-20 минут.
Процедура ОчиститьВ_штрих1() СпрШК1 = СоздатьОбъект("Справочник.в_Штрих1"); СпрШК1.ВыбратьЭлементы(0); НачатьТранзакцию(); Попытка Пока СпрШК1.ПолучитьЭлемент() = 1 Цикл СпрШК1.Удалить(1); КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; КонецПроцедуры; |
|||
14
Хуан_Перейро
14.12.12
✎
11:28
|
(10) Удаляю.
|
|||
15
Voronve
14.12.12
✎
11:28
|
(13) Попытка зачем ?
|
|||
16
Хуан_Перейро
14.12.12
✎
11:32
|
(12) Сейчас этот метод используется, точнее аналогичный, я просто копирую с заменой чистую дбф с индексом в каталог базы.
Но такие пляски приводят либо к вылету 1С либо к бесполезности такого копирования, файл остается заполненным. Т.е. после выполнения такой процедуры туда нужно еще лезть и смотреть что справочник действительно пустой. |
|||
17
Dolly_EV
14.12.12
✎
11:32
|
Процедура ОчиститьВ_штрих1()
СпрШК1 = СоздатьОбъект("Справочник.в_Штрих1"); Сч=1; НачатьТранзакцию(); СпрШК1.ВыбратьЭлементы(0); Пока СпрШК1.ПолучитьЭлемент() = 1 Цикл СпрШК1.Удалить(1); Сч=Сч+1; Если Сч>200 Тогда ЗафиксироватьТранзакцию(); Сч=1; НачатьТранзакцию(); КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); КонецПроцедуры; |
|||
18
Хуан_Перейро
14.12.12
✎
11:34
|
(15) В случае если что-то не получилось, откатить всю транзакцию.
|
|||
19
Voronve
14.12.12
✎
11:37
|
Как в 17 - пробовал ?
|
|||
20
Базис
naïve
14.12.12
✎
11:40
|
Тебе же сказали - по 100-500 штук делай, конкретный размер подбирается опытным путём, замеряя интервал между транзакциями. (Внезапно подумал, что это может зависеть от структуры dbf).
|
|||
21
palpetrovich
14.12.12
✎
11:47
|
прикольное имя справочника "в_Штрих1" :)
(0) уверен что на удаляемые элементы нигде ссылок нет? |
|||
22
Voronve
14.12.12
✎
11:51
|
(21) Он на прямую удаляет
|
|||
23
palpetrovich
14.12.12
✎
11:53
|
(22) ну дык, я и пытаюсь намекнуть, может не надо это делать?
тем более что "акие пляски приводят либо к вылету 1С " (цы)(16) |
|||
24
Песец
14.12.12
✎
11:55
|
(0) По несколько раз в день что ли удаляешь? Сколько элементов удаляется? К чему такая спешка? Ночью удалить не спеша никак?
|
|||
25
bushd
14.12.12
✎
11:56
|
(13) Так из за тарнзакции долго.
|
|||
26
bushd
14.12.12
✎
11:57
|
(5) Оно ее ухудшает в большинстве случаев.
|
|||
27
bushd
14.12.12
✎
11:58
|
+(26) По крайне мере в файловой версии.
|
|||
28
Voronve
14.12.12
✎
12:00
|
Походу 17 скосила ТС, больше не появиться
|
|||
29
Песец
14.12.12
✎
12:07
|
(24+) ... а если ни на один элемент справочника нет ссылок, зачем он вообще в конфигурации? Может, не трубы, а всю систему грохнуть?
|
|||
30
Хуан_Перейро
14.12.12
✎
12:09
|
(19) На текущем кол-ве элементов в справочнике, 8163 шт:
- метод 17 дает результат 7,1 секунды. - метод без разбивания транзакции 8,4 секунды. Сейчас загоню в справочник больше элементов, отпишусь о результатах. ))) |
|||
31
Voronve
14.12.12
✎
12:10
|
(30) Эммм ... милионами записей в дбф ворочаешь ?
|
|||
32
varelchik
14.12.12
✎
12:17
|
А ты с ссылками как?
|
|||
33
varelchik
14.12.12
✎
12:18
|
самый простой вариант
используй OLEDB и простым запросом truncate table sc... |
|||
34
BlackSeaCat
14.12.12
✎
12:21
|
По-моему, уже пора требовать от автора описания ВСЕЙ задачи, а не только "как быстро удалить туеву хучу элементов?"
Потому что лично мне непонятно - что за справочник такой, который надо регулярно (насколько я понял) и быстро очищать полностью? Дело может осложниться еще и тем, что не вся информация из справочника может храниться в единственной DBFке, например, периодические реквизиты - совсем в другой файле, грохать который нельзя. Может оказаться, что лучше держать эту инфу, например, не в справочнике, а во внешнем DBF, а для работы считывать его в список значений. Тогда быстрое удаление будет делаться в две строки кода: очистил СЗ, очистил DBF. |
|||
35
Ёпрст
14.12.12
✎
12:35
|
(33) там нет трункейте
|
|||
36
Касандер72
14.12.12
✎
12:43
|
про 1Cpp упоминали? ))) (там DELETE есть в прямом)
|
|||
37
Ёпрст
14.12.12
✎
12:45
|
если надо удалить все (и наплевать на ссылочную целостность) - грохни табличку справочника, если по условию - delete + where
|
|||
38
Туц
14.12.12
✎
13:03
|
(0) используй внешнюю sql базу.
|
|||
39
varelchik
14.12.12
✎
13:18
|
(36) это если выборочно.
(33) мгновенно все данные. |
|||
40
varelchik
14.12.12
✎
13:19
|
(35) звиняйте, привык к SQL и решил что у ОЛИ тоже есть.
ну тогда только delete |
|||
41
Ёпрст
14.12.12
✎
13:19
|
(39) ну нету трункейт в оледб, ну нету.
|
|||
42
Ёпрст
14.12.12
✎
13:20
|
там всё проще, дел sc* ручонками
|
|||
43
Хуан_Перейро
14.12.12
✎
13:21
|
(39) Выборочно не нужно, справочник грохается полностью.
|
|||
44
Ёпрст
14.12.12
✎
13:22
|
(43) откой словарик, найди имя таблички твоего справоника, удали соотв. дбф-ку от него и сдикс.. всё, наслаждайся
|
|||
45
Хуан_Перейро
14.12.12
✎
13:22
|
(33) Не пробывал такой метод, где взять информацию по нему?
|
|||
46
varelchik
14.12.12
✎
13:22
|
(43) Кажуть грохи и создай заново.
че непоняткого то? |
|||
47
varelchik
14.12.12
✎
13:23
|
(45) 1cv7.dd в корне базы
|
|||
48
varelchik
14.12.12
✎
13:23
|
(45) 1cpp.ru
|
|||
49
Хуан_Перейро
14.12.12
✎
15:22
|
(48) Всем спасибо за идеи, буду пробывать 1с++.
О результатах отпишусь. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |