К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как программно удалить элемент справочника в 1С

Как программно удалить элемент справочника в 1С: методы Удалить, УстановитьПометкуУдаления, контроль ссылочной целостности, примеры кода и типичные ошибки.

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

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

Два способа удаления: в чём разница

В платформе 1С:Предприятие удаление данных устроено двухступенчато. Пометка на удаление — это признак объекта, который виден пользователям и учитывается запросами, но сама запись остаётся в базе. Физическое удаление происходит только при запуске специальной обработки, которая проверяет, не используется ли объект в других местах.

Непосредственное удаление минует эту проверку. Если на удаляемый элемент справочника ссылается документ, запись регистра сведений или другой справочник, после удаления в этих местах появится ссылка на несуществующий объект — в интерфейсе она отображается как «Объект не найден».

Сравнение способов удаления

УстановитьПометкуУдаления + обработка удаления

Безопасный типовой путь. Контроль ссылочной целостности выполняется автоматически. Подходит для рабочих баз.

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

Быстро, но без контроля ссылок. Допустимо в тестовых базах, при загрузке/очистке данных, когда ссылок гарантированно нет.

Удаление через запрос и пакетную обработку

Для массовой пометки большого числа элементов с отбором по условиям. Требует аккуратности с транзакциями.

Как пометить элемент на удаление программно

Основной безопасный сценарий — установить пометку удаления у объекта справочника. Для этого получают объект по ссылке, вызывают метод установки пометки и записывают объект.

ЭлементСсылка = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не ЭлементСсылка.Пустая() Тогда

ЭлементОбъект = ЭлементСсылка.ПолучитьОбъект();

ЭлементОбъект.УстановитьПометкуУдаления(Истина);

КонецЕсли;

Метод УстановитьПометкуУдаления() сам записывает объект, отдельный вызов Записать() не требуется. Если вторым параметром передать Ложь, пометка снимается — так программно восстанавливают ошибочно помеченные элементы.

Если переменная уже содержит ссылку (например, получена из параметра обработки), поиск по коду не нужен — достаточно проверить, что ссылка не пустая, и получить объект.

Непосредственное удаление без пометки

Для физического удаления записи без пометки используется метод Удалить() объекта. Важно: метод вызывается именно у объекта, а не у ссылки — у ссылки такого метода нет.

ЭлементОбъект = ЭлементСсылка.ПолучитьОбъект();

ЭлементОбъект.Удалить();

Такой вариант применяют при загрузке данных из файлов, в процедурах первоначального заполнения, при очистке тестовых баз и в обменах, где гарантированно известно, что на элемент нет ссылок. В рабочей базе с реальными документами использовать его без предварительной проверки ссылок опасно.

Массовое удаление элементов по условию

Для пометки большого числа элементов удобно сначала выбрать ссылки запросом, а затем в цикле устанавливать пометку. Это быстрее, чем перебор через Выбрать(), и позволяет гибко задавать отбор.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.ЭтоГруппа = ЛОЖЬ

| И Номенклатура.ПометкаУдаления = ЛОЖЬ

| И Номенклатура.Родитель = &Родитель";

Запрос.УстановитьПараметр("Родитель", ПапкаУстаревших);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ЭлементОбъект = Выборка.Ссылка.ПолучитьОбъект();

ЭлементОбъект.УстановитьПометкуУдаления(Истина);

КонецЦикла;

При больших объёмах (десятки тысяч элементов) имеет смысл оборачивать обработку в транзакцию порциями или выполнять её в фоновом задании, чтобы не блокировать работу пользователей и не получить тайм-аут длинной транзакции.

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

Порядок безопасного массового удаления
  1. 1
    Сделайте резервную копию базы или выполните операцию сначала на копии
  2. 2
    Запросом отберите ссылки на элементы по нужному условию
  3. 3
    В цикле установите пометку удаления через УстановитьПометкуУдаления(Истина)
  4. 4
    Запустите штатную обработку «Удаление помеченных объектов» (Администрирование → Обслуживание)
  5. 5
    Проверьте, какие объекты не удалились из-за ссылок, и обработайте их вручную

Контроль ссылочной целостности и удаление помеченных

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

