gifts2017

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

Опубликовал Виталий (vetalvr) в раздел Администрирование - Чистка базы

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

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

Постановка задачи (придуманная, но вполне реальная): Начать заново ведение учета в существующей ИБ (не свертка, а так называемый "рестарт").

Анализ поставленной задачи: Для рестарта нам необходимо сохранить все константы, все справочники, некоторые документы (например, по установке цен или по принятию сотрудников) и некоторые регистры сведений (не подчиненные регистратору). В классическом варианте, конечно же, необходимо взять чистую ИБ и в неё загрузить все необходимые данные из текущей ИБ. Т.к. конфигурации идентичные, то это сделать не сложно через XML. Но, для понимания структуры хранения и целостности данных в SQL, был принят к рассмотрению вариант очистки «лишних» данных средствами SQL.

Алгоритм выполнения поставленной задачи:
1. Средствами SQL удаляем: выборочные документы, все журналы документов, все последовательности, выборочные бизнес-процессы и задачи.
2. Средствами SQL удаляем: выборочные регистры сведений (не подчиненных регистратору).
3. Средствами SQL удаляем: все регистры сведений (подчиненные регистратору), все регистры накопления, все регистры бухгалтерии, все регистры расчета (в т.ч. перерасчеты) и все планы обмена.
4. Запустить штатный механизм удаления помеченных на удаление (т.к. во 1-ых: Планы обмена в данном механизме не удаляются через SQL, а на них устанавливается пометка удаления; во 2-ых: Обычно существуют элементы справочников, которые помечены на удаление, а удалить их раньше было нельзя, т.к. использовались в документах).
5. В конфигураторе запустить «Тестирование и исправление».
6. Перепровести документы, не удаленные в п.1.

Особенность выполнения обработки: все таблицы хранения данных в ИБ получаются с помощью метода ПолучитьСтруктуруХраненияБазыДанных(), а удаляются с помощью команды SQL: TRUNCATE TABLE [ИмяТаблицы] (кроме планов обмена, на которые просто устанавливается пометка удаления. Планы обмена необходимо удалять штатными средствами, т.к. есть предопределенные элменты и регистрация изменений).

Жду комментарии специалистов по поводу целостности ИБ при использовании такого подхода.

 

Обновление от 11.01.2013
Добавлена версия обработки под 8.1
Правда, поставить сервер 8.1 и протестировать один нюанс не было времени.
Поэтому опишу его сдесь.
В 8.1 у метода ПолучитьСтруктуруХраненияБазыДанных() в оличии от 8.2 отсутствует 2-ой параметр, отвечающий, в каких терминах выдается информация о структуре хранения. Поэтому, возможно, в коде необходимо подредактировать имена таблиц. Это реализовано в модуле обработки в последней процедуре ОчиститьОбъектыНаУровнеSQL(), достаточно раскаментировать.

Скачать файлы

Наименование Файл Версия Размер
Очистка базы 8.2 214
.rar 20,86Kb
04.03.13
214
.rar 20,86Kb Скачать
Очистка базы 8.1 18
.rar 12,99Kb
11.01.13
18
.rar 12,99Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Владимир Кравчук (Power Team) (krava_vlad) 15.11.11 20:36
Очень было бы полезно чистить базу по фильтрам, например по организации.
cleaner_it; +1 Ответить 3
2. Валерий Дубовой (Valerich) 16.11.11 02:52
вот ведь засаду 1с-овцы устроили со своим лицензионным соглашением.

Как-то надо было свернуть базу. Быстро. Вырезать из нее лет 5 интенсивной работы. Документов накоплено ну ОЧЕНЬ много. Сделал попытку пометить на удаление документы одного вида за 1 год и удалить. Пометка на удаление длилась часов 5. Удаление не смогло выполниться - умерло на стадии контроля ссылочной целостности - памяти не хватило. В итоге пришлось крошить данные прямо в SQL. Руками. Делая запросы к каждой таблице.

