|
Удаление данных из периодического регистра сведений | ☑ | ||
---|---|---|---|---|
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) Понял, спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |