Книга знаний

1С:Предприятие / Типовые конфигурации / Торговля и склад 7.7

Обрезание (свертка) базы

В данной статье я опишу универсальную технологию обрезания (свертки) БД.Автор статьи: K-A-S-P-E-R-O-K | Редакторы: SKrin, Demiurg, aka AMIGO, Ювелир
Последняя редакция №8 от 20.12.13 | История
URL: http://kb.mista.ru/article.php?id=250

Ключевые слова: свертка, обрезание, закрытие периода


Обрезание базы


Вы наверно частенько встречались с ситуацией что в конце концов база вырастает до таких объемов что уже не выносимо с ней работать, а если она ещё и DBF то и очень опасно.

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

Вначале я стал искать в интернете готовые решения, даже попробовал стандартную обрезку 1с "СверкаБазы" которая у меня работала 2 дня и в конце концов у меня кончилось терпение и её убил.
Потом один умный человек подсказал мне метод её реализации (этот умный человек Рева Виталий, а в сети его знают как Матрея).

Вся идея сводилась к тому, что просто нужно на дату обреза просто "сфотографировать" остатки по всем регистрам остатка и всё.

И всё оказалось не так уж и сложно, хотя в интернете до сих пор нету грамотных решений по данному вопросу, а если и есть то только за деньги :-)

Кстати это ещё не всё. После чего нужно удалить все доки. Если у вас SQL то здесь вам повезло. Делаем так, в QA выполняю данный запрос, и удаляю все документы до указанной даты буквально за 20 минут (а из не мало с учётом того что в день 300 доков, а удалять надо полтора года)

USE MyTestBase
Go
CREATE TABLE ##ID

(IDDOC char(9) primary key clustered) 
Go
INSERT INTO ##ID

SELECT DISTINCT IDDOC 
FROM _1SJOURN
WHERE (DATE_TIME_IDDOC < '20060530')
Go
BEGIN TRANSACTION
DECLARE Mycur cursor for
SELECT sysobjects.name,syscolumns.name
FROM syscolumns INNER JOIN 
sysobjects ON syscolumns.id = sysobjects.id 
WHERE (syscolumns.name = N'iddoc') OR
(syscolumns.name = N'docid')
OPEN MyCur
DECLARE @TableName varchar(20)
DECLARE @ColName varchar(20)
FETCH NEXT FROM MyCur INTO @TableName, @ColName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('Delete from '+@TableName+' with (tablock) where '+@ColName+' IN (Select IDDOC FROM ##ID)') 

FETCH NEXT FROM MyCur INTO @TableName, @ColName 
END
CLOSE MyCur
DEALLOCATE MyCur
COMMIT TRANSACTION
DROP TABLE ##ID


Но после этого я столкнулся с тем что движения остаются по удалённым документам.
В связи с этим я применил ещё один запрос именно по регистру ПартииНаличия

use НазваниеБазы 
DELETE FROM RA328 
WHERE IDDOC NOT IN (SELECT IDDOC FROM _1sjourn (nolock))


после чего я в конфигураторе я сделал Тестирование и исправление ИБ
В нём я поставил все галочки и в настройках выбрал "Очищать ссылки" и "Удалять данные объекты"
Вот и весь процесс обрезки :-)
У меня он занял со всеми исправлениями часов 6.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика