Имя: Пароль:
1C
 
Нужен совет: как быстро удалить данные до датыХ в РС Версии объектов
0 1Cpr
 
20.01.17
11:59
Всем привет.
Учитывая, что в РС  Версии объектов, у нас пишется очень много данных по изменениям, возникла необходимость его подчистить до определенной датыХ. Но вот проблема, он огромен, количество записей - почти бесконечность. База файловая КА 8.2 последняя доступная платформа 130. Подсчитать хотя бы количество записей, тоже не вариант, запрос зависает насмерть, отжирает всю память и мрет.

У кого есть проверенные лично варианты удаления записей из РС, но так, чтобы это оперативно произошло, например не более 30 - 60 мин.
Заранее спасибо за помощь.
1 1Cpr
 
20.01.17
12:09
ап
2 depthzer0
 
20.01.17
12:24
Можно попробовать выгрузить всё что нужно начиная с датыХ, потом зачистить регистр полностью и загрузить обратно, то что выгрузили.
3 Aleksey
 
20.01.17
12:25
В типовой БП есть регламентное задание по очистки. Настрой расписание и пусть по ночам чистит
4 Фрэнки
 
20.01.17
12:37
интересно, что хранение самих версий объектов отделено от записей регистра. Поэтому нужно не просто так похерить записи в регистре, а удалять данные по ссылке. Не, быстро и только сам регистр - этого делать не желательно
5 Вафель
 
20.01.17
12:44
удалить регистр в конфигураторе, потом загузить изначальную конфу
6 Evgueni
 
20.01.17
13:42
ЗапросОчистка = Новый Запрос;

    ЗапросОчистка.Текст = "ВЫБРАТЬ
    |    ВерсииОбъектов.Объект,
    |    ВерсииОбъектов.НомерВерсии,
    |    ВерсииОбъектов.ВерсияОбъекта,
    |    ВерсииОбъектов.АвторВерсии,
    |    ВерсииОбъектов.ДатаВерсии
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |    ВерсииОбъектов.ДатаВерсии >= &НачПериода
    |    И ВерсииОбъектов.ДатаВерсии <= &КонПериода";
    
    ЗапросОчистка.Параметры.Вставить("НачПериода",НачалоДня(ДатаОчистки));
    ЗапросОчистка.Параметры.Вставить("КонПериода",КонецДня(ДатаОчистки));
    
    Выборка = ЗапросОчистка.Выполнить().Выбрать();
    
    НовыйНомерВерсии=1;
    
    Пока Выборка.Следующий() Цикл
        ВерсииОбъектов = РегистрыСведений.ВерсииОбъектов;
        
        МенеджерЗаписиИИО = ВерсииОбъектов.СоздатьМенеджерЗаписи();
        МенеджерЗаписиИИО.Объект       = Выборка.Объект;
        МенеджерЗаписиИИО.НомерВерсии  = Выборка.НомерВерсии;
        МенеджерЗаписиИИО.Прочитать();
        
        МенеджерЗаписиИИО.Объект       = Справочники.Номенклатура.ПустаяСсылка();
        МенеджерЗаписиИИО.НомерВерсии  = НовыйНомерВерсии;
        МенеджерЗаписиИИО.ВерсияОбъекта = Неопределено;
        МенеджерЗаписиИИО.Записать();
        
        НовыйНомерВерсии=НовыйНомерВерсии+1;
        
    КонецЦикла;
    
    НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Справочники.Номенклатура.ПустаяСсылка());
    НаборЗаписей.Записать();
    

Но это не быстро, зато вроде правильно
7 Heckfy
 
20.01.17
14:06
"Но вот проблема, он огромен, количество записей - почти бесконечность" - не верю. Ибо не вяжется с "База файловая". У файловой базы ограничение на размер внутренней таблицы 4 ГБ.

"Подсчитать хотя бы количество записей, тоже не вариант, запрос зависает насмерть, отжирает всю память и мрет" - Нефиг ссылки в запрос пихать.
Вот так посчитает:

    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    КОЛИЧЕСТВО(*) КАК Кол
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |    ВерсииОбъектов.Период <= &Период"
    ;
    Запрос.УстановитьПараметр("Период",ДатаХ);
    РезультатЗапроса=Запрос.Выполнить().Выбрать();
    РезультатЗапроса.Следующий();
    Сообщить(РезультатЗапроса.Кол);

