Удаление сотен тысяч документов за несколько часов из УТ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 не будет опубликован. Обязательные поля помечены *