Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Удаление данных из периодического регистра сведений

Удаление данных из периодического регистра сведений
Я
   Храбрый
 
02.04.18 - 13:06
Есть несколько регистров сведений в которых копиться история.
Пишу регламентное задание, которое будет оставлять данные за последний год.
Например нужно почистить регистр сведений "История обмена данными".

Вот код:

НаборЗаписей = РегистрыСведений.ИсторияОбменаДанными.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
    НаборЗаписей.Отбор.Период.ЗначениеС = '00010101';
    НаборЗаписей.Отбор.Период.ЗначениеПо = ДобавитьМесяц(ТекущаяДата(),-24);
    НаборЗаписей.Прочитать();
    
    ТаблицаРегистра = НаборЗаписей.Выгрузить();
    ТаблицаРегистра.Очистить();
    НаборЗаписей.Загрузить(ТаблицаРегистра);
    НаборЗаписей.Записать(Истина); 


Ошибка при установке значения атрибута контекста (ВидСравнения)
НаборЗаписей.Отбор.Период.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
по причине:
Недопустимый тип сравнения

Могу я удалять эти данные через набор записей или придется по циклу бегать?
 
 
   Волшебник
 
1 - 02.04.18 - 13:07
ВидСравнения должен быть Равно
   Волшебник
 
2 - 02.04.18 - 13:08
Лучше используй МенеджерЗаписи, это безопаснее
   Храбрый
 
3 - 02.04.18 - 13:09
(2) Понял.
У меня регистр "РегистрацияИзмененияВОбъектах" там 4 млн. записей. Хотел 2 млн. удалить.

Придется теперь по циклу через МенеджерЗаписи бегать :(
   Волшебник
 
4 - 02.04.18 - 13:19
(3) Удали регистр целиком, создай новый.
   RomanYS
 
5 - 02.04.18 - 13:26
(3) ВЫбрать различные Период...
а потом циклом по датам, удалять наборами с отбором по периоду. Имеет смысл, если дат заметно меньше чем записей
   Храбрый
 
6 - 02.04.18 - 13:34
(4) Не пойдет, это для ежедневного регламентного задания.
   Храбрый
 
7 - 02.04.18 - 13:34
(5) Почти так и сделал.

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

            НаборЗаписей.Отбор.Дата.Установить(Выборка.Дата);
            НаборЗаписей.Отбор.Дата.Использование = Истина;
            
            НаборЗаписей.Прочитать();
            ТаблицаНабора = НаборЗаписей.Выгрузить();
            ТаблицаНабора.Очистить();
            НаборЗаписей.Загрузить(ТаблицаНабора);
            НаборЗаписей.Записать();
        КонецЦикла;
   Храбрый
 
8 - 02.04.18 - 13:35
(7) Протестировал, рабочий код.
Будет думаю быстрее чем через менеджер записей, за счет того, что есть дубли дат.
   Cool_Profi
 
9 - 02.04.18 - 13:50
У меня именно такая задача сделана так

Процедура ОчисткаИсторииОбмена() Экспорт
    
    Лог("Начало очистки");
    
    текДата = НачалоДня(ТекущаяДата());
    начДата = ДобавитьМесяц(текДата, -1);
    
    стрЗапрос = "
    |ВЫБРАТЬ КОЛИЧЕСТВО(*) как кол
    |ИЗ регистрСведений.ИсторияОбменаДанными
    |ГДЕ Период < &начдата
    |";
    Запрос = Новый ЗАпрос(стрЗапрос);
    запрос.УстановитьПараметр("начдата", начДата);
    выб = Запрос.Выполнить().Выбрать();
    выб.Следующий();
    Лог("Всего " + выб.Кол);
    
    стрЗапрос = "
    |ВЫБРАТЬ ПЕРВЫЕ 10000
    |    период, УзелИнформационнойБазы 
    |ИЗ регистрСведений.ИсторияОбменаДанными
    |ГДЕ Период < &начдата
    |УПОРЯДОЧИТЬ ПО Период
    |";
    
    Запрос = Новый Запрос(стрЗапрос);
    запрос.УстановитьПараметр("начдата", начДата);
    рез = запрос.Выполнить();
    выб = рез.Выбрать();
    сообщить("Отобрано " + выб.Количество());
    сч = 0;
    кол = выб.Количество();
    Пока выб.Следующий() Цикл
        мз = РегистрыСведений.ИсторияОбменаДанными.СоздатьМенеджерЗаписи();
        мз.Период = выб.Период;
        мз.УзелИнформационнойБазы = выб.УзелИнформационнойБазы;
        мз.Прочитать();
        Если мз.Выбран() Тогда
            мз.Удалить();
            сч = сч + 1;
            Если сч % 100 = 0 Тогда
                Лог("Удаляем " + сч + "  из  " + кол);
            КонецЕсли;
        Иначе
            сч = сч + 1;
            Продолжить;;
        КонецЕсли;
    КонецЦикла;
    Лог("Удалено " + сч + "  из  " + кол);
    лог("Завершение очистки");
КонецПроцедуры
   Cool_Profi
 
10 - 02.04.18 - 13:51
Процедура Лог(сообшение) 
    Сообщить("" + ТекущаяДата() + ":  " + сообшение);
КонецПроцедуры
 
 Рекламное место пустует
   Serg_1960
 
11 - 02.04.18 - 14:07
(7) Имхо, из всех строк оставить последнюю:

            НаборЗаписей.Прочитать();
            ТаблицаНабора = НаборЗаписей.Выгрузить();
            ТаблицаНабора.Очистить();
            НаборЗаписей.Загрузить(ТаблицаНабора);
            НаборЗаписей.Записать();
   RomanYS
 
12 - 02.04.18 - 14:09
(11) +1
также в
            НаборЗаписей.Отбор.Дата.Установить(Выборка.Дата);
НаборЗаписей.Отбор.Дата.Использование = Истина;

вторая строка не нужна
   Храбрый
 
13 - 02.04.18 - 14:16
(11) (12) Понял, спасибо

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует