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