Имя: Пароль:
1C
1C 7.7
v7: Очень медленно удаляются документы из базы 1С 7.7 на SQL2000
,
0 niks77
 
27.06.13
18:40
Что можно оптимизировать? А то получается, что трое суток понадобится. Оно может и хорошо, но хочется оптимизировать алгоритм...

Процедура Сформировать()
  Док=СоздатьОбъект("Документ");
  Док.ВыбратьДокументы(ДатаНач,ДатаКон);
  Пока (Док.ПолучитьДокумент()=1) Цикл    
         Сообщить(Строка(Док.НомерДок)+"  "+Док.ДатаДок);
         Док.СделатьНеПроведенным();    
         Док.Удалить(1);    
  КонецЦикла;
КонецПроцедуры
1 Fragster
 
гуру
27.06.13
18:42
(0) 1с++ и ReconnectNative каждые 10 документов
2 Fragster
 
гуру
27.06.13
18:42
а если непосредственное удаление - то вообще прямым запросом грохнуть все документы и движения, пересчитать итоги.
3 Fragster
 
гуру
27.06.13
18:43
4 niks77
 
27.06.13
19:03
В прямых запросах я не силен, но когда-то надо начинать...
5 palpetrovich
 
27.06.13
19:05
выгрузить в файловую, удалить "лишние" файлы - все остальные загрузить обратно ..ну или "рядом" :)
6 Fragster
 
гуру
27.06.13
19:05
(5) там по дате
7 palpetrovich
 
27.06.13
19:09
(6) не факт ...или, ой, доки с 2001-го по 2013,  а удалить надо с 2005-го по 2007-й?
8 Fragster
 
гуру
27.06.13
19:11
(7) ну так про (что-нибудь подобное) "свертку базы до 3-х последних лет" слышал когда-нибудь?
9 МихаилМ
 
27.06.13
19:16
в транзакции по 500-1000 документов.

реконнектнэйтив через 1000-2000 документов.
10 palpetrovich
 
27.06.13
19:17
дык, давно живу, много чего слышал ..автору то пофик по-ходу..
11 niks77
 
27.06.13
19:28
2(10) дай Бог и еще прожить, а автор решил SQL поизучать...
12 МихаилМ
 
27.06.13
19:49
зачит лет 10 автора нас не побеспокоит, коли за 5 лет не разобрался с 1с77
13 niks77
 
27.06.13
20:34
2(12) В течении 10 лет, чтобы база не простаивала решил немного ускорить процесс:
Процедура Сформировать()
  Док=СоздатьОбъект("Документ");    
  УстановитьТАна(ДатаТА);
  НачатьТранзакцию();
  Док.ВыбратьДокументы(ДатаНач,ДатаКон);
  i=0;
  Пока (Док.ПолучитьДокумент()=1) Цикл    
         Сообщить(Строка(Док.НомерДок)+"  "+Док.ДатаДок);
         Док.СделатьНеПроведенным();    
         Док.Удалить(1);    
         i=i+1;      
         Если (i>=200) Тогда
          ЗафиксироватьТранзакцию();
          i=0;
          НачатьТранзакцию();    
       КонецЕсли;
   КонецЦикла;
   ЗафиксироватьТранзакцию();
КонецПроцедуры
14 Fragster
 
гуру
27.06.13
20:38
А я всегда делал

Если Сч % 100 = 0 Тогда
 Состояние("" + Сч + "/" + Всего);
КонецЕсли;

Чтобы счетчик не обнулять
15 Обработка
 
27.06.13
20:59
(0) А разве вам наплевать что могут быть ссылки на документы?
если наплевать то можно прям в скуле грохнуть любые доки за любой период. Букавально за 10 мин. Конечно при этом надо удалять и его движения тоже.
16 Обработка
 
27.06.13
21:02
(0) Возьми куски кода от стандартных обработок свертки.

1. Делаешь ввод остаков
2. Удаление движений у доков и потом сами доки можно удалять хоть целый месяц не спеша.

Я сейчас в базе 81 не спеша удаляю помечение доки после свертки. Ибо база больша и комп слабый.
17 Эльниньо
 
