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

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

Как запросом найти битые ссылки в 1С

Как найти битые ссылки в 1С запросом: проверка Ссылка.Наименование IS NULL, поиск по всем таблицам, обработка найденных объектов и удаление битых ссылок.

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

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

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

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

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

В формах и отчётах битая ссылка выглядит как строка «<Объект не найден> (84:8a4b...)» с типом и идентификатором. В запросе такая ссылка ведёт себя особенно: обращение к любому её реквизиту через точку возвращает NULL, при этом само поле ссылки не пустое и не равно пустой ссылке. Именно на этом свойстве строится весь поиск.

Базовый запрос: проверка через реквизит ссылки

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

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

Для полей составного типа (например, реквизит, который может хранить и контрагента, и организацию) обращение через точку к реквизиту, которого нет у части типов, также даст NULL для «чужих» типов. В этом случае дополнительно ограничивайте выборку оператором ССЫЛКА или проверяйте ТИПЗНАЧЕНИЯ.

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

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

ВЫБРАТЬ

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

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

ИЗ

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

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

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

ГДЕ

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

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

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

Сравнение подходов

Проверка через точку (Ссылка.Наименование ЕСТЬ NULL)

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

Левое соединение с таблицей объекта

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

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

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

Как найти битые ссылки по всей базе целиком

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

Для Каждого ОбъектМД Из Метаданные.Документы Цикл

Для Каждого Реквизит Из ОбъектМД.Реквизиты Цикл

Для Каждого Тип Из Реквизит.Тип.Типы() Цикл

Если Справочники.ТипВсеСсылки().СодержитТип(Тип)

Или Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда

// формируем текст запроса с проверкой

// Реквизит.Наименование ЕСТЬ NULL

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецЦикла;

Текст запроса собирается строкой и выполняется через объект Запрос. Результаты удобно складывать в таблицу значений с колонками «Где найдено», «Поле», «Битая ссылка» — так вы получите полную карту проблемных мест. Не забудьте про регистры сведений и накопления: измерения регистров тоже бывают ссылочными и тоже «бьются».

Порядок полного аудита ссылок
  1. 1
    Сделайте резервную копию базы
  2. 2
    Напишите или возьмите готовую обработку перебора метаданных
  3. 3
    Сформируйте запросы для всех ссылочных реквизитов, включая табличные части и регистры
  4. 4
    Выполните поиск и выгрузите результат в таблицу
  5. 5
    Сгруппируйте находки по типам объектов и оцените масштаб
  6. 6
    Исправляйте: восстановление объекта, замена ссылки или очистка поля
  7. 7
    Повторите проверку — результат должен быть пустым

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

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

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

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

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

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

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

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

Как выбрать способ исправления

Объект удалили ошибочно, есть копия или обменВосстановите объект с исходным GUID — ссылки восстановятся автоматически
Объект-дубль заменён другимВыполните замену битой ссылки на существующий объект во всех найденных местах
Данные не нужны и не входят в закрытые периодыОчистите поле или удалите записи, предварительно сделав копию
Битых ссылок тысячи, причина неизвестнаСначала найдите источник (обмен, обработка удаления), иначе после исправления ссылки появятся снова

Частые ошибки при поиске и ограничения метода

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

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

Типичные ошибки
01
Не исключены пустые ссылки — в выборку попадают все незаполненные поля
02
Проверяются только документы, а регистры и табличные части пропущены
03
Для составного типа нет фильтра по типу — ложные NULL или ошибка запроса
04
Исправление без резервной копии — необратимая потеря данных
05
Исправление без поиска причины — битые ссылки появляются снова после обмена
Контрольные точки

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

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

Выборка пустая по всем проверенным полям

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

Ссылки остались или появились новые — источник проблемы не устранён

Открытие документа из выборки в интерфейсе
Норма

Все поля показывают реальные объекты

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

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

Формирование отчётов за проблемный период
Норма

Отчёты строятся без ошибок и пропусков

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

Ошибки обращения к объектам или пустые строки

FAQ

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

Да. Штатная процедура «Тестирование и исправление» (в конфигураторе: Администрирование → Тестирование и исправление) с включённой проверкой ссылочной целостности находит битые ссылки. Минус в том, что она сразу предлагает исправлять их выбранным способом и не даёт удобного списка для анализа, поэтому для диагностики запрос удобнее.

Почему условие «Ссылка ЕСТЬ NULL» не работает для поиска битых ссылок?

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

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

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

Откуда вообще берутся битые ссылки, если 1С контролирует целостность?

Основные источники: прямое удаление объектов без контроля ссылочной целостности (интерактивно с Shift+Delete или программно), обмены данными, где объект выгрузился, а потом был удалён в одной из баз, восстановление из неполных копий и ошибочные обработки свёртки или чистки базы.

Нужно ли проверять планы обмена и задачи?

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

Итог

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

Битая ссылка находится запросом через обращение к реквизиту: Ссылка.Наименование ЕСТЬ NULL при обязательном исключении пустых ссылок. Полный аудит строится перебором метаданных с проверкой всех ссылочных реквизитов, табличных частей и регистров. Исправляйте только после резервной копии и сначала устраняйте источник появления битых ссылок, иначе они вернутся.