К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как найти элемент по ссылке в 1С

Как в 1С найти элемент справочника или документ по ссылке и GUID, выполнить поиск ссылок на объект через обработку и запрос. Примеры кода и типичные ошибки.

Задача «найти элемент по ссылке» в 1С возникает в двух разных ситуациях. Первая — у вас есть ссылка (или её строковое представление, GUID), и нужно понять, какому элементу справочника или документу она соответствует, существует ли он вообще. Вторая — нужно найти все места в базе, где используется конкретный объект, прежде чем удалить его или объединить дубли. Оба сценария решаются штатными средствами платформы, но инструменты различаются.

В пользовательском режиме «1С:Предприятие» часть задач закрывается стандартной обработкой «Поиск ссылок на объекты» и универсальными отчётами. В режиме конфигуратора и в коде используются методы НайтиПоСсылкам(), ПолучитьСсылку(), запросы и проверка уникального идентификатора. Ниже разобраны оба подхода с примерами, условиями выбора и типичными ошибками.

Что такое ссылка в 1С и как её получить

Ссылка — это уникальный указатель на объект базы данных: элемент справочника, документ, элемент плана видов характеристик и т.д. Внутри платформы ссылка хранится как значение специального типа, а её текстовое представление — GUID вида 8a1b2c3d-4e5f-6789-abcd-ef0123456789. Именно GUID используется при обмене данными, интеграциях и поиске «потерянных» объектов.

Получить GUID существующего объекта можно несколькими способами. В пользовательском режиме: откройте объект и в ряде конфигураций воспользуйтесь командой «Ещё → Вывести GUID» (если она предусмотрена) либо скопируйте навигационную ссылку через «Ещё → Получить ссылку» — GUID содержится в её конце. В коде используется Строка(Ссылка.УникальныйИдентификатор()).

Обратное преобразование — из строки GUID в ссылку — выполняется методом ПолучитьСсылку() конкретного менеджера объекта:

ГУИД = Новый УникальныйИдентификатор("8a1b2c3d-4e5f-6789-abcd-ef0123456789");

СсылкаНаЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);

Как проверить, существует ли элемент по ссылке

Метод ПолучитьСсылку() возвращает ссылку даже на несуществующий объект — платформа не обращается к базе. Поэтому прямое обращение к реквизитам такой ссылки вызовет ошибку «Объект не найден». Перед использованием ссылку нужно проверить.

Классический способ проверки — запрос к таблице объекта:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаЭлемент);

Если Запрос.Выполнить().Пустой() Тогда

Сообщить("Элемент по ссылке не найден — объект удалён или ссылка битая");

КонецЕсли;

Для поиска по GUID без заранее известного типа объекта придётся перебирать менеджеры нужных видов (Справочники, Документы) и выполнять проверку для каждого. На больших базах делайте это пакетным запросом или ограничьте список типов, если источник GUID известен — например, из контекста интеграции ясно, что ищется номенклатура.

Как найти ссылки на объект в пользовательском режиме

Когда нужно узнать, где используется элемент справочника или документ (перед удалением, заменой дубля, анализом), не обязательно писать код. В типовых конфигурациях на БСП есть штатная обработка «Поиск и удаление дублей» и функция поиска мест использования.

Универсальный путь в любой конфигурации: откройте «Все функции» (через меню сервиса или Shift+F11 в зависимости от настроек), найдите в разделе «Обработки» пункт «Поиск ссылок на объекты» (в БСП — «Поиск ссылок на объекты» / «Места использования»). Укажите объект, запустите поиск — обработка покажет таблицу всех объектов, где встречается ссылка: документы, регистры сведений, другие справочники.

Результат можно выгрузить или перейти по каждой строке к объекту-источнику. Это безопасный способ оценить последствия удаления: если ссылка используется в проведённых документах, удалять объект нельзя — вместо этого его помечают на удаление или заменяют дубль на основной элемент.

Поиск мест использования объекта
  1. 1
    Откройте «Все функции» и найдите обработку «Поиск ссылок на объекты»
  2. 2
    Укажите нужный элемент справочника или документ в параметре поиска
  3. 3
    Запустите поиск и дождитесь формирования таблицы результатов
  4. 4
    Проанализируйте список: типы объектов, их количество, проведённость документов
  5. 5
    При необходимости откройте объекты-источники двойным щелчком и примите решение о замене или пометке на удаление

Как найти ссылки на объект программно

В коде используется глобальный метод НайтиПоСсылкам(). Он принимает массив ссылок и возвращает таблицу значений с колонками: исходная ссылка, объект-источник данных и метаданные источника.

МассивСсылок = Новый Массив;

МассивСсылок.Добавить(ЭлементСправочника);

ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

Для Каждого Строка Из ТаблицаСсылок Цикл

Сообщить("Используется в: " + Строка.Данные);

КонецЦикла;

Метод сканирует все объекты конфигурации, где может встретиться ссылка данного типа, поэтому на больших базах выполняется заметное время. Не вызывайте его в цикле по каждому элементу — передавайте весь массив ссылок за один вызов, это существенно быстрее.

Если нужно найти использование только в конкретных местах (например, только в табличной части «Товары» документов реализации), эффективнее написать точечный запрос к нужным таблицам вместо полного сканирования.

Поиск элемента по ссылке через запрос и консоль кода

Если известен тип объекта, проще всего найти элемент запросом, передав ссылку параметром — как в примере выше. Запрос также позволяет сразу получить нужные реквизиты: наименование, код, пометку удаления.