27.06.13
21:03
ТА на 1-й удаляемый док поставь.
18 МихаилМ
 
27.06.13
21:08
(16)
если база болшая - значит sql -> удалите прямым запросом
19 niks77
 
27.06.13
21:10
2(15) В данном случае можно смело удалять...
2(17) Так и поставил...
2(18) Прямые запросы еще не обкатал...
20 niks77
 
27.06.13
21:26
2(14) можно и так - такой код чуть-чуть быстрее работать будет. Fragster, благодарю за помощь.
Все доки за два года уже обрезал - разница по производительности между первоначальным кодом и поздним раз в 40-50...
21 Lionee
 
27.06.13
21:54
Док.СделатьНеПроведенным();
зачем? сразу
Док.Удалить(1);
22 niks77
 
27.06.13
21:57
2(21) А "хвосты" в базе никакие не "зависнут"?
23 palpetrovich
 
27.06.13
22:27
(22) однозначено "зависнут", при любом выбранном варианте ...да и вообще - основная работа при обрезка базы начинается после обрезки (цы) я, прямо ща :)
24 Lionee
 
27.06.13
23:06
(22) у тебя время тратится на распроведение
25 Lionee
 
27.06.13
23:06
хвоста канечно
26 Lionee
 
27.06.13
23:06
хвосты
27 Злой Бобр
 
28.06.13
03:47
(0) Я надеюсь вы понимаете что удаляете?.. Ну и про бекап тоже незабыли?..
Если за 5 лет неделали такого - может проще кого-то нанять? Хотя одной упавшей базой больше или меньше - особо ситуацию неизменит.
28 Dolly_EV
 
28.06.13
07:29
(0) Вот: http://infostart.ru/public/59521/

вот она же, немного подправленная (есть возможность удалить только движения, оставив сами доки): http://rghost.ru/47067729

после процедуры пересчитать регистры вот этим: http://www.dev.citykirov.ru/dlcount.php?url=http://dev.citykirov.ru/APSetup.zip

на все-про-все в базе ~30Гб - мин.15-20
29 Dolly_EV
 
28.06.13
07:33
(0) +(28) Ну и как бэ .. стоит на копии попробовать))
30 ProxyInspector
 
28.06.13
07:51
0. Переносишь остатки и периодические реквизиты
1. ТА устанавливаешь на первый документ
2. С помощью 1С++ запросами помечаешь на удаление документы и удаляешь движения помеченных на удаление документов
3. Восстанавливаешь ТА
4. Не спеша удаляешь помеченные на удаления документы

 У нас база порядка 17 GB и 2 млн документов. По времени свертка занимает, на рабочей станции:
0 - перенос остатков - 3 мин
1 - ТА на первый документ - 1 мин
2 - пометка на удаление - 10 мин
3 - восстановление ТА - 5 мин
4 - удаление документов без ссылок ( 1 млн док) - 5 часов. Это можно делать и не монопольно
31 Mikeware
 
28.06.13
08:06
(30) Еще проще:
фиксируешь остатки по регистрам спецдокументом (а-ля двигатель регистров) прямой записью.
Удаляешь все движения по регистрам до даты.
Удаляешь документы, на которые нет ссылок после даты (и в периодике)
чистишь периодику
--------
все это запихивается в планировщик, и отрабатывает каждый месяц в часы наименьшей нагрузки (когда  работает 2-3-4 человека), оставляя в базе последние 3 года.
32 Андрей_Андреич
 
naïve
28.06.13
08:08
А непосредственное удаление в цикле выборку не сбивает?
33 КонецЦикла
 
28.06.13
08:20
(32) Выборка объектов не сбивается
34 vde69
 
28.06.13
08:25
удаляй документы в обратном порядке, от самого последнего к первому.
35 Злопчинский
 
28.06.13
19:36
(31) а что вы пихаете в реквизиты регистров при проведении по регистрам универсальным двигателем..?
36 Mikeware
 
28.06.13
19:40
остатки. в принципе, можно ничего не пихать, просто оставлять остатки в регистре. Но тогда есть шанс по.рить регистр случайным пересчетом, что я однажды лет пяток назад сделал...