Как безболезненно удалить огромное количество помеченных объектов в распределенной базе 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Работа с распределенными информационными базами (УРБД) на платформе 1С:Предприятие 7.7 всегда накладывает серьезные ограничения на администрирование и обслуживание данных. Когда в такой базе за долгие годы скапливается критический объем неиспользуемых данных и «мусора», перед администратором встает задача массовой очистки. Однако стандартная процедура удаления помеченных объектов в УРБД может парализовать работу всей компании на несколько дней. Выгрузка огромных пакетов изменений, бесконечный поиск ссылок при импорте в периферийные базы и блокировки СУБД — это лишь малая часть проблем, с которыми можно столкнуться.

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

Почему стандартное удаление в УРБД парализует работу системы?

Чтобы понять, как оптимизировать процесс, проанализируем внутренние механизмы платформы 1С 7.7 при удалении объектов в распределенной структуре:

  1. Лавинообразный рост таблиц регистрации изменений. Когда в Центральной Базе (ЦБ) происходит удаление объекта, платформа регистрирует это событие для каждой периферийной базы (ПБ). Вся служебная информация записывается в таблицу регистрации изменений (в DBF-версии это файл 1SUPDTS.DBF, в SQL-версии — аналогичная таблица). При удалении сотен тысяч объектов размер этой таблицы мгновенно раздувается. При следующем сеансе обмена система пытается упаковать эти миллионы записей в файлы переноса данных, что приводит к критической нехватке оперативной памяти и зависанию процесса выгрузки.
  2. Ресурсоемкий «Поиск ссылок» в периферийных базах. Когда периферийная база загружает файл обмена с директивами удаления, она не может просто стереть запись из своей базы данных. Платформа обязана гарантировать целостность данных, поэтому запускается алгоритм автоматического поиска ссылок на удаляемый объект по всей базе.
    • В файловых базах (DBF) это вызывает изнурительный для дисковой подсистемы процесс последовательного сканирования таблиц (Full Table Scan) всех документов и справочников.
    • В SQL-версиях СУБД строит гигантские вложенные JOIN-запросы ко всем таблицам базы данных. Если удаляемых объектов действительно много, это приводит к перегрузке процессора, исчерпанию оперативной памяти SQL-сервера и наложению жестких блокировок на ключевые таблицы базы (например, на общий журнал документов 1SJOURN). В итоге пользователи ПБ полностью теряют возможность проводить документы и записывать элементы справочников.
  3. Проблема локальных данных и «битых ссылок». В реальных УРБД-системах правила миграции объектов часто настраиваются по принципу «место создания». Если объект был создан в периферийной базе и по правилам миграции не ушел в ЦБ, но в ЦБ удаляется связанный с ним объект общего пользования, в периферийной базе образуется «битая ссылка» (объект не найден). Это может привести к невозможности перепроведения документов и нарушению логической консистентности учета.

Метод 1. Порционное удаление с параллельными обменами (Безопасный классический подход)

Рассмотрим самый надежный и наименее рискованный метод — удаление данных небольшими частями с регулярной синхронизацией. Этот способ позволяет не копить критическую массу транзакций в файлах обмена.

Разберем данный процесс по шагам:

  1. Определяем оптимальный размер порции. Нам необходимо экспериментально подобрать размер транзакции. Рекомендуется начинать с небольших порций — от 1 000 до 5 000 объектов за один проход.
  2. Проводим очистку порции в ЦБ. Запускаем штатную обработку удаления помеченных объектов, но ограничиваем выборку элементов. Например, удаляем только определенный вид документов за конкретный месяц или только одну группу справочника.
  3. Выполняем полный цикл обмена. Сразу после удаления первой порции инициируем выгрузку изменений из ЦБ в ПБ. В периферийных базах запускаем загрузку, дожидаемся завершения поиска ссылок и физического удаления, после чего выполняем ответную выгрузку (ПБ -> ЦБ) для подтверждения приема изменений. Полный двойной цикл обмена гарантирует, что информация об удалении успешно синхронизирована по всему контуру и служебные таблицы регистрации изменений очистились.
  4. Повторяем процесс. Переходим к следующей порции объектов.

Преимущества: Полная безопасность данных, сохранение целостности базы, отсутствие риска потерять локальные доработки в ПБ.

Недостатки: Процесс требует много времени и постоянного контроля со стороны администратора. При наличии сотен тысяч объектов такая очистка может растянуться на недели.

Метод 2. Удаление без миграции и пересоздание периферийных баз (Радикальный быстрый подход)

Проанализируем альтернативный сценарий, который позволяет обойти проблему длительного поиска ссылок в периферийных базах при обмене. Этот метод основан на полной очистке центральной базы и последующем клонировании новых ПБ.

Схема работы выглядит следующим образом:

  1. Выполняем полную резервную копию всех информационных баз (и ЦБ, и всех ПБ). Это критически важное условие!
  2. В центральной базе временно отключаем авторегистрацию изменений для обмена или очищаем таблицы регистрации изменений (например, удаляем записи в файле 1SUPDTS.DBF или очищаем соответствующую таблицу SQL).
  3. В монопольном режиме в ЦБ запускаем полное удаление всех помеченных объектов. Процедура пройдет относительно быстро, так как системе не придется готовить транзакции для отправки в ПБ.
  4. После успешной очистки ЦБ мы не делаем стандартный обмен. Вместо этого мы физически удаляем старые периферийные базы и создаем («клонируем») новые ПБ из очищенной ЦБ.

