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