Массовое удаление документов в 1С без зависаний базы
Содержание
Удаление помеченных объектов тормозит не из-за самого удаления, а из-за проверки ссылок: перед тем как стереть документ, платформа обходит всю базу и ищет, где на него ссылаются. Поэтому партия в пару тысяч документов может чиститься часами, а база «висит».
Ускорить процедуру можно тремя приёмами, и ни один не связан с прямым доступом к SQL: резать удаление на порции, снимать движения заранее и запускать чистку в нерабочее время. Ниже — как это настроить в 1С:Бухгалтерии 3.0 и других конфигурациях на платформе 8.3, почему контроль ссылочной целостности съедает больше всего времени и когда его допустимо ослабить.
Массовое удаление необратимо. Перед большой чисткой сделайте резервную копию базы и убедитесь, что восстановление из неё реально работает.
Почему массовое удаление документов идёт так медленно
Удаление в 1С — это две независимые операции. Сначала пользователь помечает объекты на удаление (документ остаётся в базе, просто перечёркнут). Затем администратор запускает отдельную обработку, которая физически стирает помеченное.
Тормозит именно второй шаг, и вот из-за чего:
- 🔎 Контроль ссылочной целостности. Для каждого удаляемого объекта платформа ищет ссылки на него во всех документах, регистрах и справочниках. Чем больше база, тем дольше поиск.
- 📊 Чистка движений по регистрам. Проведённый документ оставляет записи в регистрах накопления и бухгалтерии. Удаление документа стирает и их, а это отдельные запросы к таблицам регистров.
- 🔗 Цепочки зависимостей. Нельзя удалить документ , на который ссылается другой непомеченный объект. Платформа строит дерево связей и показывает, что мешает.
- 🧱 Блокировки. На время проверки объекты блокируются. Если параллельно работают пользователи, запросы встают в очередь, и процедура растягивается.
Отсюда простой вывод: скорость зависит не от числа документов, а от объёма базы и количества связей. Один «тяжёлый» документ со множеством движений удаляется дольше, чем сотня пустых черновиков.
Понимание этой механики сразу подсказывает, где искать резервы скорости:
- уменьшить объём работы на документ — снять движения заранее;
- сократить длину каждой транзакции — удалять порциями;
- убрать конкуренцию за блокировки — работать в нерабочее время;
- дать СУБД быстрее искать ссылки — держать индексы в порядке.
Все четыре рычага разберём ниже. По отдельности каждый даёт выигрыш, а вместе они превращают многочасовую чистку в понятную процедуру на один вечер.
Как быстро пометить документы на удаление через журнал
Прежде чем удалять, документы надо пометить. Делать это по одному — потеря времени, поэтому работайте группой прямо в списке документов.
- Откройте нужный журнал или список документов (например, список реализаций или список всех документов через
Все функции → Документы). - Наложите отбор: по периоду, виду документа, организации или контрагенту. Так вы видите только то, что собираетесь удалить.
- Выделите диапазон: щёлкните первую строку, зажмите
Shiftи щёлкните последнюю. Отдельные строки добавляются с зажатымCtrl. - Нажмите клавишу
Deleteили команду пометки в командной панели списка — выделенные документы получат пометку на удаление.
Если нужно пометить документы одного вида за период оптом, удобнее отобрать их списком и выделить всё сочетанием Ctrl+A, а потом пометить разом.
На этом этапе база почти не нагружается: пометка меняет один реквизит объекта и не запускает проверку ссылок. Тяжёлая работа начнётся на следующем шаге.
Запуск удаления помеченных объектов порциями
Штатная обработка живёт в разделе Администрирование, группа Обслуживание → Удаление помеченных объектов (в некоторых релизах группа называется Сервис). Это основной и безопасный инструмент — он и есть современный аналог старой универсальной обработки группового удаления из прежних версий.
Обработка предлагает два режима:
- Автоматическое — удаляет всё помеченное в базе. Подходит, когда чистят регулярно и помеченного немного.
- Выборочное — вы сами отмечаете галочками, какие виды объектов или конкретные документы удалять. Именно этот режим нужен для большой разовой чистки.
Главный приём ускорения — не запускать удаление всей массы одной транзакцией. Разбивайте на порции по 500–1000 документов:
- В выборочном режиме отметьте первую партию (например, документы за один месяц).
- Запустите удаление, дождитесь завершения.
- Повторите для следующей партии.
Почему так быстрее и надёжнее:
- 🚀 Короткие транзакции не раздувают журнал и не упираются в тайм-ауты блокировок.
- 🔁 Если партия упала с ошибкой, вы теряете прогресс одной порции, а не всей чистки.
- 👀 После каждой партии видно, что не удалилось и почему, — проще разобраться со связями.
Когда обработка сообщает, что объект удалить нельзя, она показывает дерево: какой непомеченный документ или запись регистра держит ссылку. Либо пометьте и этот объект, либо разорвите связь вручную, заменив ссылку в мешающем документе.
Размер партии подбирайте под свою базу. Для небольшой файловой базы хватит порций по тысяче документов; для крупной клиент-серверной базы с сотнями пользователей лучше начать с 300–500 и смотреть на время отклика. Если партия в 500 документов чистится за минуту-две — можно укрупнять; если дольше десяти минут — дробите мельче.
Как ускорить контроль ссылочной целостности
Проверка ссылок — главный тормоз, и быстрее всего она идёт на «здоровой» базе с актуальными индексами. Тут помогает не 1С, а обслуживание самой СУБД.
Для клиент-серверной базы (PostgreSQL или Microsoft SQL Server):
- 🛠 Регулярно перестраивайте индексы и обновляйте статистику в СУБД. По устаревшей статистике оптимизатор строит медленный план, и поиск ссылок ползёт.
- 🧹 Проводите тестирование и исправление базы (
Конфигуратор → Администрирование → Тестирование и исправление) с реиндексацией таблиц. Это лечит фрагментацию внутренних индексов 1С.
Для файловой базы прямого управления индексами нет, но помогает то же ТиИ с пунктом реиндексации и предварительное сжатие базы.
Отдельная мера — ослабление контроля. В выборочном режиме обработки есть опция не контролировать ссылочную целостность (в технологических сценариях её включают при переносе данных).
Снятие контроля ссылок опасно: в базе останутся «висящие» ссылки на удалённые объекты, и документы начнут открываться с ошибкой «Объект не найден». Применяйте это только на копии базы или когда точно знаете, что на удаляемые объекты никто не ссылается.
Для рядовой чистки контроль ссылок оставляйте включённым — лучше потерпеть, чем ловить потом битые ссылки по всей базе. Если же база очень большая и проверка упорно идёт медленно даже после обслуживания СУБД, выход не в отключении контроля, а в дроблении: чем меньше партия, тем короче список ссылок, который платформа держит в памяти за один проход.
Регистры и итоги: что снять перед большой чисткой
Основной вес «тяжёлого» документа — это его движения по регистрам. Если снять их заранее, само удаление пойдёт быстрее.
Отмените проведение документов до пометки на удаление. Отмена проведения стирает движения, но оставляет документ, поэтому удаление уже не тратит время на чистку регистров. Отменять проведение тоже удобно группой — через командную панель списка. Выделите нужные документы, вызовите отмену проведения, дождитесь завершения, и только потом помечайте их на удаление. На базах, где каждый документ формирует десятки записей в регистрах, этот шаг сокращает время финальной чистки в разы.
Разнесите пересчёт итогов по времени. Регистры накопления и бухгалтерии хранят предрассчитанные итоги. Массовое удаление движений делает итоги неактуальными, и платформа помечает их на пересчёт. Пересчёт — тяжёлая операция, поэтому:
- не запускайте его параллельно с удалением;
- выполните пересчёт итогов отдельным шагом после чистки, в то же нерабочее окно;
- для регистров с большим числом измерений пересчёт заметно дольше — закладывайте на него время.
Если удаляете документы за давно закрытые периоды, проверьте границу рассчитанных итогов. Удаление ниже этой границы меньше бьёт по актуальным остаткам.
Управление итогами и их пересчёт доступны в сервисных обработках раздела Администрирование → Обслуживание; в части конфигураций форма открывается через меню Все функции.
Прямое удаление через SQL и консоль запросов
В интернете советуют «просто удалить строки в SQL» или «сделать это через консоль запросов». Разберём, почему оба пути — тупик.
Консоль запросов (внешняя обработка для отладки запросов) работает только на чтение. Выбрать данные ей можно, а удалить объект — нет. Для удаления она не предназначена в принципе.
Прямые команды DELETE в СУБД технически сотрут строки, но:
- ❌ нарушат ссылочную целостность — на удалённый объект останутся ссылки по всей базе;
- ❌ не очистят связанные таблицы (движения, итоги, таблицы изменений для обмена), и база рассыплется на несогласованные куски;
- ❌ выведут конфигурацию за рамки поддержки — фирма 1С такие базы не сопровождает.
Восстановление после прямого удаления в SQL обычно дороже, чем сэкономленное время. Не удаляйте данные 1С напрямую в СУБД — пользуйтесь штатной обработкой.
Если удалять надо программно и регулярно, правильный путь — встроенный язык 1С: перебрать объекты и вызвать удаление средствами платформы, а не SQL. Тогда платформа сама проверит ссылки и очистит связанные записи. Такой код можно обернуть в регламентное задание и запускать ночью порциями — по сути это то же, что делает штатная обработка, только под ваши условия отбора. Конкретную реализацию лучше поручить специалисту, который сопровождает базу: ошибка в скрипте удаления стоит дороже, чем в любом другом месте.
Автоматическая чистка помеченных объектов по расписанию
Если помеченные документы копятся постоянно, разовые ручные запуски — лишняя рутина. В большинстве типовых конфигураций на базе стандартных подсистем обработку удаления можно поставить на расписание.
Настройка живёт там же, рядом с ручным запуском: в форме удаления помеченных объектов включается автоматический режим и задаётся расписание регламентного задания. Раздел — всё тот же Администрирование → Обслуживание.
Что это даёт для скорости:
- 🌙 Чистка идёт ночью, когда пользователей нет и блокировки никому не мешают.
- 📉 Помеченное не накапливается месяцами, поэтому каждая ночная партия небольшая и быстрая.
- 🤖 Не нужно помнить про запуск вручную — задание срабатывает само.
Для клиент-серверной базы ставьте расписание на окно после ночного обслуживания СУБД (реиндексация, обновление статистики), чтобы удаление шло уже по свежим индексам.
Доступность автоматического режима и точное расположение настроек зависят от конфигурации и релиза, но в актуальных версиях типовых решений этот механизм есть. Если автоматического режима в вашей базе нет, остаётся ручной запуск порциями — он даёт тот же результат, просто требует вашего участия.
Сравнение способов удаления документов
| Способ | Скорость | Риск | Когда применять |
|---|---|---|---|
| Штатная обработка, автоматический режим | Средняя | Низкий | Регулярная чистка небольшого объёма |
| Штатная обработка порциями, выборочно | Высокая на больших объёмах | Низкий | Разовая массовая чистка |
| Удаление без контроля ссылок | Очень высокая | Высокий | Только на копии базы или при переносе данных |
| Прямое удаление в SQL | — | Критический | Не применять |
Вывод из таблицы один: для живой рабочей базы оптимальна штатная обработка в выборочном режиме, запускаемая порциями в нерабочее время. Остальное — либо медленнее, либо опасно.