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

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

Как в запросе 1С отобрать записи с битыми ссылками «Объект не найден»

Как найти в запросе 1С записи с битыми ссылками «Объект не найден»: проверка через ЕСТЬ NULL, соединения, исключение и удаление битых ссылок с примерами кода.

Запись вида «<Объект не найден> (123:8a9b...)» появляется в 1С, когда в поле документа, регистра или справочника хранится ссылка на объект, который физически удалён из базы. Такие «битые» ссылки ломают отчёты, вызывают ошибки при проведении документов и мешают обменам данными. Найти их можно прямо в запросе — без перебора всей таблицы в цикле.

Главный приём — левое соединение таблицы, где лежит ссылка, с таблицей, на которую она указывает, и проверка результата соединения на NULL. Если объекта нет, поля присоединённой таблицы вернут NULL, и именно по этому признаку отбираются «повисшие» ссылки. Ниже разобраны рабочие конструкции запроса, варианты исключения битых ссылок из выборки, способы массовой обработки и типичные ошибки.

Что такое битая ссылка и почему она возникает

Битая ссылка — это значение ссылочного типа, которое указывает на несуществующий объект базы данных. При выводе в интерфейсе она отображается как «<Объект не найден>» с уникальным идентификатором. При обращении к реквизитам такой ссылки через точку платформа возвращает NULL либо вызывает ошибку в зависимости от контекста.

Чаще всего битые ссылки появляются после прямого удаления объектов без контроля ссылочной целостности, после неудачного обмена данными, при восстановлении базы из неполной копии или после обработок «очистки», которые удаляли объекты в обход механизмов платформы. В типовых конфигурациях удаление через «Удаление помеченных объектов» с отключённым контролем ссылок — тоже частый источник проблемы.

Опасность битых ссылок не только в неудобном отображении. Документы с такими ссылками могут не проводиться, отчёты — показывать пустые строки или падать с ошибкой, а синхронизации — завершаться аварийно. Поэтому периодическая проверка базы на «объекты не найдены» — обязательная часть регламентного обслуживания.

Основной приём: левое соединение и проверка ЕСТЬ NULL

Классический запрос для поиска битых ссылок выглядит так: берём таблицу, где хранится ссылка (например, табличную часть документа), и левым соединением присоединяем таблицу справочника. Если объекта нет, поле Ссылка присоединённой таблицы будет NULL.

ВЫБРАТЬ

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

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

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО РеализацияТовары.Номенклатура = Номенклатура.Ссылка

ГДЕ

Номенклатура.Ссылка ЕСТЬ NULL

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

Второе условие — НЕ РеализацияТовары.Номенклатура ЕСТЬ NULL — обязательно. Без него в выборку попадут строки, где поле просто не заполнено: пустая ссылка тоже даст NULL после соединения. Различие принципиально: пустая ссылка — это нормальное состояние «значение не указано», а битая ссылка — признак повреждённых данных.

Для полей составного типа (например, реквизит, который может ссылаться и на справочник, и на документ) соединение нужно выполнять с каждой таблицей из состава типа, а условие строить через И: запись битая, если соответствие не найдено ни в одной из возможных таблиц, при этом само поле не NULL и не пустое.

Как отличить битую ссылку от пустой

В языке запросов нет прямой функции «это битая ссылка», поэтому различение строится на комбинации признаков. Пустая ссылка имеет определённое значение (ЗначениеЗаполнено вернёт Ложь), а битая — формально заполнена, но объекта за ней нет.

Практическая логика проверки в запросе:

  • Поле ЕСТЬ NULL — значение не заполнено (NULL в табличной части или необязательном измерении), это не битая ссылка;
  • Поле = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) — явно пустая ссылка, тоже не битая;
  • Поле заполнено, но соединение даёт NULL — это и есть «Объект не найден».

Если нужно проверить одну конкретную ссылку в коде, а не в запросе, удобнее метод встроенного языка: сравнить строковое представление с шаблоном «Объект не найден» ненадёжно, правильнее использовать проверку через запрос к таблице объекта по ссылке или обработку исключения при обращении к реквизиту. Наиболее корректный программный способ — запросом выбрать объект по ссылке: если выборка пустая, ссылка битая.

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

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

Строка в результате запроса
Норма

Ссылка заполнена, объекта в базе нет (соединение дало NULL)

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

В выборку попали пустые ссылки — добавьте условие на заполненность поля

Количество найденных записей
Норма

Совпадает с числом записей «Объект не найден» в интерфейсе

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

Запрос вернул заметно больше строк — вероятно, лишние NULL из необязательных полей

Повторный запуск после очистки
Норма

Выборка пустая

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

Записи остались — обработка удалила не все ссылки или появились новые

Как исключить битые ссылки из выборки

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

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

СУММА(Товары.Количество) КАК Количество

ИЗ

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура

ПО Товары.Номенклатура = СпрНоменклатура.Ссылка

СГРУППИРОВАТЬ ПО

Товары.Номенклатура

