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