Битые ссылки в базе 1С: откуда берётся «Объект не найден» и как от него избавиться
Содержание
Надпись <Объект не найден> (85:b8c1001e0b1b12c111e3c0d9e4b3f6a4) означает, что в реквизите документа, справочника или регистра хранится ссылка на запись, которой в базе уже нет. Число до двоеточия — номер таблицы, по нему находят тип объекта. Длинная строка после — внутренний идентификатор, по нему находят все места, где висит эта «пустышка».
Дальше два пути. Если объект нужен — его восстанавливают из резервной копии с тем же идентификатором, и ссылки оживают сами. Если не нужен — битые ссылки удаляют или заменяют через Администрирование → Тестирование и исправление в Конфигураторе либо вручную, документ за документом.
С чего начать: что именно сломалось и где
Сначала соберите факты. От них зависит, какой способ выбрать.
- 🔍 Где видна надпись. В поле формы документа, в строке табличной части, в отчёте, в журнале проводок.
- 🔢 Полный текст. Скопируйте строку с кодом целиком:
<Объект не найден> (85:b8c1...). Без кода дальше работать нечем. - 📅 Когда появилось. После обмена с другой базой, после обновления, после удаления помеченных, после загрузки из файла.
- 👥 Сколько мест. Один документ или сотни. От этого зависит, чинить руками или массово.
Есть второй вариант той же проблемы — ошибка при записи или проведении: программа ругается, что объект не найден, и не даёт сохранить документ. Причина та же: в реквизитах документа сидит ссылка на удалённую запись. Проведение обращается к её данным и падает.
| Симптом | Что это значит |
|---|---|
В поле видно <Объект не найден> | Ссылка есть, записи нет. Данные в остальном целы |
| Отчёт показывает строку с такой надписью | Движения регистра ссылаются на удалённый объект |
| Документ не проводится | Код проведения читает реквизиты отсутствующего объекта |
| Надпись появилась после обмена | Объект не пришёл из другой базы или пришёл позже |
Как по коду ссылки найти тип и сам объект
Код вида 85:b8c1001e0b1b12c111e3c0d9e4b3f6a4 состоит из двух частей.
- 85 — номер таблицы хранения. Ему соответствует таблица
_Reference85,_Document85или другая с тем же номером. - 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, и сейчас они почти в каждой базе: доработки печатных форм, отчётов, свои справочники. Расширение может добавить собственный справочник и реквизиты к типовым объектам.
Если такое расширение отключили или удалили, данные его справочников становятся недоступны. Отчёты и формы, которые выводят поля составного типа, начинают показывать пустые или битые значения.
Что проверить:
- Откройте список расширений. В Бухгалтерии 3.0 это
Администрирование → Печатные формы, отчеты и обработки → Расширения, в Конфигураторе —Конфигурация → Расширения конфигурации. - Посмотрите, все ли расширения активны и нет ли ошибок применения.
- Спросите у разработчика, не отключали ли недавно расширение и не меняли ли в нём состав объектов.
- Если по шагу 1 предыдущего раздела тип не нашёлся среди таблиц основной конфигурации, это сильный признак, что объект принадлежал расширению.
Включите обратно отключённое расширение на копии базы. Если надписи исчезли, проблема в нём, и чинить её нужно вместе с разработчиком расширения, а не чисткой ссылок.
Тестирование и исправление: массовая чистка
Когда битых ссылок много и они разных типов, используйте встроенный механизм платформы. Он работает в Конфигураторе: Администрирование → Тестирование и исправление.
Перед запуском сделайте резервную копию: выгрузку в .dt или копию каталога файловой базы. Тестирование требует монопольного доступа: всех пользователей нужно выгнать из базы, их несохранённые данные пропадут. Планируйте на вечер или выходной.
Какие флажки ставить
- Отметьте Проверка ссылочной целостности информационной базы.
- Режим выберите Тестирование и исправление. Только «Тестирование» ничего не меняет и подходит для первой разведки.
- В блоке «При наличии ссылок на несуществующие объекты» выберите действие.
- Нажмите «Выполнить» и дождитесь окончания. Протокол сохраните в файл.
Три варианта действия
| Действие | Что произойдёт | Когда выбирать | Риски |
|---|---|---|---|
| Создавать объекты | Платформа создаст объекты-заглушки с теми же идентификаторами, ссылки оживут | Нужно сохранить связи и потом заполнить заглушки | В справочниках появятся пустые элементы |
| Очищать ссылки | Реквизиты станут пустыми | Ссылки точно мусорные, восстанавливать нечего | Документы с пустыми обязательными реквизитами не проведутся |
| Не изменять | Ничего, только протокол | Нужен список проблем для разбора | Нет |
На практике чаще выбирают создание объектов. После проверки откройте список нужного справочника и найдите новые элементы: в наименовании у них стоит текст про ненайденный объект. Дальше два хода:
- ✏️ заполнить заглушку правильными данными, если это и есть пропавший контрагент или товар;
- 🔀 объединить заглушку с правильным элементом через
Администрирование → Обслуживание → Корректировка данных → Поиск и удаление дублейв Бухгалтерии 3.0: ссылки заменятся на оригинал, заглушку можно пометить на удаление.
Очищать ссылки в документах прошлых периодов опасно. Пустой реквизит меняет движения при перепроведении, а в закрытом периоде это сдвинет отчётность.
Восстановление пропавшего объекта из копии
Если удалён живой контрагент или товар, лучший ход — вернуть его с прежним идентификатором. Тогда все ссылки заработают без правки документов.
Обработка «Выгрузка и загрузка данных XML» поставляется для типовых конфигураций как внешняя. Выгружайте только нужный объект, без связанных документов, иначе в рабочую базу приедут старые версии данных.
Если резервной копии с этим объектом нет, восстановить его не получится. Остаётся тестирование с созданием заглушек и ручное заполнение.
Как не допустить повторения
Битые ссылки почти всегда следствие одного неаккуратного действия. Закройте основные лазейки.
- 🔐 Права. Право на интерактивное удаление — только у администратора. Пользователи помечают объекты, а не удаляют.
- 🗑️ Удаление. Только через пометку и штатную обработку, по расписанию, после резервной копии.
- 🔄 Обмены. После сбоя обмена не удаляйте полученные документы руками. Сначала выясните, что не дошло, и повторите обмен.
- 🏗️ Обновление структуры. Перед удалением справочника или реквизита из конфигурации найдите и перенесите данные. Обновление конфигурации базы данных удалит таблицы без вопросов о ссылках в полях составного типа.
- 💾 Копии. Храните резервные копии хотя бы за месяц: битую ссылку часто замечают через несколько недель.
- 🧪 Регулярная проверка. Раз в квартал запускайте тестирование в режиме «Только тестирование» на копии базы и читайте протокол.
Расширения, внешние обработки и загрузки от сторонних разработчиков сначала проверяйте на копии. Именно там чаще всего встречается удаление записей без проверки ссылок.