Разработка и Конфигурация · 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Откройте «Все функции» и найдите обработку «Поиск ссылок на объекты»
- 2Укажите нужный элемент справочника или документ в параметре поиска
- 3Запустите поиск и дождитесь формирования таблицы результатов
- 4Проанализируйте список: типы объектов, их количество, проведённость документов
- 5При необходимости откройте объекты-источники двойным щелчком и примите решение о замене или пометке на удаление
Как найти ссылки на объект программно
В коде используется глобальный метод НайтиПоСсылкам(). Он принимает массив ссылок и возвращает таблицу значений с колонками: исходная ссылка, объект-источник данных и метаданные источника.
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(ЭлементСправочника);
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
Для Каждого Строка Из ТаблицаСсылок Цикл
Сообщить("Используется в: " + Строка.Данные);
КонецЦикла;
Метод сканирует все объекты конфигурации, где может встретиться ссылка данного типа, поэтому на больших базах выполняется заметное время. Не вызывайте его в цикле по каждому элементу — передавайте весь массив ссылок за один вызов, это существенно быстрее.
Если нужно найти использование только в конкретных местах (например, только в табличной части «Товары» документов реализации), эффективнее написать точечный запрос к нужным таблицам вместо полного сканирования.
Поиск элемента по ссылке через запрос и консоль кода
Если известен тип объекта, проще всего найти элемент запросом, передав ссылку параметром — как в примере выше. Запрос также позволяет сразу получить нужные реквизиты: наименование, код, пометку удаления.
Для разовых операций удобна консоль кода (внешняя обработка) или встроенный механизм «Все функции → Стандартные» в некоторых конфигурациях. Там можно выполнить произвольный фрагмент: получить ссылку по GUID, проверить существование и вывести данные объекта, не создавая отчёт.
При поиске «битых» ссылок в таблицах (когда в документе осталась ссылка на удалённый элемент) используется соединение таблиц с проверкой на NULL:
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
Реализация.Номенклатура КАК БитаяСсылка
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Реализация
ГДЕ
Реализация.Номенклатура.Ссылка ЕСТЬ NULL
И НЕ Реализация.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Такой запрос находит документы, где ссылка формально заполнена, но объект в справочнике отсутствует — типичное последствие прямого удаления данных или сбоев обмена.
Как проверить результат поиска
Запрос с параметром-ссылкой возвращает строку с данными объекта
Запрос пуст — объект удалён или GUID от другого типа объекта
Таблица НайтиПоСсылкам содержит осмысленные объекты-источники
Таблица пуста, хотя объект точно используется — проверьте, не ищете ли по дублю
Ссылка.Наименование возвращает значение без ошибок
Ошибка «Объект не найден» — битая ссылка, нужна проверка существования
Типичные ошибки и ограничения
Самая частая ошибка — обращение к реквизитам ссылки без проверки существования объекта. Вторая по распространённости — сравнение ссылок строковым представлением: Строка(Ссылка1) = Строка(Ссылка2) ненадёжно, сравнивайте сами ссылки или их уникальные идентификаторы.
Также учитывайте ограничения прав: если у пользователя нет права чтения какого-то справочника или документа, поиск ссылок не покажет объекты этого типа, и картина использования будет неполной. Выполняйте анализ под полными правами или учитывайте этот фактор при интерпретации результата.
Наконец, помните, что помеченные на удаление объекты продолжают существовать в базе и находятся поиском. Если задача — заменить дубли, сначала исключите помеченные элементы отбором по реквизиту ПометкаУдаления.
Как выбрать способ поиска
Что важно запомнить
Для поиска мест использования объекта есть штатная обработка «Поиск ссылок на объекты» и метод НайтиПоСсылкам(). Для поиска самого элемента по GUID — ПолучитьСсылку() с обязательной проверкой существования запросом. Сравнивайте ссылки напрямую, выполняйте анализ под полными правами и никогда не удаляйте объект до проверки его использования.
Частые вопросы
Чем ссылка отличается от кода и наименования элемента?
Код и наименование — пользовательские реквизиты, они могут совпадать у разных элементов и меняться. Ссылка — внутренний уникальный идентификатор объекта, неизменный на всю его жизнь. Поиск по ссылке всегда однозначен, поиск по наименованию — нет.
Можно ли найти объект по GUID, не зная его типа?
Да, но только перебором: пройдитесь по нужным менеджерам (Справочники, Документы, ПланыВидовХарактеристик), для каждого получите ссылку через ПолучитьСсылку() и проверьте существование запросом. Если контекст подсказывает тип — ограничьтесь им, полный перебор медленный.
Почему НайтиПоСсылкам() вернул пустую таблицу, хотя объект точно используется?
Чаще всего ищут не ту ссылку — например, дубль элемента, а не тот экземпляр, что реально указан в документах. Также проверьте права доступа: без прав чтения на объекты-источники они не попадут в результат.
Как безопасно удалить элемент, на который есть ссылки?
Напрямую — никак. Сначала найдите все места использования, замените ссылки на актуальный объект (в типовых конфигурациях это делает обработка «Поиск и удаление дублей»), затем пометьте элемент на удаление и выполните штатное удаление помеченных объектов.
Что такое «битая ссылка» и как её исправить?
Это ссылка на объект, которого уже нет в базе, — в полях отображается как «Объект не найден». Исправление: найти записи с битыми ссылками запросом с проверкой ЕСТЬ NULL и либо подставить существующий объект, либо очистить поле, либо восстановить объект из резервной копии.
Работает ли поиск ссылок в файловой и клиент-серверной базе одинаково?
Да, логика методов идентична. Разница только в производительности: на клиент-серверной базе полный поиск по ссылкам обычно быстрее, но на очень больших таблицах всё равно предпочтительны точечные запросы вместо НайтиПоСсылкам().