Битые ссылки в базе 1С: откуда берётся «Объект не найден» и как от него избавиться

· 9 мин

Содержание

Надпись <Объект не найден> (85:b8c1001e0b1b12c111e3c0d9e4b3f6a4) означает, что в реквизите документа, справочника или регистра хранится ссылка на запись, которой в базе уже нет. Число до двоеточия — номер таблицы, по нему находят тип объекта. Длинная строка после — внутренний идентификатор, по нему находят все места, где висит эта «пустышка».

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

С чего начать: что именно сломалось и где

Сначала соберите факты. От них зависит, какой способ выбрать.

  • 🔍 Где видна надпись. В поле формы документа, в строке табличной части, в отчёте, в журнале проводок.
  • 🔢 Полный текст. Скопируйте строку с кодом целиком: <Объект не найден> (85:b8c1...). Без кода дальше работать нечем.
  • 📅 Когда появилось. После обмена с другой базой, после обновления, после удаления помеченных, после загрузки из файла.
  • 👥 Сколько мест. Один документ или сотни. От этого зависит, чинить руками или массово.

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

СимптомЧто это значит
В поле видно <Объект не найден>Ссылка есть, записи нет. Данные в остальном целы
Отчёт показывает строку с такой надписьюДвижения регистра ссылаются на удалённый объект
Документ не проводитсяКод проведения читает реквизиты отсутствующего объекта
Надпись появилась после обменаОбъект не пришёл из другой базы или пришёл позже
Диагностика: выберите симптом

Как по коду ссылки найти тип и сам объект

Код вида 85:b8c1001e0b1b12c111e3c0d9e4b3f6a4 состоит из двух частей.

  1. 85 — номер таблицы хранения. Ему соответствует таблица _Reference85, _Document85 или другая с тем же номером.
  2. b8c1001e…f6a4 — 32 шестнадцатеричных символа, внутренний идентификатор ссылки в том порядке байтов, в каком он лежит в таблице.

Шаг 1. Определить объект метаданных по номеру

Номер таблицы ничего не говорит человеку. Чтобы понять, справочник это «Контрагенты» или документ «Реализация», выполните код во внешней обработке под пользователем с полными правами. Процедуру вызывайте на сервере.

&НаСервере
Процедура НайтиТипПоНомеруНаСервере(КодТипа)
    Номер = Формат(КодТипа, "ЧГ=0");
    Префиксы = СтрРазделить("_Reference,_Document,_Enum,_Chrc,_Acc,_CKinds,_BPr,_Task,_Node", ",");
    Структура = ПолучитьСтруктуруХраненияБазыДанных();
    Для Каждого СтрокаСтруктуры Из Структура Цикл
        Для Каждого Префикс Из Префиксы Цикл
            Если СтрокаСтруктуры.ИмяТаблицыХранения = Префикс + Номер Тогда
                Сообщить(СтрокаСтруктуры.Метаданные + " — " + СтрокаСтруктуры.ИмяТаблицыХранения);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

На выходе получите строку вроде Справочник.Номенклатура — _Reference85. Это и есть тип пропавшего объекта.

Сравнивайте имя таблицы целиком, а не «заканчивается на 85». Иначе под условие попадут _Reference185 и _Document285, и вы будете искать не там.

Шаг 2. Превратить код в идентификатор и найти ссылки

Строка из сообщения — это байты в порядке хранения. Чтобы получить привычный идентификатор вида xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, группы символов переставляют. Затем по идентификатору получают саму ссылку и ищут, где она используется.

&НаСервере
Процедура НайтиМестаИспользованияНаСервере()
    Код = "b8c1001e0b1b12c111e3c0d9e4b3f6a4";
    УИД = Сред(Код, 25, 8) + "-" + Сред(Код, 21, 4) + "-" + Сред(Код, 17, 4)
        + "-" + Сред(Код, 1, 4) + "-" + Сред(Код, 5, 12);
    Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));

    Ссылки = Новый Массив;
    Ссылки.Добавить(Ссылка);
    Таблица = НайтиПоСсылкам(Ссылки);

    Для Каждого СтрокаТаблицы Из Таблица Цикл
        Сообщить(Строка(СтрокаТаблицы.Метаданные) + ": " + Строка(СтрокаТаблицы.Данные));
    КонецЦикла;
    Сообщить("Всего мест: " + Формат(Таблица.Количество(), "ЧН=0; ЧГ=0"));
КонецПроцедуры

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

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

Что видно в таблицах СУБД

В клиент-серверном варианте ту же проверку можно сделать запросом к SQL на чтение. Строка из сообщения подставляется в поле _IDRRef как есть, без перестановки:

SELECT _IDRRef, _Description, _Marked
FROM _Reference85
WHERE _IDRRef = 0xB8C1001E0B1B12C111E3C0D9E4B3F6A4;

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

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

Для файловой базы прямого доступа к таблицам нет. Там остаются код на встроенном языке и тестирование в Конфигураторе.

Откуда берутся битые ссылки и при чём тут удаление помеченных

