Разработка и Конфигурация · 9 мин
Как пометить на удаление программно в 1С
Как пометить объект на удаление программно в 1С: метод УстановитьПометкуУдаления, работа с документами, справочниками и ссылочными объектами, примеры кода.
Пометка на удаление в 1С — это штатный механизм безопасного удаления данных: объект не стирается из базы физически, а лишь получает признак «помечен на удаление». Программно эта операция выполняется методом УстановитьПометкуУдаления(), который есть у любого ссылочного объекта: справочника, документа, плана счетов, плана видов характеристик и других.
Важно понимать, что пометка на удаление — не то же самое, что физическое удаление. Помеченный объект остаётся в базе, участвует в движениях (проведённые документы продолжают влиять на регистры), но по умолчанию исключается из большинства отчётов и подборов. Окончательное удаление выполняется отдельной обработкой «Удаление помеченных объектов» с контролем ссылочной целостности.
Ниже разобраны основные сценарии: пометка одного объекта, массовая обработка, работа с проведёнными документами, отличия для разных типов данных и типичные ошибки, которые приводят к падению кода или порче данных.
Базовый синтаксис метода УстановитьПометкуУдаления
Метод вызывается у объекта данных, а не у ссылки. Поэтому стандартная последовательность всегда состоит из двух шагов: получить объект по ссылке и установить пометку. Попытка вызвать метод у ссылки вызовет ошибку «Метод объекта не обнаружен».
СправочникОбъект = СсылкаНаЭлемент.ПолучитьОбъект();
СправочникОбъект.УстановитьПометкуУдаления(Истина);Параметр метода — булево значение: Истина ставит пометку, Ложь — снимает её. Для документов у метода есть второй необязательный параметр, управляющий отменой проведения (в типовых реализациях пометка проведённого документа без отмены проведения вызывает исключение, поэтому проведение отменяют явно).
Метод сам выполняет запись объекта в базу — отдельно вызывать Записать() после него не требуется. Однако это означает, что сработают все подписки на события записи и проверки заполнения, если они предусмотрены конфигурацией.
Пометка на удаление документа
Документы — самый частый случай, и здесь есть нюанс: проведённый документ нельзя пометить на удаление, не отменив проведение. Если попытаться сделать это напрямую, платформа выдаст ошибку. Правильный код сначала проверяет признак проведения и отменяет его.
ДокОбъект = ДокументСсылка.ПолучитьОбъект();
Если ДокОбъект.Проведен Тогда
ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
ДокОбъект.УстановитьПометкуУдаления(Истина);Отмена проведения удаляет движения документа по регистрам. Если документ участвовал в последовательностях, это может потребовать восстановления последовательности. В больших базах массовая отмена проведения — ресурсоёмкая операция, её стоит выполнять вне пиковой нагрузки.
Снятие пометки с документа
Обратная операция выполняется тем же методом с параметром Ложь. Проведение при этом автоматически не восстанавливается: если документ был проведён до пометки, после снятия пометки его нужно провести заново явным вызовом записи в режиме проведения.
Пометка элементов справочников и других ссылочных объектов
Справочники, планы видов характеристик, планы счетов и планы обмена помечаются одинаково. Для иерархических справочников пометка группы не помечает автоматически вложенные элементы — если нужно пометить всю ветку, потребуется обход иерархии запросом или рекурсией.
Предопределённые элементы справочников пометить на удаление можно, но делать это стоит с осторожностью: код конфигурации и типовые алгоритмы обращаются к ним по имени, и их отсутствие в выборках может нарушить логику. В управляемых конфигурациях предопределённые элементы часто защищены от пометки на уровне прикладного кода.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура
|ГДЕ Ссылка В ИЕРАРХИИ(&Группа) И НЕ ПометкаУдаления";
Запрос.УстановитьПараметр("Группа", ГруппаСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.УстановитьПометкуУдаления(Истина);
КонецЦикла;Массовая пометка на удаление через запрос
Для обработки множества объектов сначала выбирают ссылки запросом, затем в цикле получают объекты и помечают их. Чтобы не тянуть лишние данные, в запросе выбирают только поле Ссылка. Если объём большой, операцию выполняют порциями и в транзакции либо, наоборот, без общей транзакции, чтобы не держать длинные блокировки.
- 1Сформируйте запрос, выбирающий ссылки на нужные объекты с фильтрами (период, организация, признак пометки)
- 2В цикле по выборке получайте объект методом ПолучитьОбъект()
- 3Для проведённых документов отменяйте проведение перед пометкой
- 4Вызывайте УстановитьПометкуУдаления(Истина)
- 5Зафиксируйте результат: количество обработанных и пропущенных объектов
Для очень больших объёмов есть оптимизация: метод УстановитьПометкуУдаления у объекта можно заменить установкой реквизита ПометкаУдаления с записью в режиме РежимЗаписиДокумента.Запись, но для документов это не отменяет проведение, поэтому применимо только к непроведённым или к справочникам. Прямая установка свойства и Объект.Записать() работает быстрее, если отключить проверки через ОбменДанными.Загрузка = Истина, но это обходит бизнес-логику и допустимо только при полном понимании последствий.
Пометка в клиент-серверном и управляемом приложении
Код пометки на удаление выполняется на сервере. В управляемых формах вызов помещают в серверную процедуру с директивой &НаСервере или в общий серверный модуль. В тонком клиенте недоступен прямой вызов ПолучитьОбъект() на клиенте — попытка сделать это в клиентской процедуре приведёт к ошибке компиляции или выполнения.
В типовых конфигурациях на БСП для интерактивной пометки используется команда интерфейса, а программно рекомендуется работать через стандартные механизмы, чтобы сохранились обработчики, например запись в журнал регистрации и проверки прав. Права на пометку контролируются стандартным правом «Удаление» и «Интерактивное удаление» у роли пользователя.
Что происходит после пометки: контроль и удаление
Помеченные объекты остаются в базе и занимают место. Физическое удаление выполняется обработкой «Удаление помеченных объектов» (в типовых — через раздел администрирования). Обработка проверяет ссылочную целостность: если на помеченный объект есть ссылки из других объектов, удаление будет заблокировано, и система покажет список препятствующих ссылок.
Как проверить результат
Запрос по ссылке возвращает ПометкаУдаления = Истина
Признак не изменился — вероятно, код упал с исключением до вызова метода
После отмены проведения движений нет
Движения остались — проведение не было отменено
Обработка удаления не находит препятствующих ссылок
Есть ссылки на объект — сначала очистите их
Типичные ошибки и ограничения
Ещё одно ограничение: регистры сведений, регистры накопления и бухгалтерии не имеют пометки на удаления — их записи удаляются только физически через набор записей. Пометка применима исключительно к объектам ссылочного типа.
Что важно запомнить
Пометка ставится методом УстановитьПометкуУдаления у объекта, полученного через ПолучитьОбъект(). Проведённые документы сначала отменяют проведением. Массовые операции выполняют на сервере, порциями, с резервной копией. Физическое удаление — отдельный этап с контролем ссылочной целостности.
Частые вопросы
Можно ли пометить на удаление без получения объекта?
Штатного метода у ссылки нет. Для массовых операций иногда применяют прямое изменение через запрос к таблице на уровне СУБД, но это нарушает поддержку и целостность — в рамках платформы всегда используйте ПолучитьОбъект() и УстановитьПометкуУдаления().
Как пометить на удаление все документы за период?
Запросом выберите ссылки документов с отбором по дате, затем в цикле получайте объекты, отменяйте проведение у проведённых и вызывайте УстановитьПометкуУдаления(Истина). Обрабатывайте порциями, чтобы избежать длинных транзакций.
Почему помеченный объект всё ещё виден в отчётах?
Некоторые отчёты и движения по регистрам не фильтруют помеченные объекты автоматически. Если документ остался проведённым, его движения продолжают учитываться. Проверьте, отменено ли проведение, и настройки отбора в конкретном отчёте.
Как снять пометку на удаление программно?
Тот же метод с параметром Ложь: Объект.УстановитьПометкуУдаления(Ложь). Если документ ранее был проведён, после снятия пометки проведите его заново вызовом Записать(РежимЗаписиДокумента.Проведение).
Можно ли пометить запись регистра сведений?
Нет. Регистры не поддерживают пометку на удаление. Записи регистра сведений удаляют физически: получают набор записей с отбором, очищают его и записывают, либо удаляют конкретную запись через менеджер записи.
Что делать, если объект не удаляется обработкой удаления помеченных?
Обработка показывает список объектов, ссылающихся на помеченный. Откройте эти объекты и очистите ссылки (замените значения реквизитов, удалите строки табличных частей), затем повторите удаление. Альтернатива — режим монопольного удаления без контроля, но он оставит битые ссылки.