Очистка регистра Версии Объектов


Очистка регистра Версии Объектов — пожалуй самого быстрорастущего регистра в базе (v. 1.1)

Если в вашей базе включен режим отслеживания истории изменения объектов, это очень помогает в поиске КТО, С ЧЕМ, КОГДА и ЧТО сделал в информационной базе. Однако этот режим заставляет регистр Версии Объектов, расти как на дрожжах. И в скором времени таблица этого регистра будет самой большой в базе.
Данная обработка позволяет очищать этот регистр.
Проблема в том, что если этот регистр весит уже гигабайт или больше, то очистка регистра займёт очень продолжительное время и может привести к ошибке памяти 1С. Для избежания этого, была добавлена возможность частичного удаления регистра. Для этого достаточно указать номер начальной и конечной версии, которые Вы хотите удалить.

5 Comments

  1. petrov_al

    А почему бы не удалять самые старые по периоду…

    Reply
  2. pepe

    (1) Я с вами согласен. Я даже видел пример удаления, не помню у кого. Я на основании его создал регламентное задание.

    Процедура УдалитьВерсии()
    //Очистка регистра версионирования, по истечению срока хранения
    КоличествоДней = Константы.ХранениеВерсионированияДней.Получить();
    Если КоличествоДней > 0 Тогда
    ДатаПо = НачалоДня(ТекущаяДата()) — КоличествоДней *60*60*24;
    ЗаписьЖурналаРегистрации(«ОчистаВерсий», УровеньЖурналаРегистрации.Информация, , , «Очистка регистра сведений версии объекта, до: » + Формат(ДатаПо, «ДЛФ=DD»));
    
    ЗапросДаты = Новый Запрос;
    
    ЗапросДаты.Текст=»ВЫБРАТЬ РАЗЛИЧНЫЕ
    | НАЧАЛОПЕРИОДА(ВерсииОбъектов.ДатаВерсии, ДЕНЬ) КАК ДатаВерсии
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | НАЧАЛОПЕРИОДА(ВерсииОбъектов.ДатаВерсии, ДЕНЬ) <= &ДатаПо
    |
    |УПОРЯДОЧИТЬ ПО
    | ДатаВерсии»;
    
    ЗапросДаты.Параметры.Вставить(«ДатаПо»,ДатаПо);
    
    ВыборкаДаты = ЗапросДаты.Выполнить().Выбрать();
    
    Пока ВыборкаДаты.Следующий() Цикл
    
    ОчиститьНаДату(ВыборкаДаты.ДатаВерсии);
    
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    
    Процедура ОчиститьНаДату(ДатаОчистки)
    
    ЗапросОчистка = Новый Запрос;
    
    ЗапросОчистка.Текст = «ВЫБРАТЬ
    | ВерсииОбъектов.Объект,
    | ВерсииОбъектов.НомерВерсии,
    | ВерсииОбъектов.ВерсияОбъекта,
    | ВерсииОбъектов.АвторВерсии,
    | ВерсииОбъектов.ДатаВерсии,
    | ВерсииОбъектов.Сжато
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.ДатаВерсии >= &НачПериода
    | И ВерсииОбъектов.ДатаВерсии <= &КонПериода»;
    
    ЗапросОчистка.Параметры.Вставить(«НачПериода»,НачалоДня(ДатаОчистки));
    ЗапросОчистка.Параметры.Вставить(«КонПериода»,КонецДня(ДатаОчистки));
    
    Выборка = ЗапросОчистка.Выполнить().Выбрать();
    
    НовыйНомерВерсии=1;
    
    Пока Выборка.Следующий() Цикл
    ВерсииОбъектов = РегистрыСведений.ВерсииОбъектов;
    
    МенеджерЗаписиИИО = ВерсииОбъектов.СоздатьМенеджерЗаписи();
    МенеджерЗаписиИИО.Объект       = Выборка.Объект;
    МенеджерЗаписиИИО.НомерВерсии  = Выборка.НомерВерсии;
    МенеджерЗаписиИИО.Прочитать();
    
    МенеджерЗаписиИИО.Объект       = Справочники.Номенклатура.ПустаяСсылка();
    МенеджерЗаписиИИО.НомерВерсии  = НовыйНомерВерсии;
    МенеджерЗаписиИИО.ВерсияОбъекта = Неопределено;
    МенеджерЗаписиИИО.Записать();
    
    НовыйНомерВерсии=НовыйНомерВерсии+1;
    
    КонецЦикла;
    
    НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Справочники.Номенклатура.ПустаяСсылка());
    НаборЗаписей.Записать();
    
    //Сообщить («за: «+Формат(ДатаОчистки,»ДЛФ=DD»)+» очищено «+НовыйНомерВерсии+» записей.» ,СтатусСообщения.Внимание);
    
    КонецПроцедуры
    
    

    Показать

    Reply
  3. worker1c

    Удаляя версии объектов, теряется история изменения объектов. Предлагаю более «мягкий» вариант оптимизации регистра «Версии объектов»: Удалять записи в которых не содержится изменений относительно предыдущей записи. Обработка здесь: http://infostart.ru/public/150314/

    Работает она конечно намного дольше вашей, но результат того стоит

    Reply
  4. serge_focus

    И чем кардинально отличается данная обработка, от представленных здесь в изобилии бесплатных обработок? 😉

    Reply
  5. serge_focus

    А еще с подобной задачей может справиться так называемый «чистильщик» регисторов -также на infostart.ru присутствует где-то.

    Или стандартный механизм от 1С:

    ———————————————————————————

    Сервис — прочие обмены — универсальный обмен хмл — удаление данных

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *