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



Очистка базы (частичная) средствами 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(), достаточно раскаментировать.

37 Comments

  1. krava_vlad

    Очень было бы полезно чистить базу по фильтрам, например по организации.

    Reply
  2. Valerich

    вот ведь засаду 1с-овцы устроили со своим лицензионным соглашением.

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

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

    Reply
  3. dolter

    А не проще, соблюдая лицензионное соглашение, перегрузить в «пустышку» необходимые данные?

    Reply
  4. zzz_natali

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

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

    Reply
  5. afanasko

    Да забейте вы на «нарушение лицензионного соглашения». Там еще разобраться нужно, кто и что нарушил 🙂

    Reply
  6. Homosum
    zzz_natali пишет:

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

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

    Регистр «Списанные товары» конфигурации «Управление торговлей» Предприятие 8.1. Сам регистр не хилый — много ресурсов. Кол-во записей 404 207 030. Не знаю сколько времени нужно, через 1С удалять все это чудо, но вот из SQL через DROP and CreateTable это происходит меньше чем за секунду!

    Reply
  7. vetalvr

    (1)(2)(4) Да, наверное, в ближайшее время доработаю для универсальности.

    (3) Проще, но дольше и не интересней 🙂

    (4) На уровне SQL эта обработка очищает базу в считаные секунды, а штатными средствами на больших объемах очистка может занимать сутки, недели или вообще просто умирать от недостатка памяти.

    Reply
  8. zzz_natali

    (7) Было бы весьма кошерно, ибо: берем обычную файловую базёнку, поднимаем ее на скуле и после этого препарируем ее. Сплошь и рядом, когда ведутся несколько фирм и нужно все шевеления по какой-нить прибить. или папики ра$$ераются и начинают делить бизнес: фирма «А» — тебе, фирма «Б» — мне…

    Reply
  9. alexm73

    Очень интересная идея!

    если бы ещё для 1С 7.7, было что-то похожее…

    Reply
  10. dkprim

    да, фильтры нужны. а публикация хорошая, автору спасибо 🙂

    Reply
  11. sCHTASS

    (9) Писал в свое время обработку пометки на удаление документов за период с очисткой движений регистров. Писал с использованием 1С++. Если есть на то потребность, могу выложить.

    Reply
  12. zzz_natali

    (11)

    Было бы прекрасно, если Вы не просто выложили, а сделали бы сравнительный анализ: при прочих равных условиях, чья обработка быстрее, Ваша или ув. vetalvr (ну и вопрос «юзабилити» не на последнем месте)

    Reply
  13. vetalvr

    (12) На сколько я понял, то (11) имеет ввиду обработку для версии 7.7

    Reply
  14. sCHTASS

    (12)(13) Обработка для 1с77.

    Reply
  15. Valiko77

    Не хватает фильтра и возможности выбирать метаданные, а не только эти 3 пункта.

    А вообще полезная штука, иногда бывает очень нужна. Спасибо!

    Reply
  16. нинас

    Как раз вы вовремя, попробую, отпишу

    Reply
  17. LoboVik

    Большую помощь оказали. Пытался сам через SQL-запросы писать, но все медленно и непонятен результат. Спасибо.

    Reply
  18. AlekseiLeit

    есть возможность попробовать, отпишусь потом что получилось…

    Reply
  19. Banzai79

    а есть возможность для 1С 8.1 УТ очень нужно

    Reply
  20. Banzai79

    (6) как ты запустил обработку на 1С 8.1 подскажи пожалуйста

    Reply
  21. vetalvr

    (20) Banzai79, в (6) Homosum привел пример из собственных экспериментов, а не по этой обработке. У него даже метод другой используется.

    Reply
  22. vetalvr

    (19) Banzai79, Вам в 8.1 обработку конвертнуть?

    Reply
  23. a1ex4ndr

    (22)

    Banzai79, Вам в 8.1 обработку конвертнуть?

    Думаю не только Banzai79 будет интересна данная обработка под 8.1…

    Мне точно будет интересна 🙂

    Reply
  24. a1ex4ndr

    Похоже забыли про обработку…..

    Reply
  25. vetalvr

    (24) Не забыл. Не стал её конвертировать на предыдущие версии из следующих соображений:

    Если кто-то не может конвертнуть на предыдущие версии — значит он не программист 1С. Значит у него нет представления, как хранятся данные 1С в SQL. Обработка работает напрямую с таблицами SQL, обходя механизмы 1С, и требуется осознанное использование данной обработки. Хотя очистка средствами 1С в этой обработке тоже была реализована.

    Отброшу идейные соображения и на днях конвертну под 8.0 (чтобы открыть её под 8.1 необходимо будет открыть её в конфигураторе).

    Фильтры, наверное, таки да, тоже добавлю как-нибудь, но позже — работы очень много…

    Reply
  26. vetalvr

    (19)(20)(23) Выложил обработку под 8.1. Возможно, её нужно будет подправить в связи с особенностями 8.1.

    Reply
  27. SeiOkami

    Странно работает обработка. Запустил, выбрал тип документов, нажал «Выполнить», вылезло окошко «Выполнено». Открываю документы — ничего не изменилось. Ни один не исчез. В чем соль?

    Reply
  28. vetalvr

    (27) А можно немного подробностей?

    — 8.1 или 8.2

    — обычное или управляемое

    — что выбрано: средствами 1С или через скул?

    Reply
  29. SeiOkami

    8.2

    УТ 10.3

    через скуль.

    Reply
  30. vetalvr

    (29) Прошу прощения. В обработке для отладки временно была отключена процедура. Исправил и залил заново обработку.

    Reply
  31. a1ex4ndr
    Отброшу идейные соображения и на днях конвертну под 8.0 (чтобы открыть её под 8.1 необходимо будет открыть её в конфигураторе).

    СПС отлично работает, единственно что не понравилось — движения по регистрам рубятся только полностью, а если удалить документы то их движения остаются, может прикрутить к фильтрам по документам крыжик «удалять движение документов», или я может что то проглядел??

    Reply
  32. vetalvr

    (31) Изначально исходя из поставленной задачи обработка написана таким образом, что таблицы очищаются только полностью. Чтобы очищать таблицы не полностью или очищать связанные движения, необходимо переписывать запросы на уровне SQL (для не полного очищения таблицы использовать фильтры, для связанных движений использовать соединения). Задача в принципе не сложная для тех, кто может написать подобные запросы на языке 1С.

    Reply
  33. chmv

    Полезная вещь

    Reply
  34. _Ramzes

    А можно чтобы не удалялись предопределенные элементы?

    Reply
  35. vetalvr

    (34) _Ramzes, эта обработка очищает документы и регистры. О каких предопределенных элементах идет речь?

    Reply
  36. b-dm

    Отличная обработка, ожидается её доработка про выбор по определенным фильтрам ?

    Reply
  37. vetalvr

    (36) b-dm, пока не планировалось ввиду малого спроса

    Reply

Leave a Comment

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