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