Программно проверить, используется ли ссылка, можно методом НайтиПоСсылкам() — он возвращает таблицу объектов, где встречается переданная ссылка. Это позволяет заранее отфильтровать элементы, которые удалить не получится.

МассивСсылок = Новый Массив;

МассивСсылок.Добавить(ЭлементСсылка);

МестаИспользования = НайтиПоСсылкам(МассивСсылок);

Если МестаИспользования.Количество() = 0 Тогда

ЭлементОбъект = ЭлементСсылка.ПолучитьОбъект();

ЭлементОбъект.Удалить();

КонецЕсли;

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

Особенности и ограничения

Удаление подчинённых элементов. Если у справочника есть подчинённый справочник (например, «Единицы измерения» у «Номенклатуры»), пометка владельца не помечает подчинённые записи автоматически при программном вызове — их нужно обрабатывать отдельным запросом по владельцу.

Права доступа. Пользователь, под которым выполняется код, должен иметь права на удаление и интерактивное удаление соответствующего справочника. В регламентных заданиях код выполняется от имени служебного пользователя — проверьте его права заранее, иначе получите ошибку «Нарушение прав доступа».

Обмены данными. В базах, участвующих в обменах (РИБ, синхронизация с другими системами), удаление объектов регистрируется в планах обмена и передаётся в другие узлы. Непосредственное удаление может привести к расхождениям данных между базами — в распределённых системах используйте только пометку на удаление.

Типичные ошибки
01
Вызов Удалить() у ссылки вместо объекта — метод есть только у объекта, полученного через ПолучитьОбъект()
02
Удаление без проверки НайтиПоСсылкам в рабочей базе — появляются битые ссылки в документах и отчётах
03
Вызов Записать() после УстановитьПометкуУдаления() — лишнее действие, метод уже записал объект
04
Удаление в цикле без транзакции и без фонового задания на больших объёмах — блокировки и тайм-ауты
05
Игнорирование подчинённых справочников — остаются «осиротевшие» записи после удаления владельца

Как проверить результат

После выполнения обработки убедитесь, что элементы действительно удалены или помечены. Быстрый способ — запрос с отбором по ссылке: пустой результат означает, что записи в таблице справочника больше нет.

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

Контрольные точки

Как проверить результат

Запрос по удалённой ссылке
Норма

Запрос возвращает пустой результат

Тревожный признак

Запись найдена — удаление не выполнено или была отменена транзакция

Отчёты и документы, где использовался элемент
Норма

Данные отображаются корректно

Тревожный признак

В полях видна строка «Объект не найден» — битая ссылка

Журнал регистрации
Норма

Есть записи об удалении без ошибок

Тревожный признак

Ошибки «Нарушение прав доступа» или конфликты блокировок

Частые вопросы

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

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

Почему обработка «Удаление помеченных объектов» не удаляет элемент?

На элемент есть ссылки из других объектов: документов, регистров, других справочников. Обработка показывает список мест использования — нужно либо очистить эти ссылки, либо удалить/пометить использующие объекты, либо оставить элемент помеченным.

Можно ли удалить предопределённый элемент справочника?

Напрямую — нет: платформа блокирует удаление предопределённых элементов, на которые ссылается код конфигурации. Сначала в конфигураторе нужно убрать предопределённость элемента (или удалить его из списка предопределённых), обновить конфигурацию базы данных и только после этого удалять.

Как удалить все элементы справочника целиком?

Выберите все ссылки запросом без условий и в цикле установите пометку удаления, затем запустите обработку удаления помеченных. Для тестовой базы допустимо непосредственное удаление через Объект.Удалить() — это заметно быстрее на больших объёмах.

Удалятся ли подчинённые элементы при удалении владельца?

При программной пометке — нет, их нужно обрабатывать отдельным запросом по реквизиту «Владелец». Штатная обработка удаления помеченных объектов при работе в монопольном режиме может удалить подчинённые записи вместе с владельцем, если они тоже помечены.

Как восстановить ошибочно удалённый элемент?

Если элемент только помечен — снимите пометку: УстановитьПометкуУдаления(Ложь). Если элемент удалён физически, восстановить его можно только из резервной копии базы. Поэтому перед массовыми операциями копия обязательна.

Итог

Что важно запомнить

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