Так что дорабатывайте свою обработку до коммерческого использования с использованием хотя бы простейших условий и ограничений, например, по дате документа. Спрос, думаю, будет.
3. Андрей Вахрин (dolter) 16.11.11 03:07
А не проще, соблюдая лицензионное соглашение, перегрузить в "пустышку" необходимые данные?
4. Наталия Мастербатова (zzz_natali) 16.11.11 08:21
Какая-нить есть статистика? Сколько по времени/размеру базу схлопывали?
(1) Да, было бы полезно в разрезе организации и на дату(интервал)
5. Dmitry Afanasyev (afanasko) 16.11.11 09:55
Да забейте вы на "нарушение лицензионного соглашения". Там еще разобраться нужно, кто и что нарушил :)
iov; Lo1jke; Oleg_nsk; German; +4 Ответить
6. Sergey Spevak (Homosum) 16.11.11 10:19
zzz_natali пишет:

Какая-нить есть статистика? Сколько по времени/размеру базу схлопывали?

(1) Да, было бы полезно в разрезе организации и на дату(интервал)


Регистр "Списанные товары" конфигурации "Управление торговлей" Предприятие 8.1. Сам регистр не хилый - много ресурсов. Кол-во записей 404 207 030. Не знаю сколько времени нужно, через 1С удалять все это чудо, но вот из SQL через DROP and CreateTable это происходит меньше чем за секунду!
7. Виталий (vetalvr) 16.11.11 13:14
(1)(2)(4) Да, наверное, в ближайшее время доработаю для универсальности.
(3) Проще, но дольше и не интересней :-)
(4) На уровне SQL эта обработка очищает базу в считаные секунды, а штатными средствами на больших объемах очистка может занимать сутки, недели или вообще просто умирать от недостатка памяти.
sibunica@mail.ru; +1 Ответить 1
8. Наталия Мастербатова (zzz_natali) 16.11.11 14:09
(7) Было бы весьма кошерно, ибо: берем обычную файловую базёнку, поднимаем ее на скуле и после этого препарируем ее. Сплошь и рядом, когда ведутся несколько фирм и нужно все шевеления по какой-нить прибить. или папики ра$$ераются и начинают делить бизнес: фирма "А" - тебе, фирма "Б" - мне...
cleaner_it; +1 Ответить
9. AlexM (alexm73) 16.11.11 19:19
Очень интересная идея!
если бы ещё для 1С 7.7, было что-то похожее...
10. Александр Иванов (dkprim) 17.11.11 06:09
да, фильтры нужны. а публикация хорошая, автору спасибо :)
11. Станислав Шепталов (sCHTASS) 18.11.11 10:14
(9) Писал в свое время обработку пометки на удаление документов за период с очисткой движений регистров. Писал с использованием 1С++. Если есть на то потребность, могу выложить.
12. Наталия Мастербатова (zzz_natali) 18.11.11 12:30
(11)
Было бы прекрасно, если Вы не просто выложили, а сделали бы сравнительный анализ: при прочих равных условиях, чья обработка быстрее, Ваша или ув. vetalvr (ну и вопрос "юзабилити" не на последнем месте)
13. Виталий (vetalvr) 18.11.11 12:37
(12) На сколько я понял, то (11) имеет ввиду обработку для версии 7.7
14. Станислав Шепталов (sCHTASS) 18.11.11 19:55
15. Vitaliy 1 (Valiko77) 23.11.11 12:17
Не хватает фильтра и возможности выбирать метаданные, а не только эти 3 пункта.
А вообще полезная штука, иногда бывает очень нужна. Спасибо!
16. Нина (нинас) 30.11.11 06:37
Как раз вы вовремя, попробую, отпишу
17. Vitya Bog (LoboVik) 20.12.11 18:16
Большую помощь оказали. Пытался сам через SQL-запросы писать, но все медленно и непонятен результат. Спасибо.
18. Алексей Лейт (AlekseiLeit) 21.12.11 12:42
есть возможность попробовать, отпишусь потом что получилось...
19. Erbolat Akkusov (Banzai79) 27.12.11 12:09
а есть возможность для 1С 8.1 УТ очень нужно
20. Erbolat Akkusov (Banzai79) 27.12.11 12:22
(6) как ты запустил обработку на 1С 8.1 подскажи пожалуйста
21. Виталий (vetalvr) 27.12.11 15:58
(20) Banzai79, в (6) Homosum привел пример из собственных экспериментов, а не по этой обработке. У него даже метод другой используется.
22. Виталий (vetalvr) 27.12.11 16:08
(19) Banzai79, Вам в 8.1 обработку конвертнуть?
23. Александр *** (a1ex4ndr) 21.11.12 10:34
(22)
Banzai79, Вам в 8.1 обработку конвертнуть?

