Удаление помеченных объектов в 1С 8.3: от пометки до чистки базы
Содержание
Пометка на удаление — это ещё не удаление. Пока вы не запустите специальную обработку, помеченный документ или элемент справочника остаётся в базе, занимает место и может всплыть в отчётах. Физически объекты убирает отдельный инструмент — в пользовательском режиме он лежит в разделе Администрирование → Обслуживание → Удаление помеченных объектов, а в Конфигураторе — в меню Администрирование → Удаление помеченных объектов.
Главное, что нужно знать заранее: 1С не даст стереть объект, на который ссылаются другие данные, и запросит монопольный доступ к базе. Ниже — как пометить, найти и физически удалить объекты в 1С 8.3, что делать с ошибками контроля ссылок и почему чистить базу через SQL нельзя.
Пометка и физическое удаление — это два разных действия
Когда вы нажимаете Del на строке списка или выбираете команду Пометить на удаление / Снять пометку, объект получает флаг пометки. В списках он отображается с характерным значком (перечёркнутая иконка), но из базы никуда не девается:
- 🔗 он по-прежнему участвует в связях — на него могут ссылаться документы, движения, регистры;
- 📊 его суммы могут попадать в отчёты, если документ был проведён до пометки;
- 💾 он занимает место в таблицах базы данных.
Физическое удаление — это необратимая операция, которая убирает запись из таблиц. Запускает её только обработка «Удаление помеченных объектов». Перед тем как стереть объект, платформа проверяет, не ссылается ли на него кто-то ещё. Этот механизм называется контролем ссылочной целостности, и именно он чаще всего мешает удалить «мусор» с первого раза.
Пометить можно как один объект, так и сразу несколько: выделите нужные строки списка мышью с зажатым Ctrl или Shift, затем нажмите Del или выберите команду пометки из командной панели. Для справочников с иерархией пометка группы предлагает пометить и все вложенные элементы — удобно, но проверьте, что внутри нет нужных позиций.
Пометку можно снять в любой момент той же командой Пометить на удаление / Снять пометку — до тех пор, пока объект физически не удалён. Поэтому пометка — безопасный «буфер»: сначала пометьте кандидатов, а стирайте физически позже, убедившись, что они действительно не нужны.
Как найти все помеченные на удаление объекты
Есть два способа посмотреть, что накопилось в базе.
Через саму обработку удаления. Запустите Администрирование → Обслуживание → Удаление помеченных объектов и выберите режим «выборочно». Программа покажет дерево всех помеченных объектов по типам — справочники, документы, записи регистров сведений. Это самый полный список: обработка видит пометки по всей базе сразу.
В конкретном списке. Откройте нужный справочник или журнал документов
. Помеченные строки видны по значку. Чтобы оставить на экране только их, настройте отбор списка по полю Пометка удаления со значением «Да» — команда настройки отбора вызывается из командной панели списка (кнопка Ещё → настройка списка).
В некоторых конфигурациях пункт обслуживания лежит в группе Корректировка данных того же раздела Администрирование. Если не нашли сразу — ищите по слову «удаление» в строке поиска команд наверху.
Пошаговое удаление помеченных объектов в пользовательском режиме
Это основной и безопасный способ. Он работает в любой типовой конфигурации на БСП — Бухгалтерии, ЗУП, Управлении торговлей.
- Убедитесь, что из базы вышли все пользователи. Обработка потребует монопольный доступ (о нём ниже).
- Откройте
Администрирование → Обслуживание → Удаление помеченных объектов. - Выберите режим:
- Автоматически — удалить все помеченные объекты, по которым нет препятствий;
- Выборочно — отметить галочками только часть дерева.
- Нажмите кнопку удаления. Программа выполнит проверку ссылок.
- Дождитесь отчёта о результатах. Удалённые объекты исчезнут, а по тем, что удалить не удалось, вы увидите список со ссылками.
Сколько времени займёт операция, зависит от объёма базы и числа помеченных объектов: от нескольких секунд до десятков минут на крупной базе с тысячами документов.
Сделайте резервную копию базы до удаления. Физическое удаление необратимо: восстановить стёртый объект можно только из копии.
Какой способ выбрать. Способов физического удаления три, и выбор зависит от того, разовая это чистка или регулярная.
| Способ | Когда применять | Контроль ссылок | Монопольный режим |
|---|---|---|---|
| Обработка, режим «автоматически» | Разовая чистка, когда точно знаете, что помечено лишнее | Да | Нужен |
| Обработка, режим «выборочно» | Большая база или когда часть пометок спорная | Да | Нужен |
Код: УдалитьОбъекты() | Регулярная чистка по расписанию, сложные условия отбора | Да | Нужен |
Напрямую в SQL (DELETE) | Не применять никогда | Нет | — |
Как видно, безопасные способы отличаются только удобством запуска — проверку ссылок и требование монопольного доступа платформа соблюдает в любом из них. Прямой DELETE в SQL выпадает из этого ряда именно потому, что обходит обе защиты.
Контроль ссылок: почему объект «нельзя удалить»
Если после запуска вы получили сообщение, что объект удалить невозможно, — сработал контроль ссылочной целостности. Платформа нашла другие данные, которые ссылаются на помеченный объект и при этом сами на удаление не помечены.
Типичные ситуации:
- на контрагента, помеченного к удалению, ссылается проведённый документ реализации;
- номенклатуру нельзя убрать, потому что она есть в остатках на складе;
- на договор ссылается счёт или платёжка.
В отчёте обработки по каждому «неудаляемому» объекту раскрывается список ссылающихся объектов. Дальше есть выбор:
- Открыть ссылающийся объект и заменить ссылку — прямо из отчёта можно перейти к документу и поправить реквизит.
- Пометить ссылающийся объект тоже — если он тоже лишний, пометьте и его, тогда удалятся оба.
- Оставить как есть — если документ нужен, объект удалять нельзя. Снимите с него пометку.
Иногда помогает встроенный инструмент замены: в отчёте бывает доступна команда поиска и замены ссылок, которая массово переназначает ссылки с удаляемого объекта на другой. Пользуйтесь ей аккуратно — она меняет данные в проведённых документах.
Монопольный режим: зачем он нужен и чем опасен
Стандартная обработка удаления работает только при монопольном (исключительном) доступе к базе. Причина простая: удаление массово меняет таблицы, и если в этот момент другой пользователь проведёт документ со ссылкой на удаляемый объект, целостность базы нарушится.
Что это значит на практике:
- в файловой базе достаточно, чтобы её никто больше не открывал;
- в клиент-серверной базе нужно завершить все сеансы. Это делается через консоль администрирования серверов или командой администрирования кластера.
Прежде чем принудительно завершать чужие сеансы, предупредите пользователей: у них оборвётся работа и несохранённые данные пропадут. Запускайте удаление в обеденный перерыв или после смены, а не в разгар рабочего дня.
Если монопольный доступ получить не удаётся, обработка так и будет писать, что база занята. Не пытайтесь обойти это — удаление без монопольного режима платформа просто не выполнит.
Удаление и поиск помеченных объектов программно
Когда нужно удалять регулярно или по сложному условию, помогает встроенный язык. Консоль запросов здесь только находит объекты — удалять через запрос нельзя, запросы в 1С доступны лишь на чтение.
Найти помеченные объекты запросом. В консоли запросов отбор по реквизиту пометки даёт список кандидатов:
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ПометкаУдаления = ИСТИНА
Удалить программно с контролем ссылок. В модуле обработки или в консоли кода используйте штатные методы платформы. НайтиПомеченныеНаУдаление() возвращает массив всех помеченных объектов, а УдалитьОбъекты() удаляет их с той же проверкой ссылок, что и обычная обработка:
МассивПомеченных = НайтиПомеченныеНаУдаление();
РезультатУдаления = НеУдаленные; // выходной параметр
УдалитьОбъекты(МассивПомеченных, РезультатУдаления);
В НеУдаленные после вызова останутся объекты, которые удалить не получилось из-за ссылок, — их можно обработать отдельно или вывести в лог.
Для разового прямого удаления одного объекта есть метод Удалить(РежимУдаления.Непосредственное) у объекта. Но он не проверяет ссылки и может оставить «висящие» ссылки в документах. Для чистки базы всегда предпочтительнее УдалитьОбъекты().
Почему нельзя чистить базу напрямую в SQL
В клиент-серверном варианте база лежит в SQL (чаще MS SQL Server или PostgreSQL), и возникает соблазн удалить строки прямо запросом DELETE в базе данных. Так делать нельзя.
1С хранит данные не так, как видит пользователь: одна номенклатура — это записи сразу в нескольких служебных таблицах (основная таблица, таблицы движений, индексы, итоги регистров). Удаление строки напрямую в SQL:
- не затрагивает связанные таблицы — остаются «осколки» данных;
- ломает ссылочную целостность, которую платформа считает гарантированной;
- может привести к ошибкам формата потока, нечитаемым документам и неработающим отчётам.
Восстановить такую базу штатными средствами обычно уже нельзя — только откат на резервную копию. Поэтому единственный правильный способ физического удаления — через платформу: обработкой «Удаление помеченных объектов» или методом УдалитьОбъекты(). SQL-доступ оставьте для чтения и диагностики, но не для удаления данных 1С.
Автоматизация регулярной чистки
Если помеченных объектов копится много (например, после регулярных обменов или загрузок), удаление можно поставить на поток.
Регламентное задание. В клиент-серверной базе вызов НайтиПомеченныеНаУдаление() + УдалитьОбъекты() оформляют отдельной обработкой и запускают по расписанию ночью, когда пользователей нет. Расписание настраивается в разделе администрирования, в списке регламентных и фоновых заданий.
Запуск по графику из командной строки. Для файловых и небольших баз обработку удаления запускают пакетным режимом 1cv8 по заданию планировщика ОС — тоже в нерабочее время.
Автоматическое удаление без контроля опасно тем, что сотрудник может пометить нужный объект по ошибке, а задание сотрёт его ночью. Для баз, где пометки ставят вручную, безопаснее периодически запускать удаление в выборочном режиме и глазами просматривать дерево.
Разумный компромисс — автоматизировать удаление только тех типов объектов, которые заведомо являются мусором (например, пустые заготовки из обмена), а остальное чистить вручную раз в месяц. Перед тем как ставить задание на поток, прогоните его вручную хотя бы один раз и посмотрите в отчёте, что именно оно удаляет: так вы увидите, не попадают ли под нож нужные данные, и сможете уточнить условие отбора в коде.
И ещё один практический момент: регулярная чистка заметно уменьшает размер базы и ускоряет работу обменов и отчётов. Но гнаться за «нулём помеченных» не нужно — пометка сама по себе не тормозит базу, важнее не стереть лишнее, чем убрать всё до последней записи.
Частые вопросы
Можно ли вернуть объект после физического удаления?
Почему после удаления элемента справочника в отчётах остались его суммы?
Обязательно ли выгонять всех пользователей?
Сработает ли удаление в облачной базе (1С:Фреш)?
Администрирование → Обслуживание → Удаление помеченных объектов. Монопольный режим в сервисе обеспечивается автоматически на время операции.