Очистка базы средствами SQL (управляемое приложение)




Очистка базы средствами SQL (управляемое приложение). Полная и частичная. Любая конфигурация 1С 8.2, 8.3. Тонкий клиент, управляемое приложение, Такси

Друзья, всем бобра и счастья!

Дисклеймер! Политика 1С не разрешает никакие манипуляции с данными напрямую средствами СУБД, только средствами платформы! Поэтому качать, смотреть, думать,  а уж тем более запускать эту обработку категорически нельзя. (или можно, но только ночью, обязательно завесив окна, выключив свет и закрывшись на семь замков). Шутка, конечно же. Просто в случае безвозвратной потери данных виноваты будете Вы и только Вы. Минздрав предупредил.

Цель написания обработки единственная: создание БД для разработчика в максимально короткие сроки путем обрезки базы до минимума, необходимого для работы. Никакая целостность не проверяется и не гарантируется. Возможно, кто-то уже сталкивался с проблемой в больших компаниях, когда база 1С весит сотни гигов (по несколько млн документов в год), и развернуть каждому программисту в отделе по отдельной копии просто физически невозможно. И не рентабельно. Лучшее решение — обрезать базу, оставив в ней данные лишь за небольшой период. Но удаление большого числа объектов средствами 1С занимает очень много времени.

В качестве статистики приведу пример. 1С у меня удаляет данные со скоростью ~25 000 объектов/час, Обработка — ~2 000 000 объектов за 20 минут. Разница налицо, как говорится.

За основу идеи была взята обработка //infostart.ru/public/122546/ . За что огромное спасибо автору и долгих лет жизни. К сожалению, столкнулся с единственной проблемой — скорость работы. Поэтому решил полностью изменить алгоритм.


Как пользоваться обработкой?

Аутенфикация 

Некоторые данные для аутенфикации подтягиваются автоматически из строки соединения с ИБ, но они совсем не всегда совпадают. Поэтому необходимо ввести имя именно своего сервера SQL.

Для проверки корректности данных есть кнопочка «Проверить подключение».

Тайм-ауты можно оставить как есть. 30 сек для подключения, 1ч на выполнение запроса в СУБД. Если в процессе удаления появится ошибка «(Microsoft OLE DB Provider for SQL Server): Query timeout expired», значит, необходимо увеличить тайм-аут выполнения запроса, т.к. слишком много данных, и СУБД не успела их почистить.

 

Удаление

Удаление возможно частичное или полное.

Обработка позволяет очищать следующие объекты:

  • Документы,
  • Журналы документов,
  • Регистры сведений,
  • Регистры накопления,
  • Регистры бухгалтерии.

Полное удаление выполняется быстро через команду TRUNCATE TABLE.

Частичное удаление производится путем выбора периода удаляемых данных (отбор по полю _Period в БД).

Для Документов также автоматически очищаются таблицы, содержащие данные табличных частей документов.

Для Регистров накопления и бухгалтерии есть возможность выбора действия обработки виртуальных таблиц (Итоги, Обороты…). По хорошему, в идеале лучше всего виртуальные таблицы очищать полностью, после чего из Конфигуратора запускать Тестирование и исправление с галкой «Пересчет итогов».

Для Регистров сведений есть возможность выбора Подчиненных или Независимых. Для Подчиненных возможен отбор по периоду регистратора.

Команда «Очистить всё» последовательно проходит по всем страницам обработки и выполняет действия в зависимости от выбранных параметров.

