Очистка клиент-серверных вариантов баз 1С 8.X

Программирование - Практика программирования

Текст SQL запроса предназначенный для очистки таблиц документов, регистров накоплений и регистров бухгалтерии.
Работает на SQL 2000 на 2005 наверное тоже но не проверял.

Все наверное сталкивались с необходимостью быстро очистить базу данных от документов. Но средствами платформы это растягивается н довольно продолжительный период времени. Я пошел простым путем: очищаем в SQL все таблицы документов и регистров и останется только вручную очистить регистры сведений привязанные к регистратору.

Вот собственно текст SQL запроса:

 


DECLARE @sql varchar(500)
DECLARE c CURSOR FOR
--Получаем список таблиц документов и регистров document-документы и табличные части, accnt-регистры бухгалтерии, accttl- итоги по регистрам бухгалтерии, accum- регистры накопления с итогами 
SELECT [name] FROM sysobjects WHERE (name LIKE '%document%' or name LIKE '%accnt%' or name LIKE '%accttl%' or name LIKE '%accum%') AND xtype = 'U'
OPEN c
--цикл по отобранным таблицам
FETCH NEXT FROM c INTO @sql
WHILE @@FETCH_STATUS = 0
    BEGIN
--Формируем текст для очищения таблицы
        SET @sql = 'delete from ' + @sql
--Выполняем очищение таблицы
        --EXEC (@sql)
        PRINT @sql
        FETCH NEXT FROM c INTO @sql
    END
CLOSE c
DEALLOCATE c

Внимание в приведенном выше запросе закоментирована строка выполяющая очищение таблицы (EXEC...).
Выполнение запроса с раскомментированой строкой выполнять на свой страх и риск.

 

См. также

Комментарии
1. Андрей Куришко (boggonzikov) 325 16.01.09 10:25 Сейчас в теме
Полезная вещь, особенно для подготовки базы для разработки из реальной, как правило огромной Рабочей базы.
Только еще не хватает условия по дате.
Т.е. хочу в базе оставить только данные за 1 месяц. Подскажи как сделать?
2. Виталий (PVG_73) 16 16.01.09 11:06 Сейчас в теме
Помнится такую же хрень я писал для 7.7.... :)
Удобная весчь, особенно когда режишь или клонируешь бызы...
можно добавить и справочники и исключения по ним, если в этом есть необходимость...
3. Gamm (Gamm) 13 16.01.09 15:17 Сейчас в теме
(1) Вот вариант кода который очистит регистры с периодом больше заданной и все документы.
С документами побольше написать надо. Чтоб в начале пробежаться по табличным частям и их очистить и только потом сами таблицы документов.
Будет время уделю этому внимания.
Begin
SET @sql = 'delete from ' + @sql +' where _Period>=CONVERT(DATETIME, ''''2008-01-01 00:00:00'''', 102)'
PRINT @sql
End
else --иначе просто очищаем таблицу командой truncate которая сработает быстрее чем delete
SET @sql = 'truncate ' + @sql
4. Gamm (Gamm) 13 16.01.09 15:34 Сейчас в теме
Если дополнительных отборов не нужно советую заменить строчку
SET @sql = 'delete from ' + @sql
на строчку
SET @sql = 'truncate ' + @sql

5. Андрей Куришко (boggonzikov) 325 16.01.09 17:51 Сейчас в теме
(3)
>пробежаться по табличным частям
Как раз этого и не хватает, я не давно тоже писал похожую обработку, но из-за не знания СКЛ, пошел другим путем, через 1С. Получал структуру данных и название таблиц хранения, а затем простыми запросами удалял. Типа

|TRUNCATE _" + таблица + "" ;
или
|DELETE
|
|From _" + таблица + " WHERE _" + таблица + "._period < DATE '2008-03-01' " ;

Удаление таб. частей было
|DELETE FROM " + таблица + " WHERE
|"+НазваниеОсновнойТаблицы+"_idrref IN
| (SELECT _idrref FROM " + НазваниеОсновнойТаблицы + " WHERE " + НазваниеОсновнойТаблицы + "._date_time < DATE '2008-03-01') " ;

6. ilya005 (ilya005) 118 30.01.10 20:36 Сейчас в теме
аналог для 7.7
DECLARE @sql varchar(500)
DECLARE c CURSOR FOR
--Получаем список таблиц документов и регистров document-документы и табличные части, accnt-регистры бухгалтерии, accttl- итоги по регистрам бухгалтерии, accum- регистры накопления с итогами
SELECT [name] FROM sysobjects WHERE (
name LIKE 'D%' or
name LIKE 'R%' or
name LIKE '_1SCRDOC' or
name LIKE '_1SJOURN' or
name LIKE '_1SCRDOC') AND xtype = 'U'
OPEN c
--цикл по отобранным таблицам
FETCH NEXT FROM c INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
--Формируем текст для очищения таблицы
SET @sql = 'truncate table ' + @sql
--Выполняем очищение таблицы
EXEC (@sql)
PRINT @sql
FETCH NEXT FROM c INTO @sql
END
CLOSE c
DEALLOCATE c
7. Аркадий Кучер (Abadonna) 3676 30.01.10 20:43 Сейчас в теме
(0) Ох, опасная игрушка в неумелых руках ;)
8. Александр Окулов (PowerBoy) 2570 27.12.12 12:15 Сейчас в теме
Кому надо - вот универсальная чистилка документов с любыми отборами:
http://infostart.ru/public/16731/
Оставьте свое сообщение