"например не более 30 - 60 мин" - при озвученном в топике не вариант.

Где то нарыл, переделай под себя и запускай. Никому мешать не будет и просаживать по памяти не будет:


    ЕстьЗаписи=Истина;
    Пока ЕстьЗаписи Цикл
        Запрос=Новый Запрос;
        Запрос.Текст=
        "ВЫБРАТЬ ПЕРВЫЕ 10000
        |    ВерсииОбъектов.Объект,
        |    ВерсииОбъектов.НомерВерсии,
        |    ВерсииОбъектов.ВерсияОбъекта,
        |    ВерсииОбъектов.АвторВерсии,
        |    ВерсииОбъектов.ДатаВерсии,
        |    ВерсииОбъектов.Комментарий,
        |    ВерсииОбъектов.ТипВерсииОбъекта,
        |    ВерсииОбъектов.ВерсияПроигнорирована,
        |    ВерсииОбъектов.РазмерДанных,
        |    ВерсииОбъектов.КонтрольнаяСумма,
        |    ВерсииОбъектов.ЕстьДанныеВерсии
        |ИЗ
        |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов"
        ;
        Запрос.УстановитьПараметр("Период",СократитьПоДату);
        РезультатЗапроса=Запрос.Выполнить().Выбрать();
        Если РезультатЗапроса.Количество()=0 Тогда
            ЕстьЗаписи=Ложь;
        Иначе
            Пока РезультатЗапроса.Следующий() Цикл
                МЗ=РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
                ЗаполнитьЗначенияСвойств(МЗ,РезультатЗапроса,,);
                МЗ.Удалить();
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
8 Azverin
 
20.01.17
14:55
а я в КА 1.1 раз в полгода запускаю обработку по удалению одинаковых записей в РС "Версии объекта". процентов 20% удаляет каждый раз. чистить как ТС пока нет необходимости.
9 1Cpr
 
20.01.17
17:50
Всем спасибо!
Действительно быстро работает этот вариант:
////////получаем количество записей в РС до чистки    
Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    КОЛИЧЕСТВО(*) КАК Кол
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |    ВерсииОбъектов.ДатаВерсии <=&НачПериода"
    ;
    Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачПериода));
    РезультатЗапроса=Запрос.Выполнить().Выбрать();
    РезультатЗапроса.Следующий();
    Сообщить(РезультатЗапроса.Кол);
    
    
    ЕстьЗаписи=Истина;
    номерцикла=0;
    
    Пока ЕстьЗаписи Цикл
        номерцикла=номерцикла+1;
        Сообщить("начало обработки в этом цикле "+ТекущаяДата() +" ЦИКЛ № "+номерцикла);
        Запрос=Новый Запрос;
        Запрос.Текст=
        "ВЫБРАТЬ ПЕРВЫЕ 10000
        |    ВерсииОбъектов.АвторВерсии КАК АвторВерсии,
        |    ВерсииОбъектов.Объект КАК Объект,
        |    ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии,
        |    ВерсииОбъектов.НомерВерсии,
        |    ВерсииОбъектов.ВерсияОбъекта,
        |    ВерсииОбъектов.УдалитьСжато,
        |    ВерсииОбъектов.Комментарий,
        |    ВерсииОбъектов.ТипВерсииОбъекта,
        |    ВерсииОбъектов.ВерсияПроигнорирована
        |ИЗ
        |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
        |ГДЕ
        |    ВерсииОбъектов.ДатаВерсии < &НачПериода"
        ;
        Запрос.УстановитьПараметр("НачПериода",НачалоДня(НачПериода));
        РезультатЗапроса=Запрос.Выполнить().Выбрать();
        Если РезультатЗапроса.Количество()=0 Тогда
            ЕстьЗаписи=Ложь;
        Иначе
            Пока РезультатЗапроса.Следующий() Цикл
                МЗ=РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
                ЗаполнитьЗначенияСвойств(МЗ,РезультатЗапроса,,);
                МЗ.Удалить();
            КонецЦикла;
        КонецЕсли;
        Сообщить("конец обработки в этом цикле "+ТекущаяДата()+" ЦИКЛ № "+номерцикла);
    КонецЦикла;


отдельное спасибо (7)
За 50 минут по выполнению выше описанного было удалено более 1 млн записей.
Закон Брукера: Даже маленькая практика стоит большой теории.