Программирование в 1С

Как в 1С удалить объект программно: пометка и удаление

Коротко

Обычно объект справочника или документа не удаляют сразу: получают объект по ссылке и вызывают УстановитьПометкуУдаления(Истина). Запись остаётся в базе, а окончательное удаление выполняют штатным удалением помеченных объектов после контроля ссылок.

Объект.Удалить() удаляет данные непосредственно, без проверки ссылочной целостности и возможности штатного восстановления. Этот вариант допустим только после отдельной проверки зависимостей и при наличии метода у конкретного типа.

1С: удалить объект программно через пометку удаления

Для прикладных объектов основной сценарий — установить реквизит ПометкаУдаления специальным методом объекта. Не присваивайте системному реквизиту значение напрямую: УстановитьПометкуУдаления() выполняет предусмотренную платформой операцию и учитывает логику объекта.

Ссылка = Справочники.Номенклатура.НайтиПоКоду("00-000123");
Если НЕ Ссылка.Пустая() Тогда
    Объект = Ссылка.ПолучитьОбъект();
    Объект.УстановитьПометкуУдаления(Истина);
КонецЕсли;
УстановитьПометкуУдаления
ПометкаУдаленияИстина — установить, Ложь — снять
ВключаяПодчиненныедоступен у отдельных типов, включая справочники
без возвращаемого значения

Наличие второго параметра зависит от типа объекта. Для обычного документа сигнатура — УстановитьПометкуУдаления(<ПометкаУдаления>); не переносите вариант с подчинёнными объектами на все типы автоматически.

Пометка удаления справочников и документов

У справочника пометка позволяет сначала исключить устаревший элемент из рабочих сценариев, проверить его использование и при необходимости снять пометку. Для иерархического справочника решение о пометке группы вместе с подчинёнными элементами должно быть явным.

Группа = Справочники.Номенклатура.НайтиПоКоду("АРХИВ");
Если НЕ Группа.Пустая() Тогда
    ОбъектГруппы = Группа.ПолучитьОбъект();
    ОбъектГруппы.УстановитьПометкуУдаления(Истина, Истина);
КонецЕсли;

Документ перед пометкой обычно нужно распровести по правилам конфигурации. Сама пометка не заменяет анализ движений и связанных бизнес-процессов:

СсылкаДокумента = Документы.ЗаказКлиента.НайтиПоНомеру("00000123");
Если НЕ СсылкаДокумента.Пустая() Тогда
    ДокументОбъект = СсылкаДокумента.ПолучитьОбъект();
    ДокументОбъект.УстановитьПометкуУдаления(Истина);
КонецЕсли;

Непосредственное удаление методом Объект.Удалить()

Для объектов справочников и документов платформа предусматривает Удалить(). Метод физически удаляет объект без проверки ссылочной целостности. Ссылки из других данных могут остаться, поэтому использовать вызов в обычной бизнес-логике рискованно.

Ссылка = Справочники.Номенклатура.НайтиПоКоду("TEST-001");
Если НЕ Ссылка.Пустая() Тогда
    Объект = Ссылка.ПолучитьОбъект();
    Объект.Удалить();
КонецЕсли;
Удалить
без возвращаемого значения

Перед вызовом убедитесь, что удаление действительно поддерживается типом объекта. Наличие одноимённого метода у коллекции, табличной части или другого типа не означает одинаковую семантику.

В Консоли кода: попросите агента сначала сформировать отчёт по кандидатам и найденным ссылкам, а установку пометок выполнять отдельным подтверждённым шагом. Так выборку можно проверить до изменения данных.

Контроль ссылочной целостности и поиск ссылок

Штатное удаление помеченных объектов анализирует ссылки и не удаляет объект, пока на него ссылаются другие данные. Это принципиальное отличие от непосредственного Удалить().

Универсального метода объекта НайтиПоСсылкам() в стандартном прикладном API нет. Под выражением «найти по ссылкам» обычно имеют в виду механизм поиска ссылок платформы, штатную обработку удаления помеченных объектов либо собственный анализ метаданных и запросы к потенциальным местам хранения. Не следует публиковать вызов несуществующего метода только по аналогии с названием команды интерфейса.

Практический порядок: собрать ссылки кандидатов, определить типы реквизитов и измерений, способные их хранить, выполнить запросы по этим объектам метаданных и вывести источник каждой зависимости. Для окончательного удаления предпочтительнее штатный механизм: он знает структуру конфигурации и показывает объекты, мешающие удалению.

