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