Сама по себе запись в 1С не исчезает. Её кто-то удалил, не проверив, где она используется. Типичные сценарии:

  • 🔄 Обмен данными. Документ пришёл из другой базы, а контрагент или номенклатура — нет. Или в базе-источнике объект удалили, и удаление доехало сюда.
  • 🗑️ Непосредственное удаление. Пользователь с правом интерактивного удаления стёр объект кнопкой, минуя пометку и контроль ссылок.
  • 🧩 Обработки и загрузки. Внешняя обработка удалила записи методом Удалить() без проверки ссылок или загрузила документы с реквизитами из чужой базы.
  • 🏗️ Изменение конфигурации. Из конфигурации убрали справочник, а в полях составного типа остались ссылки на его элементы.
  • 💾 Частичное восстановление. Загрузили часть данных из копии, а связанные с ними объекты остались в старом состоянии.

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

Штатный способ удаления в типовых конфигурациях — пометка и обработка «Удаление помеченных объектов». В Бухгалтерии предприятия 3.0 она находится в Администрирование → Обслуживание → Корректировка данных → Удаление помеченных объектов.

Обработка удаляет объект, только если на него никто не ссылается. Если ссылки есть, она показывает список мест, где объект используется, и оставляет его в базе. Поэтому сама по себе она битых ссылок не создаёт.

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

Расширения конфигурации как скрытый источник

Расширения появились в платформе 8.3.6, и сейчас они почти в каждой базе: доработки печатных форм, отчётов, свои справочники. Расширение может добавить собственный справочник и реквизиты к типовым объектам.

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

Что проверить:

  1. Откройте список расширений. В Бухгалтерии 3.0 это Администрирование → Печатные формы, отчеты и обработки → Расширения, в Конфигураторе — Конфигурация → Расширения конфигурации.
  2. Посмотрите, все ли расширения активны и нет ли ошибок применения.
  3. Спросите у разработчика, не отключали ли недавно расширение и не меняли ли в нём состав объектов.
  4. Если по шагу 1 предыдущего раздела тип не нашёлся среди таблиц основной конфигурации, это сильный признак, что объект принадлежал расширению.

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

Тестирование и исправление: массовая чистка

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

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

Какие флажки ставить

  1. Отметьте Проверка ссылочной целостности информационной базы.
  2. Режим выберите Тестирование и исправление. Только «Тестирование» ничего не меняет и подходит для первой разведки.
  3. В блоке «При наличии ссылок на несуществующие объекты» выберите действие.
  4. Нажмите «Выполнить» и дождитесь окончания. Протокол сохраните в файл.

Три варианта действия

ДействиеЧто произойдётКогда выбиратьРиски
Создавать объектыПлатформа создаст объекты-заглушки с теми же идентификаторами, ссылки оживутНужно сохранить связи и потом заполнить заглушкиВ справочниках появятся пустые элементы
Очищать ссылкиРеквизиты станут пустымиСсылки точно мусорные, восстанавливать нечегоДокументы с пустыми обязательными реквизитами не проведутся
Не изменятьНичего, только протоколНужен список проблем для разбораНет

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

  • ✏️ заполнить заглушку правильными данными, если это и есть пропавший контрагент или товар;
  • 🔀 объединить заглушку с правильным элементом через Администрирование → Обслуживание → Корректировка данных → Поиск и удаление дублей в Бухгалтерии 3.0: ссылки заменятся на оригинал, заглушку можно пометить на удаление.

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

Восстановление пропавшего объекта из копии

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

Перенос объекта из резервной копии
Выполнено: 0 / 6

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

Если резервной копии с этим объектом нет, восстановить его не получится. Остаётся тестирование с созданием заглушек и ручное заполнение.

Как не допустить повторения

Битые ссылки почти всегда следствие одного неаккуратного действия. Закройте основные лазейки.

  • 🔐 Права. Право на интерактивное удаление — только у администратора. Пользователи помечают объекты, а не удаляют.
  • 🗑️ Удаление. Только через пометку и штатную обработку, по расписанию, после резервной копии.
  • 🔄 Обмены. После сбоя обмена не удаляйте полученные документы руками. Сначала выясните, что не дошло, и повторите обмен.
  • 🏗️ Обновление структуры. Перед удалением справочника или реквизита из конфигурации найдите и перенесите данные. Обновление конфигурации базы данных удалит таблицы без вопросов о ссылках в полях составного типа.
  • 💾 Копии. Храните резервные копии хотя бы за месяц: битую ссылку часто замечают через несколько недель.
  • 🧪 Регулярная проверка. Раз в квартал запускайте тестирование в режиме «Только тестирование» на копии базы и читайте протокол.

Расширения, внешние обработки и загрузки от сторонних разработчиков сначала проверяйте на копии. Именно там чаще всего встречается удаление записей без проверки ссылок.

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

Можно ли просто не обращать внимания на «Объект не найден»?
В справочных полях старых документов — иногда да, если документ не перепроводится. Но при перепроведении, закрытии месяца или обмене такая ссылка часто приводит к ошибке.
Почему в одной базе код 85, а в другой тот же справочник имеет другой номер?
Номера таблиц назначаются при создании структуры конкретной базы. В разных базах одного и того же справочника номера могут не совпадать, поэтому код всегда расшифровывают в той базе, где он найден.
Тестирование и исправление удалит мои документы?
Нет. Проверка ссылочной целостности создаёт заглушки или очищает ссылки, но документы не удаляет. Перед запуском всё равно нужна резервная копия.
Надпись видна только в отчёте, а в документах всё нормально. Почему?
Отчёт читает движения регистров. Движения могли остаться от старого проведения документа, где был удалённый объект. Перепроведите документ-регистратор.
Помогает ли перезапуск 1С или очистка кэша?
Нет. Это не ошибка отображения, а отсутствие записи в базе. Кэш и перезапуск на данные не влияют.