Массовая пометка объектов на удаление

Не загружайте все объекты без отбора. Сначала запросом получите только ссылки кандидатов, затем обрабатывайте их порциями. Записывайте результат каждой порции, чтобы повторный запуск был идемпотентным и не начинался с нуля.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 500
|   Номенклатура.Ссылка
|ИЗ
|   Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|   Номенклатура.ЭтоГруппа = ЛОЖЬ
|   И Номенклатура.ПометкаУдаления = ЛОЖЬ
|   И Номенклатура.ДатаПоследнегоИспользования < &Граница";
Запрос.УстановитьПараметр("Граница", ДобавитьМесяц(ТекущаяДата(), -24));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Объект = Выборка.Ссылка.ПолучитьОбъект();
    Объект.УстановитьПометкуУдаления(Истина);
КонецЦикла;

Имя реквизита и критерий устаревания в примере условны: подставьте поля конфигурации. Для больших объёмов ограничивайте время выполнения, фиксируйте прогресс и не помещайте всю выборку в одну длинную транзакцию.

Удаление набора записей регистра отдельно

Регистр — не ссылочный объект справочника или документа: у его записей нет ПометкаУдаления. Для удаления создают набор записей, задают отбор по измерениям и записывают пустой набор с замещением. Такой код удаляет записи только в области установленного отбора.

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(НоменклатураСсылка);
НаборЗаписей.Записать();

Для подчинённого регистратору регистра отбор обычно задаётся по регистратору. Не смешивайте очистку регистра с удалением объекта: сначала определите, являются ли записи движениями документа и должен ли их удалять механизм проведения.

Права, обработчики записи и транзакции

Операция выполняется в контексте прав текущего пользователя. Недостаток прав на изменение или удаление приведёт к исключению; обходить ограничения привилегированным режимом без отдельного обоснования нельзя.

УстановитьПометкуУдаления() изменяет объект и может задействовать прикладную логику записи. Обработчики ПередЗаписью и ПриЗаписи, подписки на события и проверки конфигурации способны запретить операцию или изменить связанные данные. Перед массовым запуском проверьте один объект в том же серверном контексте.

Транзакция полезна для согласованного изменения небольшой связанной группы, но массовую очистку лучше делить на порции:

НачатьТранзакцию();
Попытка
    Объект = Ссылка.ПолучитьОбъект();
    Объект.УстановитьПометкуУдаления(Истина);
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

Не скрывайте ошибку пустым обработчиком исключения: после отката её нужно записать в журнал или передать вызывающему коду. Длинная транзакция удерживает блокировки и повышает цену повторного запуска.

Для безопасного запуска: агент Консоли может разделить задачу на режим предпросмотра, массовую пометку порциями и повторный отчёт по оставшимся ссылкам. Непосредственное удаление оставьте отдельной явно подтверждаемой операцией.

Частые ошибки при программном удалении в 1С

  • Вызывать Удалить() вместо пометки. Объект исчезает без штатной проверки ссылок и без простого восстановления.
  • Присваивать ПометкаУдаления напрямую. Используйте УстановитьПометкуУдаления().
  • Выдумывать НайтиПоСсылкам(). Проверяйте доступный API в синтакс-помощнике и используйте штатный поиск ссылок или запросы.
  • Считать регистр обычным объектом. Его записи удаляются через набор записей и отбор, а не через пометку.
  • Игнорировать проведение документа. Перед пометкой учитывайте движения и правила конфигурации.
  • Запускать всю выборку одной транзакцией. Это создаёт длительные блокировки и усложняет восстановление.
  • Не учитывать права и обработчики. Массовый код может остановиться на первой прикладной проверке.

Частые вопросы об удалении объектов в 1С

Как снять пометку удаления с объекта программно?

Получите объект по ссылке и вызовите УстановитьПометкуУдаления(Ложь). Операция также подчиняется правам и прикладным обработчикам записи.

Почему помеченный объект не удаляется окончательно?

Чаще всего на него существуют ссылки из других объектов. Запустите штатное удаление помеченных объектов и изучите список зависимостей, затем исправьте или удалите ссылки по правилам учёта.

Можно ли удалить записи регистра методом Удалить() объекта?

Нет, записи регистра обрабатываются отдельно. Создайте набор записей, установите точный отбор и запишите пустой набор; для движений документа используйте штатную логику проведения и отмены проведения.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф