Доброго времени суток.
Есть независимый непериодический РС с более чем тысячами строк.
Нужно удалить записи на определенную дату.
Схема такая всего этого действия: "в лоб" получаю запросом строки из РС которые должны быть удалены, обхожу выборку и удаляю строки в РС через МенеджерЗаписи.
Проблема в том что на этапе получения данных запросом, иногда база висит, а когда доходит до удаления, то после несколько тысяч удаленных строк, сеанс завершается с ошибкой(
Решил попробовать получить записи запросом постепенно, используя "выбрать первые".
Схема такая:
1. Пишу текст запроса использую выбрать первые. Размер определяю 500. Использую левое соединение с созданной ТЗ для исключения уже полученных записей.
2. Открываю цикл "пока истина"
3. Устанавливаю параметры
4. В обходе выборки запроса, заполняю ТЗ выборкой, после заполняю значения измерений,ресурсов,реквизитов РС, читаю, удаляю
Но ошибка никуда не делась, код выполняется долго и база "висит".
Может где-то ошибка в логике получения данных и обработкой порциями?
Пример кода:
Есть независимый непериодический РС с более чем тысячами строк.
Нужно удалить записи на определенную дату.
Схема такая всего этого действия: "в лоб" получаю запросом строки из РС которые должны быть удалены, обхожу выборку и удаляю строки в РС через МенеджерЗаписи.
Проблема в том что на этапе получения данных запросом, иногда база висит, а когда доходит до удаления, то после несколько тысяч удаленных строк, сеанс завершается с ошибкой(
Решил попробовать получить записи запросом постепенно, используя "выбрать первые".
Схема такая:
1. Пишу текст запроса использую выбрать первые. Размер определяю 500. Использую левое соединение с созданной ТЗ для исключения уже полученных записей.
2. Открываю цикл "пока истина"
3. Устанавливаю параметры
4. В обходе выборки запроса, заполняю ТЗ выборкой, после заполняю значения измерений,ресурсов,реквизитов РС, читаю, удаляю
Но ошибка никуда не делась, код выполняется долго и база "висит".
Может где-то ошибка в логике получения данных и обработкой порциями?
Пример кода:
МенеджерЗаписи = РегистрыСведений.СведенияОТоварах.СоздатьМенеджерЗаписи();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.ИД КАК ИД,
| ТЗ.КодТовара КАК КодТовара
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ВТ_ТЗ
|
|ИНДЕКСИРОВАТЬ ПО
| ИД,
| КодТовара
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 500
| СведенияОТоварах.ИД КАК ИД,
| СведенияОТоварах.КодТовара КАК КодТовара,
| СведенияОТоварах.Категория КАК Категория,
| СведенияОТоварах.ДатаСведений,
................остальные 15 полей................................................
|ИЗ
| РегистрСведений.СведенияОТоварах КАК СведенияОТоварах
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТЗ КАК ВТ_ТЗ
| ПО СведенияОТоварах.ИД = ВТ_ТЗ.ИД
| И СведенияОТоварах.КодТовара = ВТ_ТЗ.КодТовара
|ГДЕ
| ВТ_ТЗ.ИД ЕСТЬ NULL
| И СведенияОТоварах.Организация = &Организация
| И СведенияОТоварах.ДатаСведений >= &ДатаНачала
| И СведенияОТоварах.ДатаСведений <= &ДатаОкончания";
Пока Истина Цикл
Запрос.УстановитьПараметр("ТЗ", ВТ_ТЗ);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ВТ_ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
МенеджерЗаписи.Прочитать();
МенеджерЗаписи.Удалить();
КонецЦикла;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Быстрая пометка на удаление документов для Свертки (используется 1С++)
- Выборочное удаление помеченных объектов с отображением иерархии ссылок (с возможностью немонопольного удаления, порционного удаления, быстрой очистки регистров сведений для управляемых форм 1С 8.2)
- Передача большого количества объектов через Web-сервисы
- Удаление записей регистров с отбором
- Неограниченное количество строк в табличной части документа
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) если тех, которые требуется удалить больше, чем тех, которые надо оставить, то выбрать запросом записи из РС, которые надо оставить, создать набор записей, загрузить туда результат запроса и записать с замещением.
Как вариант (уже поэтапный) - сделать копию РС, перенести туда все записи из оригинального, оригинальный почистить и потом переносить из клона (можно поэтапно) правильные записи. В конце клон удалить (я бы, кстати, не удалял - пить/есть не просит, а вдруг что надо будет выдернуть).
Как вариант (уже поэтапный) - сделать копию РС, перенести туда все записи из оригинального, оригинальный почистить и потом переносить из клона (можно поэтапно) правильные записи. В конце клон удалить (я бы, кстати, не удалял - пить/есть не просит, а вдруг что надо будет выдернуть).
(9)Вы удаляете записи из регистра.
Нет этих первых 150 записи после удаления. УДАЛЕНЫ ОНИ.
Первыми 150 будут уже другие записи.
Следующий запрос новой порции записей выполняется после удаления предыдущей порции.
Поэтому достаточно выбирать просто первые ххх записей с нужным отбором и удалять их.
Никакая таблица для доп. проверки не нужна.
Нет этих первых 150 записи после удаления. УДАЛЕНЫ ОНИ.
Первыми 150 будут уже другие записи.
Следующий запрос новой порции записей выполняется после удаления предыдущей порции.
Поэтому достаточно выбирать просто первые ххх записей с нужным отбором и удалять их.
Никакая таблица для доп. проверки не нужна.
добавил до цикла создание менеджера записи.
Убрал проверку на доп.таблицу.
Ограничил выборку 100 записями.
При удалении больше 50 тыс записей РС, платформа выдает ошибку "Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:"
Убрал проверку на доп.таблицу.
Ограничил выборку 100 записями.
При удалении больше 50 тыс записей РС, платформа выдает ошибку "Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:"
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот