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

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

Как в 1С проверить, что ссылка битая

Как найти и проверить битые ссылки в 1С: запросы, код на встроенном языке, типовые обработки и регламентные средства. Пошаговые инструкции и меры безопасности.

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

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

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

Что такое битая ссылка и как она выглядит

Каждый объект в 1С (элемент справочника, документ, запись плана счетов) имеет уникальный внутренний идентификатор. Когда другой объект хранит ссылку на него, фактически хранится этот идентификатор. Если объект удалён без проверки, идентификатор остаётся в базе, но самой записи уже нет — ссылка становится битой.

Внешне битая ссылка распознаётся по характерному тексту: «<Объект не найден>» с указанием внутреннего идентификатора в скобках. В табличных частях документов, в движениях регистров и в списках выбора вы увидите именно эту строку вместо наименования объекта.

Как проверить ссылку программно

Самый надёжный способ — попытаться получить объект по ссылке. Если объект существует, метод вернёт объект; если нет — вернёт Неопределено. Это стандартный приём, который используется в проверках перед обработкой данных.

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

Сообщить("Битая ссылка: " + Строка(Ссылка));

КонецЕсли;

Обратите внимание: у битой ссылки методы ПолучитьОбъект() и обращение к реквизитам через точку (например, Ссылка.Наименование) ведут себя по-разному. Обращение к реквизиту может вернуть пустые значения без явной ошибки, поэтому проверку лучше делать именно через ПолучитьОбъект() с последующим сравнением с Неопределено.

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

bsl
Функция СсылкаБитая(Ссылка)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Т.Ссылка ИЗ " + Ссылка.Метаданные().ПолноеИмя() + " КАК Т ГДЕ Т.Ссылка = &Ссылка";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Возврат Запрос.Выполнить().Пустой();
КонецФункции

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

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

ВЫБРАТЬ

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

ИЗ

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

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

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

ГДЕ

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

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

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

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

Типовые средства: удаление помеченных объектов и тестирование

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

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

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

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

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

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

ПолучитьОбъект() в коде

Подходит для точечной проверки одной ссылки. Медленно при массовом переборе — отдельное обращение к базе на каждый объект.

Запрос с левым соединением

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

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

Проверяет всю базу целиком без программирования. Требует монопольного доступа и резервной копии, работает долго на больших базах.

Внешние обработки

Удобный интерфейс и отчёт по всей базе. Нужно проверять источник и совместимость с конфигурацией.

Что делать с найденными битыми ссылками

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

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

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

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

Основное правило — никогда не удалять объекты напрямую. Используйте пометку на удаление и штатную процедуру удаления помеченных объектов: она проверит все места использования и не даст удалить объект, на который есть ссылки.

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

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

Итог

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

Битая ссылка определяется по «<Объект не найден>» и проверяется через ПолучитьОбъект() или запрос с левым соединением. Массовый аудит делают тестированием и исправлением или специализированными обработками — только после резервной копии. Профилактика — удаление объектов только через пометку с контролем ссылочной целостности.

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

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

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

Можно ли восстановить объект по битой ссылке?

Да, если у вас есть резервная копия или другая база обмена, где объект существует. По уникальному идентификатору из текста «Объект не найден» объект можно найти в копии и перенести обратно, либо создать заглушку с тем же идентификатором через УстановитьСсылкуНового.

Почему «Тестирование и исправление» работает очень долго?

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

Битые ссылки влияют на отчёты?

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

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

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

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

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