В информационных базах 1С:Предприятие объекты часто связаны между собой ссылками – это специальный тип данных, с помощью которого одни справочники, документы или регистры хранят связь с другими. Например, в документе «Реализация товаров» есть реквизит «Контрагент» со ссылкой на элемент справочника «Контрагенты». При удалении или изменении объектов важно быстро найти все такие ссылки, чтобы не нарушить целостность данных. Встроенная функция НайтиПоСсылкам платформы 1С:Предприятие позволяет выполнить поиск ссылок на заданные объекты в текущей базе данных. В этой статье рассмотрим, как правильно использовать НайтиПоСсылкам, приведем примеры кода с разными параметрами, а также обсудим альтернативные подходы для ускоренного поиска ссылок.
Функция НайтиПоСсылкам в 1С
НайтиПоСсылкам — это служебная функции платформы 1С:Предприятие (начиная с версии 8.3.5), которая ищет ссылки на переданные объекты в базе данных. Поиск выполняется на сервере базы данных с учетом настроек разделения данных и пользовательских прав. Функция возвращает результат в виде ТаблицыЗначений, где каждая строка содержит ссылку на искомый объект и ссылку на объект, который содержит эту ссылку. Формат результата обычно такой:
- Колонка 0: искомая ссылка (объект, на который ищем ссылки).
- Колонка 1: ссылка на объект, содержащий найденную ссылку (обычно запись объектной таблицы).
- Колонка 2: метаданные того объекта, в данных которого найдена ссылка (например, наименование объекта метаданных).
Основной (обязательный) параметр функции — это массив объектов-ссылок (Массив). Функция может принимать несколько дополнительных (необязательных) параметров:
ОбластьПоиска(массив массивов разделителей) — настраивает область данных, где выполнять поиск (по умолчанию поиск во всех доступных данных).ВключитьОбъекты(массив метаданных) — явно указывает набор объектов метаданных, в которых следует искать ссылки.ИсключитьОбъекты(массив метаданных) — указывает объекты метаданных, которые нужно исключить из поиска.
Если параметры ОбластьПоиска, ВключитьОбъекты и ИсключитьОбъекты не заданы (или равны Неопределено), поиск выполняется по всем данным, доступным текущему сеансу. Помните, что функция требует достаточных прав доступа: если у текущего пользователя есть ограничения на чтение некоторых объектов, вызов НайтиПоСсылкам лучше выполнять в привилегированном режиме или от имени администратора, иначе может возникнуть ошибка прав.
Пример 1С: использование НайтиПоСсылкам
Рассмотрим пример использования функции НайтиПоСсылкам. Допустим, мы хотим найти все ссылки на помеченные на удаление объекты в базе (например, документы или справочники). Сначала получим массив ссылок на помеченные объекты функцией НайтиПомеченныеНаУдаление, а затем передадим его в НайтиПоСсылкам:
Ссылки = НайтиПомеченныеНаУдаление(); ТабСсылок = НайтиПоСсылкам(Ссылки); Для Каждого СтрокаИзТаблицы Из ТабСсылок Цикл Сообщить("Объект: " + СтрокаИзТаблицы[0] + ", найден в: " + СтрокаИзТаблицы[1]); КонецЦикла;
В этом примере мы передали в функцию массив из всех помеченных на удаление записей. На выходе ТабСсылок — это таблица значений, где для каждой исходной ссылки (столбец 0) указана запись, в которой она содержится (столбец 1). Такой код позволяет, например, безопасно очищать справочники: перед удалением элемента проверить, нет ли на него ссылок в других документах или регистрах.
Можно также найти ссылки на конкретный объект. Допустим, у нас есть справочник Номенклатура, и нужно узнать, где он используется. Пример кода:
Товар = Справочники.Номенклатура.НайтиПоКоду("ART-100"); // поиск элемента справочника Если Товар <> Неопределено Тогда МассивСсылок = Новый Массив; МассивСсылок.Добавить(Товар); ТабСсылок = НайтиПоСсылкам(МассивСсылок); Для Каждого Строка Из ТабСсылок Цикл Сообщить("Ссылка на товар найдена в объекте: " + Строка[1]); КонецЦикла; КонецЕсли;
В этом примере мы передаем в НайтиПоСсылкам массив из одной ссылки (элемент справочника). Функция вернет все места, где этот элемент указан в других объектах. Обратите внимание, что даже при одном объекте нужно использовать массив – один элемент.
Функция позволяет указывать дополнительные фильтры. Например, можно сузить область поиска, исключить некоторые объекты или наоборот – искать только в выбранных метаданных. Пример с включением и исключением метаданных:
Ссылки = Новый Массив; Ссылки.Добавить(Документы.ЗаказПокупателя.СоздатьЭлемент()); // ссылка на новый (или существующий) документ ВключитьОбъекты = Новый Массив; ВключитьОбъекты.Добавить(Метаданные.Документы.ЗаказПокупателя); ИсключитьОбъекты = Новый Массив; ИсключитьОбъекты.Добавить(Метаданные.РегистрСведений.СтатусыЗаказов); ТабСсылок = НайтиПоСсылкам(Ссылки, Новый Массив, ВключитьОбъекты, ИсключитьОбъекты);
В этом коде мы передаем в функцию массив метаданных: ВключитьОбъекты ограничивает поиск объектами документов «ЗаказПокупателя», а ИсключитьОбъекты убирает из поиска регистр «СтатусыЗаказов». Это пример того, как с помощью дополнительных параметров сфокусировать поиск. Учтите, что некорректное задание параметров (например, путаница порядка Включить и Исключить) может привести к ошибкам или пустому результату.
Как найти существующие ссылки на объекты 1С
Кроме программного использования функции НайтиПоСсылкам, в платформе 1С:Предприятие есть другие инструменты для обнаружения связей между объектами. В интерфейсе 1С:Предприятие (режим Предприятия) обычно доступна стандартная обработка «Поиск ссылок на объект». Ее можно открыть в меню Сервис и настройка – Все функции – Поиск ссылок на объект (в новых версиях – раздел «Функции для технического специалиста»). В этом инструменте достаточно указать объект (например, элемент справочника или документ), и встроенный механизм найдет все ссылки на него среди данных базы. За кулисами эта обработка часто использует ту же самую функцию НайтиПоСсылкам.
Если требуется найти ссылки программно, воспользуйтесь НайтиПоСсылкам как было показано выше. Преимущество – вы получаете результат в табличной форме и можете обработать его в коде. Например, по результатам найти все документы, которые содержат ссылку на нужный элемент, и выполнить с ними какие-то действия (перепровести, удалить и т.д.).
Важно: при поиске существующих ссылок учитывайте, что регистры накопления в 1С:Предприятие хранят данные в разрезе регистраторов. Функция НайтиПоСсылкам ищет ссылки в самих записях регистров, но не в регистраторе. Поэтому, если у вас есть необходимость искать ссылки в регистрах накопления, может потребоваться дополнительная фильтрация по регистратору. В общем случае, функция позволяет обнаружить любую ссылочную зависимость между объектами, если только у пользователя есть права на чтение соответствующих данных.
Как ускорить поиск ссылок в 1С вместо НайтиПоСсылкам
Хотя НайтиПоСсылкам надежно находит все ссылки, на больших базах данных такой поиск может быть медленным: функция сканирует множество таблиц, что особенно заметно при большом объеме записей. Чтобы ускорить процесс, используют альтернативные подходы:
- Использование SQL-запросов или встроенных запросов 1С: если вы знаете, в каких таблицах хранятся ссылки на ваш объект, можно обойтись запросом. Например, чтобы найти документы, в которых указан конкретный справочник, можно написать запрос 1С:Предприятие или SQL напрямую к соответствующей таблице. Пример на языке запросов 1С:Предприятие:
Такой запрос обычно выполняется быстрее, особенно если по полю «Номенклатура» стоят индексы в базе SQL. Минус – нужно знать структуру метаданных и писать запросы для каждой таблицы отдельно.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.ПоступлениеТоваров ГДЕ Номенклатура = &Товар"; Запрос.УстановитьПараметр("Товар", Справочники.Номенклатура.НайтиПоКоду("ART-100")); Результат = Запрос.Выполнить();
- Массовая пометка на удаление: если цель поиска – найти объекты без ссылок (например, очистить справочник), можно пометить все элементы на удаление и попытаться выполнить стандартную операцию удаления. Платформа сама попробует удалить, игнорируя те объекты, на которые есть ссылки. Затем останется «снять пометки» с тех, что не удалились. Этот подход использует внутренний механизм поиска ссылок и обычно бывает самым быстрым, но требует эксклюзивного доступа к базе и бэкапа перед операцией.
| Метод | Преимущества | Недостатки |
|---|---|---|
НайтиПоСсылкам |
Надежный поиск по всей базе, не требует ручной настройки | Может быть медленным на больших объемах данных |
| SQL / Запрос 1С | Гибко и быстро при наличии индексов, можно ограничить поиск по конкретным таблицам | Требует знания структуры и написания запроса для каждого случая |
| Удалить с пометкой | Очень быстро удаляет все без ссылок, автоматическое обнаружение зависимостей | Деструктивно (удаление объектов), требует резервного копирования и прав администрирования |
Также не забывайте про индексы в базе данных: соответствующий индекс на поле «ссылка» заметно ускорит поиск по этому полю. Если вы работаете с SQL-платформой (MSSQL, PostgreSQL), убедитесь, что индексы на системных таблицах (например, на полях типа GUID) присутствуют. В некоторых конфигурациях индексы могут создавать автоматически, но в других может понадобиться ручная настройка.
Поиск ссылок на объект
Иногда требуется найти ссылки на объект не из кода, а через интерфейс или инструменты дизайна. В конфигураторе (разработке конфигурации) есть функция «Поиск ссылок на объект», которая анализирует метаданные конфигурации – то есть ищет, где метаданные одного объекта используются в другом (например, где один справочник или документ указан в коде или настройках другого). Это полезно при рефакторинге конфигурации.
В режиме 1С:Предприятие можно использовать описание в разделе «Все функции» – стандартная обработка «Поиск ссылок на объект» (обычно в разделе «Сервис и настройка» или «Администрирование»). Она позволит указать объект (элемент справочника, документ и др.) и запустить поиск в пользовательских данных. Результат можно просмотреть в виде списка найденных объектов и перейти к нужным.
Кроме того, в ситуации, когда нужно найти связи по известному GUID (например, при ошибке «Объект не найден [GUID]»), можно использовать запрос к базе данных или специальный инструмент: GUID уникален, и его можно поискать во всех таблицах данных. Для этого тоже чаще всего применяют SQL-запрос по системным таблицам или механизм «Поиск по полному тексту». Такие кейсы специфичны, но при необходимости именно SQL-поиск по GUID поможет найти, где хранится неизвестная ссылка.
Заключение
В заключение отметим, что встроенная функция НайтиПоСсылкам обеспечивает полный поиск ссылок на объекты в базе 1С:Предприятие и подходит для общего использования. Для повышения производительности старайтесь передавать в нее сразу массив объектов (чтобы не вызывать функцию по одному объекту) и по возможности ограничивать область поиска параметрами Включить/Исключить. Если же нужна максимальная скорость, можно написать собственный запрос к базе данных или воспользоваться массовыми операциями удаления с пометкой, как описано выше. Всегда проверяйте результаты поиска на тестовой копии базы, особенно если планируете массовые изменения.
Надеемся, что эти примеры и рекомендации помогут вам быстро находить ссылки на объекты в 1С:Предприятие и оптимизировать вашу работу. Если статья была полезна, подписывайтесь на рассылку MoscowSoft и читайте другие публикации нашего блога по 1С:Предприятие. А если остались вопросы или нужна консультация, вы всегда можете обратиться к нашей команде – мы рады помочь!














