Думаю не только Banzai79 будет интересна данная обработка под 8.1...
Мне точно будет интересна :)
24. Александр *** (a1ex4ndr) 04.12.12 11:42
Похоже забыли про обработку.....
25. Виталий (vetalvr) 04.12.12 13:25
(24) Не забыл. Не стал её конвертировать на предыдущие версии из следующих соображений:
Если кто-то не может конвертнуть на предыдущие версии - значит он не программист 1С. Значит у него нет представления, как хранятся данные 1С в SQL. Обработка работает напрямую с таблицами SQL, обходя механизмы 1С, и требуется осознанное использование данной обработки. Хотя очистка средствами 1С в этой обработке тоже была реализована.

Отброшу идейные соображения и на днях конвертну под 8.0 (чтобы открыть её под 8.1 необходимо будет открыть её в конфигураторе).
Фильтры, наверное, таки да, тоже добавлю как-нибудь, но позже - работы очень много...
26. Виталий (vetalvr) 11.01.13 18:07
(19)(20)(23) Выложил обработку под 8.1. Возможно, её нужно будет подправить в связи с особенностями 8.1.
27. Виталий Черненко (SeiOkami) 02.03.13 10:33
Странно работает обработка. Запустил, выбрал тип документов, нажал "Выполнить", вылезло окошко "Выполнено". Открываю документы - ничего не изменилось. Ни один не исчез. В чем соль?
28. Виталий (vetalvr) 04.03.13 14:30
(27) А можно немного подробностей?
- 8.1 или 8.2
- обычное или управляемое
- что выбрано: средствами 1С или через скул?
29. Виталий Черненко (SeiOkami) 04.03.13 15:07
30. Виталий (vetalvr) 04.03.13 18:02
(29) Прошу прощения. В обработке для отладки временно была отключена процедура. Исправил и залил заново обработку.
31. Александр *** (a1ex4ndr) 04.07.13 18:03
Отброшу идейные соображения и на днях конвертну под 8.0 (чтобы открыть её под 8.1 необходимо будет открыть её в конфигураторе).

СПС отлично работает, единственно что не понравилось - движения по регистрам рубятся только полностью, а если удалить документы то их движения остаются, может прикрутить к фильтрам по документам крыжик "удалять движение документов", или я может что то проглядел??
32. Виталий (vetalvr) 05.07.13 12:43
(31) Изначально исходя из поставленной задачи обработка написана таким образом, что таблицы очищаются только полностью. Чтобы очищать таблицы не полностью или очищать связанные движения, необходимо переписывать запросы на уровне SQL (для не полного очищения таблицы использовать фильтры, для связанных движений использовать соединения). Задача в принципе не сложная для тех, кто может написать подобные запросы на языке 1С.
33. Марина Чирина (chmv) 10.07.13 13:53
34. Роман Гаманец (_Ramzes) 30.08.13 22:16
А можно чтобы не удалялись предопределенные элементы?
35. Виталий (vetalvr) 31.08.13 14:30
(34) _Ramzes, эта обработка очищает документы и регистры. О каких предопределенных элементах идет речь?
36. Dmitry Bas (b-dm) 07.11.14 10:54
Отличная обработка, ожидается её доработка про выбор по определенным фильтрам ?
37. Виталий (vetalvr) 11.11.14 22:06
(36) b-dm, пока не планировалось ввиду малого спроса
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа