Поиск битых ссылок в объектах

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

Когда же система становится распределенной, битые ссылки появляются, как грибы после дождя. Особенно, если используется фильтрованный обмен данными.

Например, для 1С было несколько популярных решений, позволяющих фильтровать обмен и на уровне метаданных, и на уровне данных. Говоришь - обменивайся вот этим документом, но только если в нем такая-то организация и контрагент вон из той папки. Все хорошо, но только до момента, когда кто-то настроит фильтр на сами организации или контрагентов. Тогда вполне могут появиться документы, проходящие через фильтр, но содержащие организацию, контрагента или любой другой ссылочный реквизит, через фильтр не проходящий. Или вообще - добавили программисты новый объект метаданных, справочник какой-нибудь, и используют его в типовых документах. А в настройке обмена указать свой новый справочник забыли, и он вообще в обмене не участвует.

Работа идет, люди вбивают документы, обмен шуршит, а потом - бац, обнаруживается битая ссылка (<Объект не найден:>). Начинают копать - черт побери, так они во всех документах, эти не найденные объекты! Ладно, если при записи, или в отчетах кто-нибудь заметит. А если нет? Приходится срочно садиться, настраивать фильтры и допереносить недостающие объекты.

Вся неприятность, на мой взгляд, заключена в невозможности быстро обнаруживать битые ссылки. Единственная типовая возможность обнаружить битые ссылки - выполнить тестирование и исправление. Операция так себе, т.к. требует монопольного режима, каждый день не натестируешься. Остается старый добрый метод "вылезет - разберемся".

У нас тоже появились битые ссылки, когда заработал фильтрованный обмен в подсистеме MDM. Но у нас ситуация чуть попроще - платформа-то доступна для изменений. Поэтому добавили метод поиска битых ссылок двум классам - ссылочному менеджеру RefDataManager (документ менеджер, справочник менеджер) и объекту DataObj (справочник объект, документ объект).

Работает просто. Хотим узнать, есть ли в конкретной номенклатуре битые ссылки - получаем объект, вызываем метод broken_links(), получаем массив имен полей, табличных частей и номеров строк, в которых битая ссылка. Если хотим найти битые ссылки во всем справочнике той же номенклатуры, пишем $p.cat.nom.broken_links(), и получаем аналогичный перечень, только с указанием объектов.

Разумеется, все это работает без монопольного режима, прям в консоли браузера. Наверное, потом автопроверку сделаем.