Удаление сотен тысяч документов за несколько часов из УТ11



Делюсь своим опытом по удалению относительно большого количества документов (> 300 тыс) из управленческой базы УТ 11 за 7 часов.

Цель: разработать алгоритм массового удаления больших количеств документов из УТ 11 без потери ссылочности базы.

 

Мои действия (операции на серверной базе):

1. Я написал программу, которая позволяет определить количество «задействованных» типов документов в текущей базе, их соответствие таблицам sql.

программу можно посмотреть (скачать)  //infostart.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. Теперь, нужно «доочистить» все документы от оставшихся движений, пометив их на удаление (отмена проведения). Для этого, я написал вот эту программу

//infostart.ru/public/310737/

Запускаю, обработку. Распроведение всех документов составила приблизительно 2 часа.

В результате, я имею все документы базы помеченные на удаление и без движений.

 

4. Последним шагом я физически удаляю документы из базы, запустив такой скрипт

 

Для Каждого ТекДанные Из Объект.ДокументыБазы Цикл

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Данные.Ссылка КАК Ссылка
|ИЗ
| Документ." + ТекДанные.ДокументПолноеИмя + " КАК Данные";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ДокВыб = Выборка.Ссылка.ПолучитьОбъект();
ДокВыб.Удалить();

КонецЦикла;

КонецЦикла;

Все физическое удаление (по счетчику секунд) — у меня составило приблизительно 5 часов.

После завершения удаления — делаю проверку базы ТИИ — битых ссылок не обнаружил. Все документы удалены.

14 Comments

  1. Fox-trot

    По четвертому пункту. Раз уж выбрал технологию ADO, то имхо и нужно было выжимать из нее по максимуму. Документы мона удалять по уже установленному реквизиту _Marked = 1, а для подчиненных таблиц = табличных частей использовать что-то типа

    DELETE FR OM _Document218_VT4768 WHERE (_Document218_IDRRef IN (SEL ECT _IDRRef FR OM _Document218 WH ERE (_Marked = 1)))

    Получилось бы на порядок быстрее. Я гарантирую это =)

    Reply ↓
  2. aximo

    (1) согласен, но времени бы на подготовку-написание ушло бы больше

    Reply ↓
  3. Иной

    А может стоило бы посмотреть в сторону планов обмена или конвертации данных?

    Решение достаточно рискованное, в плане целостносности. И вопрос остатков не раскрыт…

    Reply ↓
  4. SemenovaMarinaV

    Очень лююопытно

    Reply ↓
  5. necropunk

    Но не очень понял код удаления из регистров — целиком регистры грохали или как? Не вижу отбора по документу, и, что такое Объект.ТаблицаСоответствия? На форме что-то? Вообще, наверное, давно пора написать нормальную обработку, которая по запросу будет брать список документов, получать имена регистров куда они пишут данные, чистить с отбором по ссылке, а потом и сами документы грохать.

    Reply ↓
  6. SemenovaMarinaV

    Согласна, хотелось бы универсальную обработку

    Reply ↓
  7. CheBurator

    ну вообщем-то надо чистить и журналы?

    документы могут также преспокойненько упоминаться в реквизитах справочников.. (не знаю как в типовых, а вообщем — не запрещено).

    .

    универсальную вещь будет написать сложно.

    Reply ↓
  8. aximo

    (7) журнал чистятся в распроведении документов. бог миловал — в моем случае в реквизитах справочников документы не упоминаются. И это подтвердило ТИИ — битых ссылок не обнаружено

    какая должна быть универсальная обработка? на все надо время просто, которого как всегда нет.

    Reply ↓
  9. jan27

    (1) удаление происходит медленнее, чем truncate. Если удаляемых документов больше чем нужно оставить, проще сделать копию таблицы, очистить её truncate, а затем скопировать нужные строки из первоначальной таблицы

    Reply ↓
  10. aximo

    (9) jan27, да кто против — делай. вопрос времени. процесс удаления регистров через delete 10 минут… выигрыш на фоне остального процесса — 7 часов — сомнителен.

    Reply ↓
  11. dunaev.anton

    в чем смысл всей затеи ? оставить только справочники и т.д. все кроме документов и их движений ?

    элементарно решается через план обмена — через создание подчиненного узла , состав которого можно полностью контролировать

    Reply ↓
  12. wowkai

    Интересный метод. я бы еще «тестирование и исправление» запустил.

    Reply ↓
  13. bforce

    (0), рекомендую посмотреть в сторону инструкции TRUNCATE вместо DELETE. Заметите существенную разницу при очистке больших таблиц.

    Непонятно, зачем нужен пункт 3. У вас документы куда-то пишут в независимые регистры? Зачем их распроводить, вы ведь и так все движения уже «убили»?

    Документы с табличными частями в пункте 4 тоже надо было удалять средсвами SQL, иначе нет смысла смотреть вообще в его сторону.

    Я могу вам набросать маленький скрипт, который выплит разом все записи документов, их табличных частей и регистров. А так получается очень сомнительный симбиоз.

    А, вообще, зачем все это? Не проще загрузить из dt чистую базу и перенести настройки учетной политики, константы и что-то нибудь еще нужное в чистую базу?

    (7), чистить еще много чего придется, например, последовательности, таблицы регистрации изменений, регистры заточенный под обмены данными, предметы взаимодействий, да мало ли чего еще там написано.

    Reply ↓
  14. alexscamp

    «без потери ссылочности базы»… не знаю что такое ссылочность базы, наверное все-таки опечатка, но даже так этот пункт не выполнен и он критичен — контроля ссылочной целостности тут нет, пожалуйста, не вводите людей в заблуждение, вдруг кто-то не прочтет комментариев и будет использовать у себя. То, что на вашей конкретной базе ТиИ не показало битых ссылок — частность (т.е. — повезло).

    «удаляю все регистры накопления», «Для физического удаления регистров» — пока не разглядишь «delete from», совершенно не понятно, что имелось ввиду. Кажется, что вы их в конфигураторе решили удалить, или прямо «физически» из БД, типа «drop table»… тоже можно конечно считать что опечатка или придирка к формулировке, но вводит в заблуждение второй раз.

    Ну и самое главное конечно — truncate а не delete, и не раскрыта тема остатков, про которые уже выше упомянули. Идеи неплохи и правильны, но с кучей оговорок, которых тут нет.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *