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