Имя: Пароль:
1C
1C 7.7
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с++.
О результатах отпишусь.