Удаление сотен тысяч документов за несколько часов из УТ11
Делюсь своим опытом по удалению относительно большого количества документов (> 300 тыс) из управленческой базы УТ 11 за 7 часов.
- Описание
- Подробнее
Описание
Цель: разработать алгоритм массового удаления больших количеств документов из УТ 11 без потери ссылочности базы.
Мои действия (операции на серверной базе):
1. Я написал программу, которая позволяет определить количество «задействованных» типов документов в текущей базе, их соответствие таблицам sql.
программу можно посмотреть (скачать) //sale.itcity.ru/public/310610/
запустив программу, я вижу, что в базе более 300 тыс документов, их соответствие таблицам sql, а также таблицы регистров, по которым делают движения задействованные документы базы.
2. Делаю такой ход: удаляю все регистры накопления у типов документов, количество которых больше 30000 шт.
В моем случае это документы — ПеремещениеТоваров, ЗаказКлиента, Реализация, ПКО.
Для физического удаления регистров, я воспользовался sql запросом из базы 1с, он может быть, например, таким:
СтрПодключения = "Provider=SQLOLEDB.1;Password=" + Пароль + ";Persist Security Info=True;Context connection=true;User ID="
+ Пользователь + ";Initial Catalog=" + База + ";Data Source=" + Сервер;
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрПодключения;
Connection.CommandTimeout = 600;
Попытка
Connection.Open();
Сообщить("Подключено!");
Исключение
Connection = Неопределено;
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Запрос = Новый COMОбъект("ADODB.Recordset");
Запрос.Activeconnection = Connection;
Для Каждого Стр1 ИЗ Объект.ТаблицаСоответствия Цикл
ТекстЗапроса = "DELETE FROM dbo._"+Стр1.ИмяВТаблицеБД;
Попытка
Запрос.Open(ТекстЗапроса);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЦикла;
Connection = Неопределено;
Сообщить("Выполнено!");
Время выполнения запросов по удалению регистров накопления по моим выбранным документам составило примерно 7 — 10 минут.
Захожу в «Движения документов» — вижу, что движений нет. Сработало все чисто.
3. Теперь, нужно «доочистить» все документы от оставшихся движений, пометив их на удаление (отмена проведения). Для этого, я написал вот эту программу
//sale.itcity.ru/public/310737/
Запускаю, обработку. Распроведение всех документов составила приблизительно 2 часа.
В результате, я имею все документы базы помеченные на удаление и без движений.
4. Последним шагом я физически удаляю документы из базы, запустив такой скрипт
Для Каждого ТекДанные Из Объект.ДокументыБазы Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Данные.Ссылка КАК Ссылка
|ИЗ
| Документ." + ТекДанные.ДокументПолноеИмя + " КАК Данные";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокВыб = Выборка.Ссылка.ПолучитьОбъект();
ДокВыб.Удалить();
КонецЦикла;
КонецЦикла;
Все физическое удаление (по счетчику секунд) — у меня составило приблизительно 5 часов.
После завершения удаления — делаю проверку базы ТИИ — битых ссылок не обнаружил. Все документы удалены.