КРИТИЧЕСКИ ВАЖНО: Риски и ограничения метода!

Перед тем как использовать данный способ, необходимо детально проанализировать правила миграции данных в вашей УРБД. Выясним, почему этот метод может привести к катастрофическим последствиям:

Использовать этот метод можно только в том случае, если ваша конфигурация имеет абсолютно симметричную структуру обмена (все данные из ПБ мигрируют в ЦБ) и у вас есть полная уверенность в отсутствии уникальных локальных настроек на местах.

Метод 3. Использование прямых SQL-запросов (Для SQL-версий баз данных)

Для файловых баз DBF прямая работа с таблицами затруднена, но если ваша 1С 7.7 работает на СУБД MS SQL Server, мы можем обойти штатные ресурсоемкие механизмы платформы с помощью прямых SQL-запросов. Это позволяет сократить время удаления сотен тысяч объектов с нескольких суток до минут.

Посмотрим на общую логику реализации этого подхода:

При штатном удалении объекта платформа выполняет каскад проверок и обращений к СУБД. При прямом удалении мы берем эту задачу на себя. Нам необходимо написать SQL-скрипт (или использовать внешние компоненты, такие как 1С++), который будет напрямую очищать записи в соответствующих таблицах базы данных:

  1. Удаление записей из таблиц справочников (таблицы вида SC*) или документов (таблицы табличных частей DT* и шапок DH*).
  2. Очистка записей в общем журнале документов (таблица 1SJOURN) для удаляемых документов.
  3. Очистка периодических реквизитов в служебной таблице _1SCONST.
  4. Очистка регистрации изменений: Чтобы изменения не ушли в периферийные базы огромным комом, мы можем очистить служебную таблицу регистрации изменений 1SUPDTS.

Для примера рассмотрим концептуальную схему безопасного пакетного удаления записей на стороне SQL-сервера. Чтобы не переполнить лог транзакций СУБД и не заблокировать работу пользователей, удаление следует производить порциями (батчами) внутри транзакций:


-- Пример концептуального SQL-скрипта для пакетного удаления помеченных элементов справочника SC123
DECLARE @RowsDeleted INT
SET @RowsDeleted = 1

WHILE (@RowsDeleted > 0)
BEGIN
    BEGIN TRANSACTION
        -- Удаляем порцию в 1000 элементов, помеченных на удаление (IsMark = 1)
        DELETE TOP (1000) 
        FROM SC123 
        WHERE ISMARK = 1
        
        SET @RowsDeleted = @@ROWCOUNT
    COMMIT TRANSACTION
    
    -- Небольшая пауза, чтобы дать СУБД обработать другие запросы пользователей
    WAITFOR DELAY '00:00:01'
END

После проведения прямого удаления в SQL-базе обязательно нужно выполнить следующие сервисные операции в СУБД:

В самой платформе 1С после этого необходимо запустить процедуру «Тестирование и исправление информационный базы» (ТИИ) в монопольном режиме с включенной опцией проверки физической и логической целостности данных.

Особенности работы с DBF-версиями при массовом удалении

Если ваша база работает на файловой СУБД (DBF), помните о важной архитектурной особенности формата DBF: при удалении записей строки физически не стираются из файлов таблиц. Платформа 1С лишь помечает их специальным символом (звездочкой * в заголовке записи) как удаленные.

Поэтому после массового удаления сотен тысяч объектов размер вашей файловой базы данных не уменьшится ни на один мегабайт, а скорость поиска ссылок при последующих операциях может даже снизиться. Чтобы действительно высвободить дисковое пространство и сжать таблицы, необходимо обязательно выполнить операцию «Упаковка таблиц» (Pack). Сделать это можно через монопольный запуск ТИИ или с помощью утилит администрирования баз данных DBF.

Резюме и рекомендации по безопасной работе

Подводя итоги, сформируем пошаговый чек-лист для безболезненного удаления мусора из вашей базы 1С 7.7 УРБД:

  1. Всегда начинайте процесс с создания полной резервной копии всех баз данных (центральной и всех периферийных).
  2. Перед удалением проведите процедуру свертки (обрезки) базы данных, если это возможно. Удаление без предварительной обрезки часто малоэффективно, так как старые объекты крепко связаны ссылками друг с другом за многие годы ведения учета.
  3. Для файловых баз используйте метод порционного удаления (порциями по 2000-5000 объектов) с обязательным проведением полных двойных циклов обмена после каждого шага. Это исключит зависание обменов.
  4. Для баз на MS SQL Server рассмотрите вариант использования прямых запросов через 1С++ или внешние обработки (например, доработанную ObjectsCleaner или repval.ert), которые умеют работать немонопольно и деликатно обходят блокировки таблиц.
  5. Если вы решились на метод удаления без миграции с последующим клонированием периферийных баз, детально изучите конфигурацию на наличие уникальных локальных данных в филиалах, чтобы не потерять важную информацию при пересоздании баз.
← На главную