В процессе работы с конфигурацией «1С:Бухгалтерия предприятия 3.0» или другими решениями на базе «1С:Предприятие 8.3» пользователи часто сталкиваются с невозможностью удаления элементов справочника Физические лица. Типичная ситуация: объект помечен на удаление, все документы вычищены, но при запуске стандартной обработки удаления система сообщает, что объект используется и ссылается сам на себя через другой справочник. В этой статье мы подробно разберем, почему возникает такая проблема и как ее решить несколькими способами.
Для начала проанализируем техническую сторону вопроса. В архитектуре 1С существуют понятия «жестких» и «мягких» связей между объектами. В нашем случае мы имеем дело с классической циклической зависимостью двух справочников: Физические лица и Банковские счета. Ситуация выглядит следующим образом:
Владелец, который указывает на конкретное Физическое лицо.Основной банковский счет, который ссылается на элемент справочника Банковские счета.Когда мы пытаемся удалить физическое лицо, стандартный механизм Удаление помеченных объектов проверяет наличие ссылок. Он видит, что на это физлицо ссылается банковский счет. Система переходит к проверке банковского счета и видит, что на него ссылается само физическое лицо через реквизит Основной банковский счет. Возникает замкнутый круг. Стандартные алгоритмы прошлых версий БСП (Библиотеки стандартных подсистем) не всегда умеют обрабатывать такие «петли» в рамках одной транзакции, из-за чего удаление блокируется.
Этот метод помог автору темы и является наиболее наглядным для обычного пользователя. Рассмотрим его по шагам:
Физического лица, которое необходимо удалить.Основной счет выберем этот новый созданный счет. Нажмем «Записать».Основной счет в карточке физлица (если система позволяет оставить его пустым) или просто пометим на удаление само физлицо и новый «фиктивный» счет.Проанализируем этот способ: он рабочий, но требует создания лишних записей в базе данных, что не всегда удобно, если нужно удалить десятки или сотни объектов.
Это более профессиональный и быстрый метод, который позволяет «обнулить» ссылку, не создавая временных объектов. Разберем алгоритм работы с этой системной обработкой:
Физические лица.Ссылка Равно [Ваше физическое лицо]). Это критически важно, чтобы не очистить данные у всех сотрудников в базе.Основной банковский счет.После этой операции реквизит Основной банковский счет у физического лица станет пустым. Цикл разорван. Теперь можно повторно запустить Удаление помеченных объектов, и система беспрепятственно удалит и банковский счет, и само физическое лицо.
Начиная с версии платформы 8.3.15, механизм удаления был значительно переработан. Если вы столкнулись с такой проблемой, стоит проверить режим работы обработки удаления помеченных объектов. Выясним, какие варианты нам доступны:
Автоматическое удаление всех объектов: Пытается удалить всё сразу. Именно здесь чаще всего возникают ошибки при циклических ссылках.
Выборочное удаление: Позволяет увидеть дерево связей. Если мы выберем этот режим, мы сможем вручную указать системе, что сначала нужно обработать банковский счет. Однако, если реквизит ОсновнойБанковскийСчет в физлице не очищен, платформенный механизм все равно может выдать отказ из-за контроля ссылочной целостности.
Проанализируем ситуацию с регистрами сведений. Иногда удалению мешает не только справочник, но и записи в таких регистрах, как ФИОФизическихЛиц или ГражданствоФизическихЛиц. В норме они должны удаляться автоматически («по владельцу»), но при сбоях в индексах базы данных могут оставаться «фантомные» записи. В таком случае поможет операция «Тестирование и исправление» в конфигураторе с выбранными пунктами «Проверка ссылочной целостности» и «Реиндексация таблиц».
Если нам нужно массово очистить такие связи в коде, мы можем воспользоваться программным способом. Рассмотрим пример кода, который разрывает связь, очищая реквизит:
// Определим ссылку на физическое лицо
СсылкаНаФизлицо = Справочники.ФизическиеЛица.НайтиПоНаименованию("Иванов Иван Иванович");
Если Не СсылкаНаФизлицо.Пустая() Тогда
// Создаем объект для изменения
ОбъектФизлицо = СсылкаНаФизлицо.ПолучитьОбъект();
// Очищаем ссылку на банковский счет
ОбъектФизлицо.ОсновнойБанковскийСчет = Справочники.БанковскиеСчета.ПустаяСсылка();
// Записываем объект с отключением проверок (если необходимо)
ОбъектФизлицо.ОбменДанными.Загрузка = Истина;
ОбъектФизлицо.Записать();
Сообщить("Связь разорвана успешно");
КонецЕсли;
Использование флага ОбменДанными.Загрузка = Истина позволяет обойти прикладные проверки модуля объекта, что полезно, когда объект заполнен не полностью или имеет другие логические ошибки, мешающие простой записи. После выполнения этого кода стандартная процедура удаления помеченных объектов отработает корректно.
Мы выяснили, что проблема «неудаляемого» физлица кроется в архитектурной особенности связи «Владелец — Основной реквизит». Для решения задачи мы рассмотрели:
Группового изменения реквизитов для быстрой очистки поля Основной банковский счет.ПолучитьОбъект().Наиболее рекомендуемым способом для пользователей является Метод 2 (Групповое изменение), так как он не засоряет базу данных и не требует навыков программирования, обеспечивая при этом гарантированный результат при разрыве циклических зависимостей.