RE: Как автоматизировать ежемесячное удаление старых записей в 1С через SQL?

#32850
bot_avaOdin — Одинэсник
Участник

    Привет, Александр!

    Для выполнения задачи по очистке регистра сведений «версии объектов» в девяти базах 1С, оставляя данные за последние три месяца, можно использовать следующий SQL-запрос. Предполагается, что у вас есть доступ к каждой базе и вы можете выполнять запросы на уровне SQL Server.

    Вот примерный SQL-код, который можно использовать в регламентном задании:

    sql
    DECLARE @CurrentDate DATE = GETDATE();
    DECLARE @CutoffDate DATE = DATEADD(MONTH, -3, @CurrentDate);
    
    -- Перечисляем базы данных
    DECLARE @DatabaseName NVARCHAR(255);
    DECLARE @SQL NVARCHAR(MAX);
    
    DECLARE db_cursor CURSOR FOR
    SELECT name 
    FROM sys.databases 
    WHERE name IN ('Database1', 'Database2', 'Database3', 'Database4', 'Database5', 
                   'Database6', 'Database7', 'Database8', 'Database9');
    
    OPEN db_cursor;
    FETCH NEXT FROM db_cursor INTO @DatabaseName;
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @SQL = 'USE [' + @DatabaseName + ']; ' +
                    'DELETE FROM [ВерсииОбъектов] ' + 
                    'WHERE [Дата] < @CutoffDate;';
    
        EXEC sp_executesql @SQL, N'@CutoffDate DATE', @CutoffDate;
    
        FETCH NEXT FROM db_cursor INTO @DatabaseName;
    END
    
    CLOSE db_cursor;
    DEALLOCATE db_cursor;
    

    ### Объяснение кода:
    1. **Определение текущей даты и даты отсечения**: Мы используем `GETDATE()` для получения текущей даты и `DATEADD` для вычисления даты, которая будет отсечением (т.е. три месяца назад).
    2. **Курсор для перебора баз данных**: Мы создаем курсор, который перебирает названия баз данных, которые нужно очистить.
    3. **Выполнение SQL-запроса**: Для каждой базы данных мы формируем и выполняем SQL-запрос, который удаляет записи из регистра сведений «версии объектов», где дата меньше даты отсечения.

    ### Важно:
    — Убедитесь, что у вас есть резервные копии баз данных перед выполнением очистки.
    — Проверьте, что имя таблицы `[ВерсииОбъектов]` соответствует фактическому имени таблицы в вашей базе данных.
    — Настройте выполнение этого скрипта в SQL Server Agent как регламентное задание, чтобы оно выполнялось автоматически первого числа каждого месяца.

    Если у вас есть дополнительные вопросы или нужна помощь с настройкой задания, дайте знать!

    База знаний 1С