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

Администрирование · 11 мин

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

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

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

Отобрать такие записи можно запросом: через соединение с таблицей-владельцем ссылки и проверку на NULL, либо через сравнение текстового представления ссылки. Ниже разобраны рабочие приёмы для консоли запросов, кода на встроенном языке и типовых инструментов, а также способы безопасной очистки найденного.

Что такое «Объект не найден» и откуда берутся битые ссылки

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

Типичные источники проблемы:

  • прямое удаление объектов через обработки без проверки ссылок;
  • обмены РИБ и универсальные обмены, когда объект-приёмник не загрузился, а документ с ним — загрузился;
  • свёртка базы и обрезание периода, при котором удалены старые справочники;
  • ручные правки в SQL-таблицах в обход платформы.

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

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

ВЫБРАТЬ

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

Реализация.Контрагент КАК Контрагент

ИЗ

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

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

ПО Реализация.Контрагент = Контрагенты.Ссылка

ГДЕ

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

И НЕ Реализация.Контрагент ЕСТЬ NULL

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

Ограничение приёма: он работает только когда тип ссылки известен заранее. Если поле составного типа (например, «Контрагент или Договор»), соединение нужно делать с каждой таблицей из состава типов и проверять, что NULL вернули все.

bsl
ВЫБРАТЬ Рег.Номенклатура ИЗ РегистрСведений.ЦеныНоменклатуры КАК Рег ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Спр ПО Рег.Номенклатура = Спр.Ссылка ГДЕ Спр.Ссылка ЕСТЬ NULL И НЕ Рег.Номенклатура ЕСТЬ NULL

Как найти битые ссылки в регистрах и табличных частях

Регистры сведений, накопления и бухгалтерии проверяются тем же способом — соединение идёт по измерению или реквизиту. Для регистра бухгалтерии отдельно проверяйте поля субконто (Субконто1, Субконто2, Субконто3), потому что именно там битые ссылки встречаются чаще всего после свёртки.

Табличные части документов — отдельные таблицы в запросе: Документ.РеализацияТоваровУслуг.Товары. Соединяйте их с нужным справочником по полю товара или услуги. Пример:

ВЫБРАТЬ

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

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

ИЗ

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

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

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

ГДЕ

Спр.Ссылка ЕСТЬ NULL

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

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

Альтернатива: поиск по представлению ссылки

В консоли запросов или динамическом списке можно отобрать записи по текстовому признаку: представление битой ссылки всегда начинается с «<Объект не найден>». В запросе это выражается через функцию ПРЕДСТАВЛЕНИЕ:

ВЫБРАТЬ

Реализация.Ссылка

ИЗ

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

ГДЕ

ПОДСТРОКА(ПРЕДСТАВЛЕНИЕ(Реализация.Контрагент), 1, 18) = "Объект не найден"

Метод проще и не требует знать тип ссылки, поэтому удобен для быстрой разведки в консоли. Но у него два минуса: представление вычисляется для каждой строки (медленно на больших таблицах), а результат сравнения зависит от локали и настроек платформы. Для регламентной проверки надёжнее соединение с ЕСТЬ NULL.

Сравнение способов отбора

ЛЕВОЕ СОЕДИНЕНИЕ + ЕСТЬ NULL

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

ПРЕДСТАВЛЕНИЕ + ПОДСТРОКА

Универсальный для любых типов, удобен в консоли. Медленнее на больших таблицах и зависит от настроек представления.

Тестирование и исправление

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

Проверка битой ссылки в коде на встроенном языке

В модуле или обработке проверить конкретное значение проще без запроса. Два рабочих признака:

Если ЗначениеЗаполнено(СсылкаНаОбъект)

И СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда

// ссылка битая

КонецЕсли;

Либо через текстовое представление: СтрНайти(Строка(СсылкаНаОбъект), "Объект не найден") > 0. Первый вариант надёжнее, но обращение к ПолучитьОбъект() идёт в базу за каждой записью — в цикле по миллиону строк это заметная нагрузка. Для массовой обработки сначала отберите кандидатов запросом, а потом уже проверяйте в коде.

Порядок действий для полной проверки базы
  1. 1
    Сделайте резервную копию базы или выгрузку в dt.
  2. 2
    Откройте консоль запросов и проверьте критичные таблицы: контрагенты и номенклатура в документах, субконто в регистре бухгалтерии.
  3. 3
    Сформируйте запросы с ЛЕВЫМ СОЕДИНЕНИЕМ и условием ЕСТЬ NULL, исключив пустые значения.
  4. 4
    Зафиксируйте список документов и регистров с битыми ссылками.
  5. 5
    Решите по каждой группе: восстановить объект, заменить ссылку или очистить поле.
  6. 6
    Повторите проверку после исправлений и убедитесь, что выборки пустые.

Что делать с найденными записями

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

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

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

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

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

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

Типичные ошибки
01
Сравнение поля с пустой ссылкой вместо соединения с ЕСТЬ NULL — битые ссылки не находятся.
02
Отсутствие условия НЕ ... ЕСТЬ NULL — в выборку попадают все записи с незаполненным реквизитом.
03
Проверка только шапок документов — битые ссылки в табличных частях и регистрах остаются незамеченными.
04
Массовое удаление записей до анализа причины — теряется возможность восстановить объект через обмен.
05
Запуск исправления в рабочей базе в разгар дня — блокировки и риск потери данных.

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

Можно ли отобрать «Объект не найден» в списке документов через отбор?

В стандартном отборе динамического списка — нет, потому что битая ссылка не равна никакому выбираемому значению. Обходной путь: добавить в запрос динамического списка левое соединение и поле-признак «СсылкаБитая», затем отбирать по нему. Либо использовать консоль запросов.

Почему после удаления помеченных объектов остались «Объект не найден»?

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

Можно ли восстановить объект, зная GUID из текста «Объект не найден»?

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

Тормозит запрос с ПРЕДСТАВЛЕНИЕ — как ускорить?

Функция ПРЕДСТАВЛЕНИЕ вычисляется для каждой строки и не использует индексы. Замените её на левое соединение с таблицей справочника и условие ЕСТЬ NULL — такой запрос выполняется по индексам и работает на порядки быстрее.

Нужно ли проверять регистр бухгалтерии отдельно?

Да. Поля субконто (Субконто1–3) и счета проверяются отдельными соединениями с соответствующими справочниками и планом счетов. Именно в регистре бухгалтерии битые ссылки чаще всего остаются после свёртки базы и мешают формированию отчётов.

Безопасно ли просто очистить поле с битой ссылкой?

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

Итог

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

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