Как быстро удалить большой объем документов в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При подготовке тестовой базы или копии для проверяющих часто возникает необходимость оперативно удалить документы за конкретный период. На практике стандартное удаление сопоставленных объектов в 1С может занимать от 15 до 30 секунд на один документ, а сам процесс нередко сопровождается ошибками нехватки памяти и аварийным завершением программы. Разберем, почему возникает эта проблема и как существенно ускорить очистку базы.

Почему стандартное удаление работает долго?

Проанализируем основные причины замедления работы платформы при массовом удалении объектов:

  1. Проверка ссылочной целостности: При типовом помечении или удалении объектов платформа выполняет поиск ссылок по всем таблицам базы данных с помощью функции НайтиПоСсылкам. На больших базах это порождает миллионы мелких запросов.
  2. Выполнение бизнес-логики в обработчиках: Во время распроведения и физического удаления срабатывают события модулей объектов (ПередУдалением, ПриЗаписи), подписки на события, алгоритмы пересчета последовательностей и регистрация изменений для обменов.
  3. Обновление индексов полнотекстового поиска: Любые изменения в таблицах вызывают актуализацию индекса полнотекстового поиска, что создает огромную нагрузку на диски и процессор.
  4. Переполнение памяти 32-разрядного клиента: Если массовая очистка запускается в 32-битном тонком или толстом клиенте, лимит оперативной памяти (до 2–4 ГБ) быстро исчерпывается, что приводит к вылету программы.

Способ 1. Использование прямого физического удаления (Shift + Del)

Если проверка ссылок не требуется (например, база подготовлена исключительно как копия для внешних проверяющих), можно воспользоваться режимом непосредственного удаления прямо из списка документов.

  1. Разрешим в настройках программы или прав пользователя непосредственное удаление объектов.
  2. Откроем журнал документов и установим отбор по нужному периоду (например, за 2017 год).
  3. Выделим все записи сочетанием клавиш Ctrl + A.
  4. Нажмем сочетание Shift + Delete для вызова функции прямого удаления без предварительной пометки.

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

Способ 2. Программное удаление с флагом ОбменДанными.Загрузка

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

Рассмотрим пример кода:


Выборка = Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаОкончания);
Счетчик = 0;

НачатьТранзакцию();

Пока Выборка.Следующий() Цикл
    
    ДокОбъект = Выборка.ПолучитьОбъект();
    
    // Отключаем выполнение обработчиков событий и проверок
    ДокОбъект.ОбменДанными.Загрузка = Истина;
    
    // Предварительно очищаем движения по регистрам
    ДокОбъект.Движения.Очистить();
    
    // Выполняем физическое удаление
    ДокОбъект.Удалить();
    
    Счетчик = Счетчик + 1;
    
    // Фиксируем транзакцию порциями по 500 объектов
    Если Счетчик % 500 = 0 Тогда
        ЗафиксироватьТранзакцию();
        НачатьТранзакцию();
    КонецЕсли;

КонецЦикла;

Если ТранзакцияАктивна() Тогда
    ЗафиксироватьТранзакцию();
КонецЕсли;

Установка свойства ОбменДанными.Загрузка = Истина позволяет обойти большинство проверок и обработчиков, а очистка Движения.Очистить() снижает число блокировок таблиц СУБД.

Способ 3. Отключение итогов и фоновых служб

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

  1. Отключение итогов: В разделе администрирования или через управление регистрами накопления и бухгалтерии отключим расчет итогов. Это исключит постоянный пересчет агрегатов при удалении движений.
  2. Отключение полнотекстового поиска: В разделе «Администрирование» — «Поддержка и обслуживание» временно отключим индекс полнотекстового поиска.
  3. Очистка регистраций обмена: Программно или через монитор обмена удалим записи о регистрации изменений для планов обмена, чтобы платформа не тратила ресурсы на подготовку данных к синхронизации.

Способ 4. Использование архива базы данных

Самый быстрый способ получить базу без документов за текущий или прошлый период — восстановить резервную копию (архив), созданную на дату до начала этого периода. Если точка восстановления сохранена, развертывание архива займет в десятки раз меньше времени, чем процесс физической очистки рабочей базы.

Обязательные завершающие действия

После завершения процедур массового удаления объектов необходимо выполнить следующие шаги:

  1. Тестирование и исправление: Запустим процедуру «Тестирование и исправление» из режима Конфигуратора. Обязательно выберем режим «Очищать ссылки» при наличии некорректных ссылок, чтобы избавиться от записей типа <Объект не найден>.
  2. Сжатие и переиндексация: Физическое удаление записей не уменьшает размер файлов базы данных автоматически. Для восстановления производительности и высвобождения дискового пространства выполним переиндексацию таблиц и сжатие базы.
← На главную