Можно ли удалить или очистить владельца у записи подчиненного справочника в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Ограничение платформы: почему владелец не может быть пустым

Проанализируем базовую концепцию подчинения в платформе 1С. В структуре метаданных существует разграничение между двумя понятиями:

  1. Родитель (Иерархия): признак иерархического справочника (группы и элементы), где элемент верхнего уровня не имеет родителя (Родитель = ПустаяСсылка()).
  2. Владелец (Подчинение): системный механизм жесткой привязки записей одного справочника к другому объекту метаданных.

Для подчиненного справочника системный реквизит Владелец является обязательным на уровне платформы и СУБД. Платформа физически не позволяет записать элемент подчиненного справочника со значением Неопределено или ПустаяСсылка() в поле владельца. При попытке программного вызова метода Записать() без заполненного владельца будет вызвано системное исключение.

Способ 1. Стандартное удаление владельца вместе с подчиненными элементами

Рассмотрим типовую ситуацию: вам требуется удалить элемент-владелец (например, контрагента или договор), у которого есть подчиненные элементы. Если подчиненные данные больше не нужны, правильный алгоритм выглядит следующим образом:

  1. Пометить на удаление подчиненные элементы справочника.
  2. Пометить на удаление сам объект-владелец.
  3. Запустить стандартную обработку Удаление помеченных объектов.

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

Способ 2. Переподчинение (смена владельца) для сохранения данных

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

  1. Создаем в справочнике-владельце специальный технический элемент (например, "Архив", "Общие" или "Удаленные владельцы").
  2. Программно или интерактивно перезаписываем подчиненные объекты, переназначив им нового владельца.
  3. После освобождения ссылок на старого владельца выполняем его удаление стандартными средствами.

Посмотрим на пример программной смены владельца:


Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, СтарыйКонтрагент);
Пока Выборка.Следующий() Цикл
    ОбъектДоговор = Выборка.ПолучитьОбъект();
    ОбъектДоговор.Владелец = НовыйКонтрагентАрхив;
    ОбъектДоговор.Записать();
КонецЦикла;

Способ 3. Пересмотр архитектуры справочника

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

  1. В дереве метаданных на вкладке Владельцы очистить список владельцев, сделав справочник независимым.
  2. Добавить собственный пользовательский реквизит ссылочного типа (например, Контрагент).
  3. На формах элемента и списка настроить Связи параметров выбора для фильтрации данных.

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

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

Выясним причину, почему нельзя применять непосредственное удаление через метод Удалить() без контроля целостности. Если удалить объект-владелец напрямую, подчиненные записи останутся в базе, но в поле Владелец появится битая ссылка вида <Объект не найден...>.

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

← На главную