Внутреннее соединение — самый короткий способ, но у него есть побочный эффект: строки с незаполненной номенклатурой тоже исчезнут из результата. Если такие строки должны остаться, используйте левое соединение с условием ГДЕ СпрНоменклатура.Ссылка ЕСТЬ NULL ИЛИ Товары.Номенклатура ЕСТЬ NULL — то есть оставляем либо существующий объект, либо пустое значение, а битые ссылки отсекаем.

Ещё один вариант — условие через В ИЕРАРХИИ или В с подзапросом: ГДЕ Товары.Номенклатура В (ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура). Такой подход работает, но на больших таблицах обычно медленнее соединения, и оптимизатор не всегда строит по нему эффективный план.

Сравнение вариантов

Левое соединение + ЕСТЬ NULL

Универсальный способ найти именно битые ссылки; требует дополнительного условия на пустые значения

Внутреннее соединение

Самый короткий способ исключить битые ссылки из выборки; заодно убирает строки с пустыми полями

Условие В (подзапрос)

Читаемо и не требует соединения; на больших таблицах может работать медленнее

Поиск битых ссылок в регистрах и по всей базе

Для регистров сведений и накопления логика та же: соединяем таблицу регистра с таблицей объекта по измерению или реквизиту ссылочного типа. Например, поиск битых ссылок в регистре сведений по измерению Контрагент:

ВЫБРАТЬ РАЗЛИЧНЫЕ

Цены.Контрагент КАК БитаяСсылка

ИЗ

РегистрСведений.ЦеныКонтрагентов КАК Цены

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО Цены.Контрагент = Контрагенты.Ссылка

ГДЕ

Контрагенты.Ссылка ЕСТЬ NULL

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

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

Как обработать найденные записи

Найти битые ссылки — половина задачи. Дальше возможны три стратегии, и выбор зависит от природы данных.

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

Заменить на объект-заглушку. Если поле обязательное (например, измерение регистра или ключевой реквизит документа), создайте в справочнике элемент «Не найден (восстановлен)» и подставьте его вместо битой ссылки. Это сохраняет проведение документов и корректность отчётов, а заглушку потом легко найти и разобрать вручную.

Удалить запись. Применимо к строкам табличных частей и записям регистров, потерявшим смысл без объекта. Самый рискованный вариант: удаление строки меняет итоги документа, поэтому после него документы стоит перепровести и сверить отчёты.

Порядок действий
  1. 1
    Сделайте резервную копию базы или работайте на копии
  2. 2
    Запросом с левым соединением и ЕСТЬ NULL найдите записи с битыми ссылками
  3. 3
    Оцените масштаб: какие таблицы затронуты и сколько записей
  4. 4
    Выберите стратегию: очистка поля, замена на заглушку или удаление записи
  5. 5
    Выполните обработку сначала в тестовом режиме без записи изменений
  6. 6
    Повторите запрос и убедитесь, что выборка пустая
  7. 7
    Перепроведите затронутые документы и сверьте ключевые отчёты

Типичные ошибки при поиске и очистке

Первая ошибка — забыть условие на заполненность исходного поля. В результате в выборку «битых» ссылок попадают тысячи строк с просто незаполненными реквизитами, и обработка очищает или удаляет вполне нормальные данные.

Вторая ошибка — проверять битость через строковое представление: искать подстроку «Объект не найден» в тексте. Это ненадёжно (представление зависит от локали и версии платформы) и не работает в запросе. Правильный критерий — только отсутствие объекта в таблице через соединение.

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

Четвёртая ошибка — массовое удаление записей без перепроведения документов. Итоги по регистрам и отчётам после такой чистки расходятся с реальным состоянием учёта, и расхождение всплывёт в самый неподходящий момент — при закрытии периода или проверке.

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

FAQ

Можно ли найти битые ссылки без запроса, стандартными средствами?

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

Почему условие ЕСТЬ NULL находит лишние записи?

Потому что NULL после левого соединения возникает в двух случаях: объект удалён (битая ссылка) или само поле не заполнено (пустая ссылка или NULL). Добавьте условие, что исходное поле не NULL и не равно пустой ссылке, — тогда останутся только реально битые ссылки.

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

Надёжный способ — выполнить запрос вида «ВЫБРАТЬ Ссылка ИЗ Справочник.Таблица ГДЕ Ссылка = &Ссылка»: если выборка пустая, ссылка битая. Проверка по строковому представлению «Объект не найден» ненадёжна и зависит от настроек платформы.

Что лучше: удалить записи с битыми ссылками или очистить поля?

Очистка поля или замена на объект-заглушку безопаснее: документы и записи сохраняются, итоги не «плывут». Удаление оправдано только для строк табличных частей и записей регистров, которые без объекта потеряли смысл, и требует последующего перепроведения документов.

Работает ли приём с соединением для составного типа поля?

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

Откуда берутся битые ссылки, если удаление в базе запрещено?

Типичные источники: обмены данными (объект удалён в одной базе, а ссылка пришла из другой), восстановление из неполной копии, обработки прямой очистки данных, сбои во время записи. Периодическая проверка запросом или тестированием и исправлением позволяет вовремя выявить проблему.

Итог

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

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