Имя: Пароль:
1C
1С v8
Как быстро очистить СУБД
0 Sasha_H
 
21.03.12
19:29
Пожалуйста только без пафоса и по существу.

Задача така необходимо удалить все документы, кроме тех по которым есть движения по договору определенного свойства.

Я сделал так: для начала отобрал все документы которые необходимо удалить и начал помечать на удаление  - ДОЛГО!!!
просто документов в базе реально - МНОГО порядка 6 млн.
пробовал удалять по движениям тож не быстро.

Вот собственно как все делается:

Процедура ПометитьНаУдаленияИОчиститьНаборы(ПометкаУдаления=Ложь)
   
   Если Прайс.Пустая() Тогда
       Предупреждение("Необходимо выбрать прайс, по которому не должны удалятся документы!");
       Возврат;
   КонецЕсли;    
   
   ЭлементыФормы.ИндикаторВсего.Значение = 0;
   ЭлементыФормы.ИндикаторТек.Значение = 0;
   
   Запрос = Новый Запрос("ВЫБРАТЬ
   |    ЗначенияСвойствОбъектов.Объект
   |ИЗ
   |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
   |ГДЕ
   |    ЗначенияСвойствОбъектов.Свойство В
   |            (ВЫБРАТЬ
   |                Константы.VWGСвойствоПрайс
   |            ИЗ
   |                Константы)
   |    И ЗначенияСвойствОбъектов.Значение <> &Прайс");
   
   Запрос.УстановитьПараметр("Прайс",Прайс);
   РезЗапр = Запрос.Выполнить();
   ВыборкаДоговора = РезЗапр.Выбрать();
   ЭлементыФормы.ИндикаторВсего.МаксимальноеЗначение = ВыборкаДоговора.Количество();
   Сч1 = ВыборкаДоговора.Количество();
   
   НачатьТранзакцию();
   СчетчикТранзакций=0;
   Состояние("Помечаются на удаление...");
   
   Пока ВыборкаДоговора.Следующий() Цикл
       
       сч1=сч1-1;
       
       ЭлементыФормы.ИндикаторВсего.Значение = ЭлементыФормы.ИндикаторВсего.Значение+1;
       ОбработкаПрерыванияПользователя();
       
       ЗапросКритерий = Новый Запрос("ВЫБРАТЬ
       |    ДокументыПоДоговоруКонтрагента.Ссылка КАК ТекущийДокумент
       |ИЗ
       |    КритерийОтбора.ДокументыПоДоговоруКонтрагента(&Значение) КАК ДокументыПоДоговоруКонтрагента
       |ГДЕ
       |    (НЕ ДокументыПоДоговоруКонтрагента.Ссылка.ПометкаУдаления)");
       
       ЗапросКритерий.УстановитьПараметр("Значение",ВыборкаДоговора.Объект);
       
       РезЗапрКрит = ЗапросКритерий.Выполнить();
       ВыборкаПоДокументам = РезЗапрКрит.Выбрать();
       ЭлементыФормы.ИндикаторТек.МаксимальноеЗначение = ВыборкаПоДокументам.Количество();
       ЭлементыФормы.ИндикаторТек.Значение = 0;
       
       сч2= ВыборкаПоДокументам.Количество();
       Пока ВыборкаПоДокументам.Следующий() Цикл
           
           сч2=сч2-1;
           
           СчетчикТранзакций=СчетчикТранзакций+1;
           ЭлементыФормы.ТекТаблица.Заголовок = ВыборкаПоДокументам.ТекущийДокумент.Метаданные().Синоним;
           ЭлементыФормы.ИндикаторТек.Значение = ЭлементыФормы.ИндикаторТек.Значение+1;
           ЭлементыФормы.ПредставлениеОбъекта.Заголовок = ВыборкаПоДокументам.ТекущийДокумент;
           ОбработкаПрерыванияПользователя();
           
           УдаляемыйОбъект = ВыборкаПоДокументам.ТекущийДокумент.ПолучитьОбъект();
           ДвиженияОбъекта = УдаляемыйОбъект.Движения;
           
           Если Не ПометкаУдаления Тогда
               
               Для каждого НаборДвижений из ДвиженияОбъекта Цикл
                   
                   ИмяТаблицы = НаборДвижений.Метаданные().Имя;
                   Если ОбщегоНазначения.ПринадлежностьКлассуМетаданных("РегистрыНакопления",НаборДвижений.Метаданные()) Тогда
                       
                       НаборЗаписей = РегистрыНакопления[ИмяТаблицы].СоздатьНаборЗаписей();
                       НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.ТекущийДокумент);
                       //НаборЗаписей.Прочитать();
                       НаборЗаписей.Записать();
                       
                   ИначеЕсли ОбщегоНазначения.ПринадлежностьКлассуМетаданных("РегистрыСведений",НаборДвижений.Метаданные()) Тогда
                       
                       НаборЗаписей = РегистрыСведений[ИмяТаблицы].СоздатьНаборЗаписей();
                       НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.ТекущийДокумент);
                       //НаборЗаписей.Прочитать();
                       НаборЗаписей.Записать();
                       
                   ИначеЕсли ОбщегоНазначения.ПринадлежностьКлассуМетаданных("РегистрыБухгалтерии",НаборДвижений.Метаданные()) Тогда    
                       
                       НаборЗаписей = РегистрыБухгалтерии[ИмяТаблицы].СоздатьНаборЗаписей();
                       НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаПоДокументам.ТекущийДокумент);
                       //НаборЗаписей.Прочитать();
                       НаборЗаписей.Записать();
                       
                   КонецЕсли;    
                   
               КонецЦикла;    
               
           КонецЕсли;
           
           Если ПометкаУдаления Тогда
               УдаляемыйОбъект.УстановитьПометкуУдаления(Истина);
           КонецЕсли;
           
           Если СчетчикТранзакций >= 200 Тогда
               Состояние("Запись транзакции...");ЗафиксироватьТранзакцию();
               НачатьТранзакцию(); Состояние("Помечаются на удаление...");
               СчетчикТранзакций=0;
           КонецЕсли;
           
           Состояние("Помечаются на удаление... "+СчетчикТранзакций);
           
       КонецЦикла;    
       
   КонецЦикла;    
   
   ЗафиксироватьТранзакцию();
   
   ЭлементыФормы.ИндикаторВсего.Значение = 0;
   ЭлементыФормы.ИндикаторТек.Значение = 0;
   