Для разовых операций удобна консоль кода (внешняя обработка) или встроенный механизм «Все функции → Стандартные» в некоторых конфигурациях. Там можно выполнить произвольный фрагмент: получить ссылку по GUID, проверить существование и вывести данные объекта, не создавая отчёт.

При поиске «битых» ссылок в таблицах (когда в документе осталась ссылка на удалённый элемент) используется соединение таблиц с проверкой на NULL:

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

Реализация.Номенклатура КАК БитаяСсылка

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Реализация

ГДЕ

Реализация.Номенклатура.Ссылка ЕСТЬ NULL

И НЕ Реализация.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Такой запрос находит документы, где ссылка формально заполнена, но объект в справочнике отсутствует — типичное последствие прямого удаления данных или сбоев обмена.

Контрольные точки

Как проверить результат поиска

Ссылка получена по GUID
Норма

Запрос с параметром-ссылкой возвращает строку с данными объекта

Тревожный признак

Запрос пуст — объект удалён или GUID от другого типа объекта

Места использования найдены
Норма

Таблица НайтиПоСсылкам содержит осмысленные объекты-источники

Тревожный признак

Таблица пуста, хотя объект точно используется — проверьте, не ищете ли по дублю

Обращение к реквизитам
Норма

Ссылка.Наименование возвращает значение без ошибок

Тревожный признак

Ошибка «Объект не найден» — битая ссылка, нужна проверка существования

Типичные ошибки и ограничения

Самая частая ошибка — обращение к реквизитам ссылки без проверки существования объекта. Вторая по распространённости — сравнение ссылок строковым представлением: Строка(Ссылка1) = Строка(Ссылка2) ненадёжно, сравнивайте сами ссылки или их уникальные идентификаторы.

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

Наконец, помните, что помеченные на удаление объекты продолжают существовать в базе и находятся поиском. Если задача — заменить дубли, сначала исключите помеченные элементы отбором по реквизиту ПометкаУдаления.

Типичные ошибки
01
Обращение к Ссылка.Реквизит без проверки существования — исключение «Объект не найден» и обрыв обмена
02
Сравнение ссылок по строковому представлению — ненадёжный результат, сравнивайте сами ссылки или УникальныйИдентификатор
03
Вызов НайтиПоСсылкам() в цикле по одному элементу — кратное замедление вместо одного вызова с массивом
04
Поиск под ограниченными правами — часть мест использования не видна, выводы о «неиспользуемости» объекта ошибочны
05
Удаление объекта до анализа ссылок — появление битых ссылок в документах и регистрах
Маршрут решения

Как выбрать способ поиска

Нужно разово узнать, где используется объект, без кодаИспользуйте обработку «Поиск ссылок на объекты» из «Все функции»
Есть GUID из внешней системы, нужен объектПолучите ссылку через ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИД)) и проверьте существование запросом
Поиск мест использования встроен в обработку или регламентное заданиеПрименяйте НайтиПоСсылкам() с массивом ссылок одним вызовом
Нужны ссылки только в конкретных документах или табличных частяхНапишите точечный запрос к нужным таблицам — это быстрее полного сканирования
Требуется найти битые ссылки после сбоевИспользуйте запрос с проверкой Ссылка ЕСТЬ NULL по соединённым таблицам
Итог

Что важно запомнить

Для поиска мест использования объекта есть штатная обработка «Поиск ссылок на объекты» и метод НайтиПоСсылкам(). Для поиска самого элемента по GUID — ПолучитьСсылку() с обязательной проверкой существования запросом. Сравнивайте ссылки напрямую, выполняйте анализ под полными правами и никогда не удаляйте объект до проверки его использования.

Частые вопросы

Чем ссылка отличается от кода и наименования элемента?

Код и наименование — пользовательские реквизиты, они могут совпадать у разных элементов и меняться. Ссылка — внутренний уникальный идентификатор объекта, неизменный на всю его жизнь. Поиск по ссылке всегда однозначен, поиск по наименованию — нет.

Можно ли найти объект по GUID, не зная его типа?

Да, но только перебором: пройдитесь по нужным менеджерам (Справочники, Документы, ПланыВидовХарактеристик), для каждого получите ссылку через ПолучитьСсылку() и проверьте существование запросом. Если контекст подсказывает тип — ограничьтесь им, полный перебор медленный.

Почему НайтиПоСсылкам() вернул пустую таблицу, хотя объект точно используется?

Чаще всего ищут не ту ссылку — например, дубль элемента, а не тот экземпляр, что реально указан в документах. Также проверьте права доступа: без прав чтения на объекты-источники они не попадут в результат.

Как безопасно удалить элемент, на который есть ссылки?

Напрямую — никак. Сначала найдите все места использования, замените ссылки на актуальный объект (в типовых конфигурациях это делает обработка «Поиск и удаление дублей»), затем пометьте элемент на удаление и выполните штатное удаление помеченных объектов.

Что такое «битая ссылка» и как её исправить?

Это ссылка на объект, которого уже нет в базе, — в полях отображается как «Объект не найден». Исправление: найти записи с битыми ссылками запросом с проверкой ЕСТЬ NULL и либо подставить существующий объект, либо очистить поле, либо восстановить объект из резервной копии.

Работает ли поиск ссылок в файловой и клиент-серверной базе одинаково?

Да, логика методов идентична. Разница только в производительности: на клиент-серверной базе полный поиск по ссылкам обычно быстрее, но на очень больших таблицах всё равно предпочтительны точечные запросы вместо НайтиПоСсылкам().