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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как автоматизировать ежемесячное удаление старых записей в 1С через SQL?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #32849
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        привет. На сервере 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 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С