Администрирование · 10 мин
Как ускорить удаление документов в 1С
Почему удаление документов в 1С идёт медленно и как его ускорить: контроль ссылок, монопольный режим, обмены, индексы и пакетная обработка.
Медленное удаление документов в 1С — типичная ситуация, когда в базе накопились сотни тысяч помеченных объектов, а штатное «Удаление помеченных объектов» работает часами или зависает. Причина почти всегда не в самом удалении, а в проверке ссылочной целостности: платформа перед удалением каждого объекта ищет ссылки на него во всех таблицах базы, включая регистры сведений, последовательности и планы обмена.
На скорость влияют объём базы, количество зарегистрированных узлов обмена, состояние индексов СУБД, наличие итогов по регистрам и то, работают ли в это время другие пользователи. Понимание этих факторов позволяет сократить время удаления с часов до минут без риска повредить данные.
Ниже разобраны практические приёмы: от настройки штатной обработки до пакетного удаления средствами СУБД и кода. Все способы даны с условиями применения и ограничениями, чтобы вы могли выбрать безопасный вариант под свою конфигурацию.
Почему удаление в 1С работает медленно
Штатный механизм «Удаление помеченных объектов» (Администрирование → Обслуживание) выполняет две операции: поиск ссылок на каждый помеченный объект во всех таблицах конфигурации и собственно удаление. Поиск ссылок — самая дорогая часть: в крупной базе на десятки миллионов записей регистров проверка одного документа может занимать секунды.
Дополнительно замедляют процесс: зарегистрированные изменения в планах обмена (платформа проверяет и чистит их), включённые итоги регистров накопления, длинные транзакции при удалении больших пакетов, фрагментированные индексы и устаревшая статистика на SQL Server или PostgreSQL, а также активные сеансы пользователей, создающие блокировки.
Проверьте объём регистров и число помеченных объектов
Посмотрите активные сеансы и журнал блокировок СУБД
Проверьте таблицы регистрации изменений узлов планов обмена
Проверьте период расчёта итогов и границы последовательностей
Подготовка: что сделать перед удалением
Перед массовым удалением обязательно создайте резервную копию базы — средствами СУБД для клиент-серверного варианта или через выгрузку в dt для файлового. Ошибка при массовом удалении без копии приводит к невосстановимой потере данных.
Очистите регистрацию изменений в планах обмена для узлов, по которым обмен уже выполнен: в больших базах таблицы регистрации содержат миллионы записей, и контроль ссылок по ним занимает львиную долю времени. Это часто даёт самый заметный прирост скорости.
Обновите статистику и перестройте индексы на СУБД, если база давно не обслуживалась. Для SQL Server достаточно стандартного плана обслуживания или команд UPDATE STATISTICS и ALTER INDEX REBUILD по наиболее объёмным таблицам.
Настройка штатного удаления помеченных объектов
Запускайте удаление в монопольном режиме или в период минимальной нагрузки. Блокировки от конкурирующих сеансов растягивают транзакции, а при таймаутах удаление откатывается и начинается заново.
Используйте выборочное удаление: в обработке «Удаление помеченных объектов» переключитесь в режим «Выборочное удаление объектов» и обрабатывайте объекты по видам и периодам — например, сначала документы одного типа за старый год. Порции по несколько тысяч объектов удаляются предсказуемо и не создают гигантских транзакций.
Если часть объектов не удаляется из-за ссылок, не пытайтесь прогонять всё заново: отработайте список неудалённых, уберите или перепроведите ссылающиеся объекты, затем повторите удаление только для оставшихся.
- 1Сделайте резервную копию базы
- 2Очистите регистрацию изменений по выполненным узлам обмена
- 3Обновите статистику и индексы на СУБД
- 4Завершите сеансы пользователей или запланируйте ночное окно
- 5Запустите выборочное удаление порциями по виду документов и периоду
- 6Проверьте список неудалённых объектов и разберите ссылки
- 7Повторите удаление остатка и убедитесь, что помеченных не осталось
Пакетное удаление программным способом
Для регулярной чистки удобна обработка, которая удаляет объекты пакетами через встроенный язык: выборка помеченных по виду и дате, затем УдалитьОбъекты для массива ссылок с контролем ссылочной целостности либо непосредственное удаление через Объект.Удалить() в транзакции фиксированного размера.
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1000 Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ ПометкаУдаления И Дата < &Дата");
Запрос.УстановитьПараметр("Дата", ДобавитьМесяц(ТекущаяДата(), -36));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Удалить();
КонецЦикла;Ключевые правила для такого кода: ограничивайте порцию (500–2000 объектов), фиксируйте транзакцию после каждой порции, логируйте ошибки и запускайте обработку в монопольном режиме. Непосредственное удаление без контроля ссылок быстрее, но применимо только если вы уверены, что ссылок на объекты нет — иначе получите «битые» ссылки вида «Объект не найден».
Ускорение на уровне СУБД и конфигурации
В клиент-серверном варианте значительную часть времени даёт обслуживание базы. Регулярное обновление статистики, дефрагментация индексов и достаточный объём памяти под буферный пул сокращают время любых массовых операций, включая удаление.
На стороне конфигурации проверьте: период расчёта итогов по регистрам накопления (хранение итогов за лишние годы замедляет движения), границы последовательностей, объём независимых регистров сведений с большими измерениями. Сдвиг границ и свёртка старых периодов уменьшают объём проверяемых таблиц.
Для файловых баз главный фактор — скорость диска: размещение базы на SSD и отсутствие антивирусного сканирования каталога базы дают заметный прирост. Файловые базы большого объёма принципиально медленнее клиент-серверных при массовых операциях — это ограничение платформы, а не настройки.
Сравнение вариантов
Безопасно, с контролем ссылок; медленно на больших объёмах
Гибко и быстрее; требует разработки и монопольного режима
Максимальная скорость; риск битых ссылок, только после проверки
Самый быстрый вариант; допустимо только для регистрации обменов и служебных таблиц, не для документов
Типичные ошибки и как их избежать
Самая частая ошибка — попытка удалить всё сразу одной операцией. Транзакция на сотни тысяч объектов переполняет журнал транзакций СУБД, упирается в блокировки и откатывается, теряя часы работы. Делите объём на порции.
Вторая ошибка — удаление документов без свёртки итогов и переноса остатков. Документы удалятся, но отчёты за старые периоды перестанут сходиться, а восстановить картину без копии будет невозможно.
Как проверить результат после удаления
После завершения откройте обработку удаления помеченных и убедитесь, что список помеченных объектов пуст либо содержит только объекты с известными ссылками. Затем выполните тестирование и исправление информационной базы с проверкой ссылочной целостности — это займёт время, но покажет «битые» ссылки, если контроль отключался.
Сверьте ключевые отчёты (оборотно-сальдовая ведомость, остатки по складу) с копией до удаления: итоги на дату после свёртки должны совпадать. Расхождение означает, что удалены документы, участвовавшие в остатках, — восстанавливайте из копии и повторяйте процедуру корректно.
Как проверить результат
Пуст или только объекты с известными ссылками
Тысячи объектов остались без объяснения
Ошибок нет
Ссылки на несуществующие объекты
Совпадают с данными до удаления
Расхождения по складам или счетам
Уменьшился объём, массовые операции быстрее
Объём не изменился — удаление не выполнено
Частые вопросы
Можно ли удалять документы без пометки на удаление?
Технически да — программно через Объект.Удалить(), минуя пометку. Но штатный сценарий с пометкой безопаснее: он оставляет возможность отменить решение до физического удаления и работает с контролем ссылок. Прямое удаление оправдано только в пакетных обработках с проверенными данными.
Почему после удаления размер базы на диске не уменьшился?
СУБД не возвращает освободившееся место операционной системе автоматически — страницы помечаются свободными внутри файлов данных. Чтобы физически уменьшить файлы, нужна операция сжатия (shrink) на SQL Server или vacuum/реиндексация на PostgreSQL. Делайте её осознанно: shrink фрагментирует индексы, после него нужна их перестройка.
Что делать, если объект не удаляется из-за ссылки в неизвестном месте?
Используйте функцию «Поиск ссылок на объект» (Ещё → Найти ссылки или одноимённая команда в обработке удаления). Она покажет все объекты, где встречается ссылка. Обработайте их: удалите, перепроведите или замените ссылку, затем повторите удаление.
Ускорит ли удаление перевод базы в простое восстановление (simple recovery) на SQL Server?
Модель восстановления simple уменьшает рост журнала транзакций при массовых операциях и может ускорить удаление. Но она исключает восстановление на момент времени — для рабочих баз это критично. Безопасная альтернатива: оставить full-модель, делить удаление на порции и обеспечить регулярное резервное копирование журнала.
Как часто нужно чистить помеченные объекты?
Регулярно, небольшими порциями — например, регламентным заданием в нерабочее время раз в неделю. Накопление сотен тысяч помеченных объектов делает каждую следующую чистку дороже и замедляет контроль ссылок при повседневной работе.
Что важно запомнить
Скорость удаления определяется контролем ссылок и состоянием базы. Резервная копия, чистка регистрации обменов, актуальные индексы, порционное удаление в монопольном режиме и проверка остатков после — безопасный путь ускорить процесс в разы.