Имя: Пароль:
1C
1С v8
Удаление данных из периодического регистра сведений
0 Храбрый
 
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) Удали регистр целиком, создай новый.
5 RomanYS
 
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) Протестировал, рабочий код.
Будет думаю быстрее чем через менеджер записей, за счет того, что есть дубли дат.
9 Cool_Profi
 
02.04.18
13:50
У меня именно такая задача сделана так

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

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

также в
            НаборЗаписей.Отбор.Дата.Установить(Выборка.Дата);
НаборЗаписей.Отбор.Дата.Использование = Истина;

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