Как урезать / очистить базу данных 1С средствами MS-SQL   

Эта статья для тех, кто хоть раз сталкивался с необходимостью очистить базу 1С, за период с устаревшими данными. Речь пойдет об удалении данных в ненужном периоде напрямую, средствами SQL-сервера. Также следует уточнить, что речь идет о конфигурациях, использующих компоненту «Оперативный учет». На бухгалтерских и расчетных базах данный метод не тестировался.

Для начала рассмотрим, как происходит резка периода. На определенную дату, чаще всего не конец года, скажем «31.12.2003», вычисляются конечные остатки по всем регистрам. Далее, на начало года, на «01.01.2004», вводятся эти остатки документами ввода начальных остатков. При этом в новом году в документах не должно быть ссылок на документы прошлого года – так называемых документов, введенных на основании, иначе удаление средствами не сможет удалить документы, на которые есть ссылки. Также следует уделить внимания периодическим реквизитам, введенных документами, так как в момент отмены проведения документа эти периодические реквизиты перестанут существовать. Чтобы не было казусов, все периодические реквизиты, устанавливаемые документами нужно перед удалением выставить заново с начала года.

Теперь рассмотрим, как обычно происходит очистка базы средствами . Запускается какая-то обработка проведения, которая помечает на удаление все документы. Это достаточно длительный процесс, так как при проведении каждого из документов :Предприятие очищает все движения документов, в том числе периодические реквизиты, введенные документом. Это достаточно длительный процесс с учетом большого количества документов. Далее через пункт меню «Операции -> Удаление помеченных объектов» выполняется окончательное удаление.

В совокупности – это достаточно длительный процесс, особенно для больших баз с большим количеством документов в удаляемом периоде.

Альтернативный вариант очистки базы 1С – воспользоваться имеющимися в нашем распоряжении средствами MS-SQL. Из вышеуказанной последовательности мы можем ускорить последние два пункта, а именно пометку на удаление и окончательное удаление документов.

Что требуется сделать? Просто запустить скрипт, например из SQL Query Analizer’а. Текст скрипта представлен ниже:

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 < '20040101')
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

Сначала из таблицы журналов документов выбираются в отдельную временную таблицу все идентификаторы документов с датой меньше заданной. Теперь о том, что делает этот скрипт. Он проходится по метаданным и удаляет из всех таблиц, где есть колонка IDDOC или DOCID, строки с идентификатором документа, входящим в таблицу удаляемых. Таким образом чистятся таблицы документов, регистров и периодических реквизитов.

После выполнения данного скрипта остается только войти в режим конфигуратора и сделать пересчет служебных данных и пересчет итогов. На случай, если вы не избавились от ссылок на старые документы, то необходимо сделать еще и проверку логической целостности. В настройках поставить «Очищать ссылки».

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

Теперь о производительности. Я проверил оба варианта очистки базы 1С - удаление в методом выбора всех документов и удаления их без контроля ссылочной целостности, и удаление путем выполнения данного скрипта. В базе данных содержалась информация за период с «01.09.2001» по «15.06.2004». Удалялся период по 2003 год включительно. Конфигурация самописная, но в данном случае, думаю, это никакого значения не имеет. Данные сравнения указаны в таблице:

Время, минут:секунд. Удаление средствами 1C Удаление средствами MS-SQL
53:41 5:39

Как видно по результатам сравнения, удаление средствами MS-SQL фактически ровно в 10 раз быстрее. Это соотношение действительно с учетом того, что для обоих вариантов будет запущен полный пересчет итогов из конфигуратора. Хотя в случае с 1C его выполнять желательно, но не обязательно (почему - читайте здесь и здесь), а в случае с MS-SQL - обязательно. Так что, если вы не будете выполнять пересчет итогов в случае удаления в , то для полноценного сравнения времени работы нужно к времени работы скрипта (5:39), добавить время пересчета итогов в конфигураторе (2:00).

 


 

Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").