При подготовке тестовой базы или копии для проверяющих часто возникает необходимость оперативно удалить документы за конкретный период. На практике стандартное удаление сопоставленных объектов в 1С может занимать от 15 до 30 секунд на один документ, а сам процесс нередко сопровождается ошибками нехватки памяти и аварийным завершением программы. Разберем, почему возникает эта проблема и как существенно ускорить очистку базы.
Проанализируем основные причины замедления работы платформы при массовом удалении объектов:
НайтиПоСсылкам. На больших базах это порождает миллионы мелких запросов.ПередУдалением, ПриЗаписи), подписки на события, алгоритмы пересчета последовательностей и регистрация изменений для обменов.Если проверка ссылок не требуется (например, база подготовлена исключительно как копия для внешних проверяющих), можно воспользоваться режимом непосредственного удаления прямо из списка документов.
Обратите внимание: данный метод удаляет объекты в обход контроля ссылочной целостности, поэтому в базе могут остаться битые ссылки, о коррекции которых мы поговорим ниже.
Для ускорения массовой очистки через внешнюю обработку или модуль напишем алгоритм, который отключает проверку бизнес-логики и очищает движения порциями в рамках транзакций.
Рассмотрим пример кода:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаОкончания);
Счетчик = 0;
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.ПолучитьОбъект();
// Отключаем выполнение обработчиков событий и проверок
ДокОбъект.ОбменДанными.Загрузка = Истина;
// Предварительно очищаем движения по регистрам
ДокОбъект.Движения.Очистить();
// Выполняем физическое удаление
ДокОбъект.Удалить();
Счетчик = Счетчик + 1;
// Фиксируем транзакцию порциями по 500 объектов
Если Счетчик % 500 = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
Установка свойства ОбменДанными.Загрузка = Истина позволяет обойти большинство проверок и обработчиков, а очистка Движения.Очистить() снижает число блокировок таблиц СУБД.
Выясним, какие настройки программы позволяют снизить нагрузку во время удаления большого массива данных:
Самый быстрый способ получить базу без документов за текущий или прошлый период — восстановить резервную копию (архив), созданную на дату до начала этого периода. Если точка восстановления сохранена, развертывание архива займет в десятки раз меньше времени, чем процесс физической очистки рабочей базы.
После завершения процедур массового удаления объектов необходимо выполнить следующие шаги:
<Объект не найден>.