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

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

Как определить битую ссылку в запросе 1С

Как найти битую ссылку в запросе 1С: проверка через NULL, соединения таблиц, функцию ЕСТЬNULL и консоль запросов. Примеры кода и типичные ошибки.

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

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

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

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

Битая ссылка возникает, когда объект удалили непосредственно (без контроля ссылочной целостности), при обмене данными с ошибками или при восстановлении базы из неполной копии. В информационной базе остаётся уникальный идентификатор объекта, но самой записи в таблице уже нет.

В результате запроса битая ссылка проявляется характерным образом. Если вывести само поле ссылки, в консоли запросов или табличном документе отобразится строка вида «<Объект не найден> (123:abc123...)». Если обратиться к реквизитам через точку (например, Товары.Номенклатура.Наименование), запрос вернёт NULL вместо значения.

Важно понимать: сам запрос не «падает» при наличии битых ссылок. Он молча возвращает NULL или теряет строки при внутреннем соединении. Поэтому проблему часто замечают только по косвенным признакам — расхождениям в итогах отчётов.

Признаки битых ссылок в результатах запроса

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

NULL в реквизитахПоля через точку пустые

Обращение к реквизиту ссылки через точку вернуло NULL, хотя сама ссылка заполнена

Объект не найденСтрока в представлении

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

Потеря строкВнутреннее соединение

При ВНУТРЕННЕМ СОЕДИНЕНИИ часть документов исчезает из выборки

Расхождение итоговСуммы не сходятся

Обороты регистра не совпадают с данными документов

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

Способ 1. Проверка через левое соединение и NULL

Универсальный и самый надёжный способ — соединить таблицу, где хранится ссылка, с таблицей-владельцем объекта и проверить, нашлась ли соответствующая запись. Если соединение не дало результата, ссылка битая.

ВЫБРАТЬ

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

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

ИЗ

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

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

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

ГДЕ

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

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

Логика проста: левое соединение сохраняет все строки документа, а для битых ссылок поля справочника будут NULL. Условие СпрНоменклатура.Ссылка ЕСТЬ NULL отбирает именно проблемные записи. Дополнительная проверка на пустую ссылку нужна, чтобы не смешивать битые ссылки с незаполненными — это разные ситуации с разными способами исправления.

Способ 2. Проверка представления ссылки на «Объект не найден»

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Товары.Ссылка = &Ссылка";

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если СтрНайти(Строка(Выборка.Номенклатура), "Объект не найден") > 0 Тогда

Сообщить("Битая ссылка: " + Строка(Выборка.Номенклатура));

КонецЕсли;

КонецЦикла;

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

Способ 3. Проверка программно через ПолнТекстовыйПоиск и ЕСТЬNULL

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

При построении отчётов, где битые ссылки могут встречаться, но останавливать вывод нельзя, применяйте функцию ЕСТЬNULL для подмены значений и явно помечайте проблемные строки:

ВЫБРАТЬ

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

ВЫБОР

КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL

ТОГДА "<ОБЪЕКТ УДАЛЁН>"

ИНАЧЕ СпрНоменклатура.Наименование

КОНЕЦ КАК НаименованиеТовара

ИЗ

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

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

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

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

Как исправить найденные битые ссылки

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

Маршрут решения

Как выбрать действие

Объект удалён случайно, данные нужныВосстановите объект из резервной копии или создайте заново с тем же идентификатором через обработку
Ссылка в непроведённом черновике, данные не важныЗамените битую ссылку на пустую или на актуальный объект и перепроведите документ
Документы устарели и не используютсяПометьте документы на удаление с контролем ссылочной целостности
Битые ссылки появились после обменаПроверьте настройки регистрации и повторите выгрузку недостающих объектов

Массовую замену выполняйте только через обработку с транзакцией и обязательным предварительным бэкапом. Прямая правка таблиц SQL в обход платформы недопустима — это нарушает целостность данных и лишает поддержки.

Профилактика: как не допустить появления битых ссылок

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

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

Типичные ошибки
01
Проверять битую ссылку через сравнение с пустой ссылкой — пустая и битая ссылки это разные состояния, сравнение не сработает
02
Использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ для диагностики — строки с битыми ссылками просто исчезнут из результата, и вы их не увидите
03
Исправлять битые ссылки прямой записью в таблицы SQL — нарушается целостность и логика платформы
04
Запускать тестирование и исправление с включённым автоисправлением без копии — платформа может обнулить ссылки там, где данные ещё нужны

Проверка результата после исправления

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

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

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

Диагностический запрос с ЕСТЬ NULL
Норма

Запрос возвращает 0 строк

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

Остались записи с NULL в соединённой таблице

Представление ссылок в отчётах
Норма

Нет строк «Объект не найден»

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

Текст «Объект не найден» всё ещё встречается

Итоги отчётов
Норма

Обороты регистров сходятся с документами

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

Итоги расходятся, часть строк теряется

Часто задаваемые вопросы

Чем битая ссылка отличается от пустой ссылки?

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

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

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

Почему запрос с внутренним соединением «потерял» документы?

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

Опасно ли оставлять битые ссылки в базе?

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

Как восстановить удалённый объект по битой ссылке?

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

Помогает ли тестирование и исправление при битых ссылках?

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

Итог

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

Битую ссылку в запросе 1С надёжнее всего определять левым соединением с таблицей-владельцем и условием ЕСТЬ NULL по полю Ссылка. Признаки проблемы — NULL в реквизитах через точку, «Объект не найден» в представлении и потеря строк при внутреннем соединении. Исправляйте только после резервного копирования и никогда не правьте таблицы напрямую в СУБД.