КонецПроцедуры
1 simol
 
21.03.12
19:32
1) перенести в файловую
2) отключить итоги
2 МихаилМ
 
21.03.12
19:39
с какой скоростью удаляются доки сейчас ?
3 Sasha_H
 
21.03.12
19:41
она уже трое суток стояла. Правда нюанс еще есть єта база как специфичная на САТА винте.
4 Sasha_H
 
21.03.12
19:43
как отключать итоги правильно и потом подключить обратно?

с учетом того, что обработина может упасть
5 werdin
 
21.03.12
19:45
СУБД - Система Управления Базами Даных
wiki:Система_управления_базами_данных
6 Maxus43
 
21.03.12
19:46
(5) 1с файловая не СУБД?
7 Sasha_H
 
21.03.12
19:47
єто не файловая, она на скуле
8 Maxus43
 
21.03.12
19:48
(7) тогда сабж некорректен)
9 Sasha_H
 
21.03.12
19:48
(5) бред малька
10 Sasha_H
 
21.03.12
19:50
(8) ага. согласен. имел ввиду одно написал другое.
11 kod263
 
21.03.12
19:50
простейший вариант:
1. сделать копию базы, выгрузить cf
2. удалить в конфигурации документ, сохранить изменения
3. загрузить cf
4. перенести из копии документы с договором определенного свойства с использование обработки XML между одинак конфигурациями
12 floody
 
21.03.12
19:53
на рамдиск базу
13 Sasha_H
 
21.03.12
20:02
(12) секса много, эта база просто готовится для определенных целей и не требует потом к себе никакого быстродействия
14 Sasha_H
 
21.03.12
20:03
Отключил итоги - удаление пошустрее пошло, буду наблюдать
15 Maxus43
 
21.03.12
20:04
6 млн доков? количество в транзакции увеличь, 200 - мало. ставь 1000