Как удалить физическое лицо из справочника 1С, если возникает ошибка циклической ссылки с банковским счетом?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Разберем причину возникновения циклической ссылки

Для начала проанализируем техническую сторону вопроса. В архитектуре 1С существуют понятия «жестких» и «мягких» связей между объектами. В нашем случае мы имеем дело с классической циклической зависимостью двух справочников: Физические лица и Банковские счета. Ситуация выглядит следующим образом:

  1. Справочник «Банковские счета» имеет обязательный реквизит Владелец, который указывает на конкретное Физическое лицо.
  2. В то же время справочник «Физические лица» имеет реквизит Основной банковский счет, который ссылается на элемент справочника Банковские счета.

Когда мы пытаемся удалить физическое лицо, стандартный механизм Удаление помеченных объектов проверяет наличие ссылок. Он видит, что на это физлицо ссылается банковский счет. Система переходит к проверке банковского счета и видит, что на него ссылается само физическое лицо через реквизит Основной банковский счет. Возникает замкнутый круг. Стандартные алгоритмы прошлых версий БСП (Библиотеки стандартных подсистем) не всегда умеют обрабатывать такие «петли» в рамках одной транзакции, из-за чего удаление блокируется.

Метод 1: Ручной разрыв связи через создание временного объекта

Этот метод помог автору темы и является наиболее наглядным для обычного пользователя. Рассмотрим его по шагам:

  1. Выясним, какой именно банковский счет мешает удалению (он обычно отображается в списке ссылок при попытке удаления).
  2. Откроем карточку Физического лица, которое необходимо удалить.
  3. Перейдем в раздел банковских счетов этого лица и создадим новый, «фиктивный» банковский счет с произвольными данными.
  4. В основной карточке физического лица в поле Основной счет выберем этот новый созданный счет. Нажмем «Записать».
  5. Теперь связь со старым банковским счетом разорвана. Теперь мы можем зайти в список банковских счетов, пометить старый счет на удаление и успешно его удалить через стандартную обработку.
  6. После удаления старого счета очистим поле Основной счет в карточке физлица (если система позволяет оставить его пустым) или просто пометим на удаление само физлицо и новый «фиктивный» счет.

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

Метод 2: Использование обработки «Групповое изменение реквизитов»

Это более профессиональный и быстрый метод, который позволяет «обнулить» ссылку, не создавая временных объектов. Разберем алгоритм работы с этой системной обработкой:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных.
  2. Выберем пункт «Групповое изменение реквизитов».
  3. В поле «Изменять» выберем справочник Физические лица.
  4. Нажмем гиперссылку «Все элементы» и добавим условие отбора (например, Ссылка Равно [Ваше физическое лицо]). Это критически важно, чтобы не очистить данные у всех сотрудников в базе.
  5. В списке доступных реквизитов найдем Основной банковский счет.
  6. В колонке «Новое значение» оставим поле пустым (пустая ссылка).
  7. Нажмем кнопку «Изменить реквизиты». Если система выдаст предупреждение о записи объектов, согласимся.

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

Метод 3: Особенности платформенного удаления (для администраторов)

Начиная с версии платформы 8.3.15, механизм удаления был значительно переработан. Если вы столкнулись с такой проблемой, стоит проверить режим работы обработки удаления помеченных объектов. Выясним, какие варианты нам доступны:

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

Выборочное удаление: Позволяет увидеть дерево связей. Если мы выберем этот режим, мы сможем вручную указать системе, что сначала нужно обработать банковский счет. Однако, если реквизит ОсновнойБанковскийСчет в физлице не очищен, платформенный механизм все равно может выдать отказ из-за контроля ссылочной целостности.

Проанализируем ситуацию с регистрами сведений. Иногда удалению мешает не только справочник, но и записи в таких регистрах, как ФИОФизическихЛиц или ГражданствоФизическихЛиц. В норме они должны удаляться автоматически («по владельцу»), но при сбоях в индексах базы данных могут оставаться «фантомные» записи. В таком случае поможет операция «Тестирование и исправление» в конфигураторе с выбранными пунктами «Проверка ссылочной целостности» и «Реиндексация таблиц».

Метод 4: Программное решение (для разработчиков)

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


// Определим ссылку на физическое лицо
СсылкаНаФизлицо = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");

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

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

Выводы

Мы выяснили, что проблема «неудаляемого» физлица кроется в архитектурной особенности связи «Владелец — Основной реквизит». Для решения задачи мы рассмотрели:

Наиболее рекомендуемым способом для пользователей является Метод 2 (Групповое изменение), так как он не засоряет базу данных и не требует навыков программирования, обеспечивая при этом гарантированный результат при разрыве циклических зависимостей.

← На главную