Работа с распределенными информационными базами (УРБД) на платформе 1С:Предприятие 7.7 всегда накладывает серьезные ограничения на администрирование и обслуживание данных. Когда в такой базе за долгие годы скапливается критический объем неиспользуемых данных и «мусора», перед администратором встает задача массовой очистки. Однако стандартная процедура удаления помеченных объектов в УРБД может парализовать работу всей компании на несколько дней. Выгрузка огромных пакетов изменений, бесконечный поиск ссылок при импорте в периферийные базы и блокировки СУБД — это лишь малая часть проблем, с которыми можно столкнуться.
В этой статье мы подробно разберем, почему штатные механизмы очистки вызывают зависания системы, проанализируем различные стратегии оптимизации этого процесса и выясним, как провести процедуру удаления сотен тысяч объектов максимально безболезненно для пользователей и баз данных.
Чтобы понять, как оптимизировать процесс, проанализируем внутренние механизмы платформы 1С 7.7 при удалении объектов в распределенной структуре:
1SUPDTS.DBF, в SQL-версии — аналогичная таблица). При удалении сотен тысяч объектов размер этой таблицы мгновенно раздувается. При следующем сеансе обмена система пытается упаковать эти миллионы записей в файлы переноса данных, что приводит к критической нехватке оперативной памяти и зависанию процесса выгрузки.1SJOURN). В итоге пользователи ПБ полностью теряют возможность проводить документы и записывать элементы справочников.Рассмотрим самый надежный и наименее рискованный метод — удаление данных небольшими частями с регулярной синхронизацией. Этот способ позволяет не копить критическую массу транзакций в файлах обмена.
Разберем данный процесс по шагам:
Преимущества: Полная безопасность данных, сохранение целостности базы, отсутствие риска потерять локальные доработки в ПБ.
Недостатки: Процесс требует много времени и постоянного контроля со стороны администратора. При наличии сотен тысяч объектов такая очистка может растянуться на недели.
Проанализируем альтернативный сценарий, который позволяет обойти проблему длительного поиска ссылок в периферийных базах при обмене. Этот метод основан на полной очистке центральной базы и последующем клонировании новых ПБ.
Схема работы выглядит следующим образом:
1SUPDTS.DBF или очищаем соответствующую таблицу SQL).КРИТИЧЕСКИ ВАЖНО: Риски и ограничения метода!
Перед тем как использовать данный способ, необходимо детально проанализировать правила миграции данных в вашей УРБД. Выясним, почему этот метод может привести к катастрофическим последствиям:
Использовать этот метод можно только в том случае, если ваша конфигурация имеет абсолютно симметричную структуру обмена (все данные из ПБ мигрируют в ЦБ) и у вас есть полная уверенность в отсутствии уникальных локальных настроек на местах.
Для файловых баз DBF прямая работа с таблицами затруднена, но если ваша 1С 7.7 работает на СУБД MS SQL Server, мы можем обойти штатные ресурсоемкие механизмы платформы с помощью прямых SQL-запросов. Это позволяет сократить время удаления сотен тысяч объектов с нескольких суток до минут.
Посмотрим на общую логику реализации этого подхода:
При штатном удалении объекта платформа выполняет каскад проверок и обращений к СУБД. При прямом удалении мы берем эту задачу на себя. Нам необходимо написать SQL-скрипт (или использовать внешние компоненты, такие как 1С++), который будет напрямую очищать записи в соответствующих таблицах базы данных:
SC*) или документов (таблицы табличных частей DT* и шапок DH*).1SJOURN) для удаляемых документов._1SCONST.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: при удалении записей строки физически не стираются из файлов таблиц. Платформа 1С лишь помечает их специальным символом (звездочкой * в заголовке записи) как удаленные.
Поэтому после массового удаления сотен тысяч объектов размер вашей файловой базы данных не уменьшится ни на один мегабайт, а скорость поиска ссылок при последующих операциях может даже снизиться. Чтобы действительно высвободить дисковое пространство и сжать таблицы, необходимо обязательно выполнить операцию «Упаковка таблиц» (Pack). Сделать это можно через монопольный запуск ТИИ или с помощью утилит администрирования баз данных DBF.
Подводя итоги, сформируем пошаговый чек-лист для безболезненного удаления мусора из вашей базы 1С 7.7 УРБД:
1С++ или внешние обработки (например, доработанную ObjectsCleaner или repval.ert), которые умеют работать немонопольно и деликатно обходят блокировки таблиц.