37 Comments

  1. DoctorRoza
    Удаление возможно частичное или полное.

    Ну частичное да, а вот полное .. может просто конфу скопировать!? 🙂

    Reply ↓
  2. TTSTV

    Очищать виртуальные таблицы нельзя, т.к. их нет. Если речь о пересчете итогов, то там только одна таблица — собственно, сами итоги. Таблицы оборотов нет.

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

    Reply ↓
  3. stsasha87

    (1) DoctorRoza, имеется ввиду по объектам метаданных. Удалить полностью за весь период, либо отобрать. Я у себя наиболее используемые документы оставлял за полгода, ненужные — сносил полностью:)

    Reply ↓
  4. stsasha87

    (2) TTSTV, если взять регистр накопления(остатки или обороты), то нужно всегда помнить, что в базе sql помимо основной таблицы с данными лежит еще таблица с итогами (либо оборотами), которая скорей всего в разы больше основной. А у регистров бухгалтерии и не одна (ИтогиПоСчетамССубконто1, ИтогиМеждуСчетами, ИтогиПоСчетам…).

    Я тоже считаю, что после такой чистки запуск ТиИ пересчета итогов и переиндексации обязательны. Но возможность удалять данные из виртуальных таблиц частично я всё же оставил.

    ТиИ приходится оставлять на ночь, в моем же случае вопрос времени критичнее достоверности данных, поэтому я чистил «по-быстрому» 🙂

    Но, опять же, после пересчета итогов и переиндексации получится еще и приличная экономия места.

    Reply ↓
  5. Операция1Ы

    (4) чтобы итоги не пересчитывать можно после «обрезания» выгрузить и загрузить дтшник средствами платформы, для базы в 100гб операция загрузки занимает примерно 4 часа, выгрузка около часа, но это если не совсем уж дохлый комп.

    Reply ↓
  6. Yula89

    (4) думаю, что для торга могло бы быть актуально)

    Reply ↓
  7. polyplastic

    Автору респект. Тоже делал подобное для тестовых баз.

    И совет для удаления больших таблиц: если удаляется бОльшая часть таблицы, выгоднее сделать копию нужной части данных, очистку таблицы TRUNCATE и копирование обратно. Дело в том, что если у вас одна таблица допустим весит 40Гб, при удалении 95% ее содержимого лог базы данных вырастет примерно на 150Гб.

    Reply ↓
  8. stsasha87

    (7) polyplastic, спасибо:) дада, сталкивался с переполнением логов, поэтому удаление данных таблицы делаю в одной транзакции. Копирование+транкейт+копирование обратно как-нибудь попробую на досуге, интересна скорость отработки данного метода.

    Reply ↓
  9. WWWWW

    Спасибо автору!

    Reply ↓
  10. Anzhey

    Спасибо!!!

    Reply ↓
  11. forsagforsag

    И кто из вас украл обработку у другого?????????

    При сравнении 1с-ка показывает что они полностью идентичны.

    Reply ↓
  12. forsagforsag

    СТОП. Прошу прощения отбой ;))

    Сборщик писем подставил — повторно скачал первую обработку 🙂

    Reply ↓
  13. forsagforsag

    Таб/части справочников удаляет?

    Reply ↓
  14. stsasha87

    (13) forsagforsag, удаляет) По алгоритму сначала производится удаление табличных частей, а потом и самих документов

    Reply ↓
  15. sanfoto

    Обработка ГУД)) Мне помогло Автору респект

    ДО ЭТОГО — пробовал очистить регистр сведений (около 10 миллионов записей — SQL на дохлой тачке) — методом копирования Регистра в конфигураторе и удаления Исходного…. так вот отваливался Конфигуратор по таймауту (потом доперло что «Администрирование/Параметры информационной базы…/ Время ожидания блокировки..» — скорей всего бы помогло )

    Надоело экспериментировать… да и время кончилось… начальника ругалась))) скачал обработку выбрал регистр ... поставил галку «Удалить полностью (Truncate table)».

    Reply ↓
  16. Kontakt

    Формируется остатки на начало периода? если задан период

    Reply ↓
  17. stsasha87

    (16) Kontakt, если задается период, то удаляются данные только за этот период. Без формирования остатков. Это не свёртка, а очистка 🙂

    Reply ↓
  18. Kontakt

    (17) stsasha87, Свертку сделал на 31.12.2015 23:59:59 как теперь обрезать и не затронуть. Если период ставится в обработке лишь датой. 30.12.15 ?

    Reply ↓
  19. dimaxx

    (18) Распроведи и перенеси документы свертки на 01.01.2016. потом зачисть и верни все обратно.

    Reply ↓
  20. lexi

    ДД! в конфигурации Документооборот будет работать?

    Reply ↓
  21. stsasha87

    (20) Насколько я помню, в Документогороде большинство «документов» — это элементы справочников. У которых «Период» — это отдельный реквизит, который на sql-е скорей всего называется как _FldXXXX, а не _Period. Поэтому если делать частичное удаление по периоду, то надо сначала уточнить имя реквизита в субд и поправить в обработке. А так не вижу помех, но обязательно сначала всё пробовать на копии!

    Reply ↓
  22. Roman_SE

    Табличные части документов также как оригинальная чистит муторно и долго или переписано? Оригинальная офигевала если документов заказ покупателя под миллион… очень долго чистила даже с таймаутами дикими.

    Reply ↓
  23. ilias1210

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

    Reply ↓
  24. nicxxx

    (7) Чтобы не рос лог транзакций, надо удалять пакетами. Это если через Delete From. При этом надо запускать каждый пакет в фоновом процессе. Помогает ускорить процесс довольно заметно.

    Reply ↓
  25. savilovoa

    Добрый день!

    А данную обработку как можно переделать, чтобы через скрип запустить?

    Олег

    Reply ↓
  26. stsasha87

    (23)

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

    Да, конечно. Никто никому мешать не будет, если удалять разные регистры.

    Reply ↓
  27. stsasha87

    (25) Не совсем понял, зачем через скрипт. Если нужно какое-то периодическое удаление, можно посмотреть код и по аналогии сделать регламентное задание по удалению данных за период.

    Reply ↓
  28. savilovoa

    Для автоматизации. Думаю сделать обрезание данные и формирование БД для разработчика по скрипту. Возможно повешу это на запуск от веб-сервиса — разработчик вводит только что ему нужна свежая БД и получает ее, не имея доступа к серверам SQL и т.д.

    Reply ↓
  29. stsasha87

    (28) Я бы это делал тогда совсем без участия 1С) Скрипт на sql с примерно таким алгоритмом:

    1) Транкейтим таблицы Версии объектов и им подобные регистры с ненужными данными

    2) Идем по таблицам документов. Отбираем их по DocumentХХХХ и делаем delete по периоду

    3) Идём по таблицам регистров накопления, хозрасчетным…. Аналогично делаем delete по периоду. Не забывая про виртуальные таблицы.

    и т.д.

    И запускать такой скрипт сразу после разворачивания копии базы для разработчика. Всё на стороне субд.

    Reply ↓
  30. Timur.V

    Скачал обработку, но есть пожелание:

    сделать возможным удалять документы и все регистры по этим документам. А не отдельно документы и отдельно регистры.

    Была задача: удалить из базы все документы и связанные с ними регистры (любые). Остальное (справочники) в базе оставить.

    Reply ↓
  31. rklimat

    Спасибо! Очень помогла обработка.

    Только вот нет очистки таблицы изменений.

    Reply ↓
  32. belovo3000

    не рабортает! В регистрах сведение как были записи так и остались!

    Reply ↓
  33. bulpi

    Все бы хорошо, но автор погнался за красотой в ущерб эффективности. Для того, чтобы на форме сделать прогресс-бар, он каждый раз заново создает connection и заново его закрывает для каждого вида документа и регистра. 180 видов документов * 30 секунд на эту лабуду — получилось лишних 1.5 часа. Но можно допилить напильником 🙂

    Reply ↓
  34. Исключение

    Подскажите. Под PostgreSQL что-то подобное есть?

    Reply ↓
  35. jefjef

    (1)

    Если просто скопировать конфу и развернуть из нее новую базу, она потеряет преемственность со старой. Я это проходил, внутренние идентификаторы предопределенных объектов меняются и потом из старой подкинуть что либо средствами xml становится весьма геморно, например перекидываешь обороты по бухучету и у тебя дублируется план счетов, причем предопределенные счета. Это очень мило, ведь 1С-ка когда такое замечает сразу захлопывается.

    Reply ↓
  36. jefjef

    В принципе годная вещь. Мне нужно было грохнуть все доки с движениями в базе размером 160 гиг. За несколько часов управился. Единственное что осталось недочищенным — последовательности. Особенно партионный учет поднапрягает. Через конфигуратор уже чистится черти сколько, оставлю на ночь — пусть маслает.

    Reply ↓
  37. jefjef

    (36)

    и очистки регистров расчета не хватает

    Reply ↓

Leave a Comment

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