В процессе работы с программами на платформе 1С:Предприятие, такими как «Управление торговлей» редакции 10.3, возникают ситуации, когда требуется полностью очистить базу от документов, сохранив при этом нормативно-справочную информацию (НСИ). Это может быть связано со сменой юридического лица, началом нового финансового года в «чистой» базе или исправлением ошибок учета. Стандартные методы удаления через групповую обработку объектов зачастую оказываются крайне медленными, если речь идет о сотнях тысяч или миллионах записей. В этой статье мы разберем наиболее эффективные способы ускорения этого процесса.
Если мы решим пойти по пути написания собственной обработки для удаления, нам необходимо минимизировать накладные расходы платформы на проверку каждого объекта. Рассмотрим основные приемы, которые помогут ускорить программный код.
Использование режима загрузки данных. При выполнении удаления объекта в коде обязательно следует использовать свойство ОбменДанными.Загрузка. Установка этого свойства в значение Истина отключает выполнение подписок на события, а также большинство проверок в модулях объектов, которые обычно срабатывают при удалении. Это значительно сокращает время обработки каждой ссылки.
Отключение итогов и последовательностей. Одной из главных причин замедления является автоматический пересчет итогов в регистрах накопления и бухгалтерии при удалении движений документа. Перед началом массовой операции нам следует программно отключить использование итогов по всем регистрам. Разберем пример кода для отключения итогов:
Для Каждого Регистр Из РегистрыНакопления Цикл
Регистр.УстановитьИспользованиеИтогов(Ложь);
КонецЦикла;
Удаление порциями и управление транзакциями. Попытка удалить все документы в рамках одной транзакции неизбежно приведет к переполнению лога транзакций СУБД и чрезмерному потреблению оперативной памяти. Проанализируем правильный подход: необходимо разделять процесс на порции (например, по 1000 документов) и фиксировать транзакцию после каждой порции.
Очистка движений перед удалением. Опыт показывает, что платформа быстрее удаляет объект, если у него предварительно очищены движения по всем регистрам. Мы можем вызвать запись пустого набора записей для каждого регистра, где документ является регистратором. Это уменьшает количество внутренних проверок ссылочной целостности на уровне СУБД при окончательном вызове метода Удалить().
Для клиент-серверных версий баз данных самым быстрым способом является прямое манипулирование таблицами в SQL Server. Однако этот метод требует осторожности и глубокого понимания структуры данных 1С.
Использование команды TRUNCATE. Если нам нужно полностью очистить базу от всех документов и их движений, мы можем использовать SQL-команду TRUNCATE TABLE для таблиц регистров. В отличие от DELETE, эта команда мгновенно освобождает пространство, не записывая удаление каждой строки в лог транзакций. Однако важно помнить, что после такой операции в базе останутся «битые» ссылки в справочниках или других документах, если они ссылались на удаленные объекты.
Модель восстановления SQL. Перед началом массовых операций на стороне SQL-сервера, переведем базу в модель восстановления Simple (Простая). Это предотвратит неконтролируемый рост файла .ldf и ускорит операции записи. После завершения всех работ можно вернуть модель Full, если это необходимо для регламентного резервного копирования.
Последующее тестирование и исправление. После «грубого» удаления данных средствами SQL, база данных может находиться в логически противоречивом состоянии. Поэтому обязательным шагом является запуск процедуры Тестирование и исправление (ТиИ) из Конфигуратора. Нам следует выбрать пункты «Реиндексация таблиц», «Пересчет итогов» и «Очистка ссылок на несуществующие объекты».
Зачастую быстрее не удалять лишнее из старой базы, а перенести нужное в новую. Этот метод считается наиболее безопасным и «чистым» с точки зрения целостности данных.
.cf), что и рабочая база.Этот подход гарантирует, что в новой базе не останется «мусорных» записей в таблицах итогов, регистрах регистрации изменений или индексах полнотекстового поиска. Проанализируем время: выгрузка и загрузка только справочников в пустую базу обычно занимает в разы меньше времени, чем процедура удаления миллионов документов с проверкой ссылок.
Рассмотрим еще несколько важных моментов, которые часто упускают из виду:
Полнотекстовый поиск. Обязательно отключите индексацию полнотекстового поиска перед массовым удалением. В противном случае система будет тратить колоссальные ресурсы на регистрацию изменений в специальных таблицах индекса для каждого удаленного документа.
Монопольный режим. Всегда выполняйте подобные операции в монопольном режиме. Это отключает механизмы объектных блокировок и позволяет платформе работать с таблицами напрямую, не отвлекаясь на управление конкурентным доступом.
Планы обмена. Если база участвует в распределенной информационной базе (РИБ) или обменивается данными с другими конфигурациями, удаление каждого документа порождает запись в таблицах регистрации изменений. Перед началом процесса стоит очистить состав планов обмена или временно исключить удаляемые объекты из состава планов обмена, чтобы избежать раздувания таблиц регистрации.