Объект не найден в реквизите: откуда берутся битые ссылки в базе 1С и как вернуть данные
Содержание
Битая ссылка в 1С — это реквизит, который хранит ссылку на объект, которого в базе данных уже нет. Вместо контрагента или номенклатуры в поле видна строка вида <Объект не найден> (32:8f3a0050568b2c1e11ef4d2a9b7c5e01). Исправить её можно тремя путями: восстановить пропавший объект с тем же идентификатором, заменить ссылку на правильную или очистить её через «Тестирование и исправление» в Конфигураторе.
Какой путь выбрать, зависит от масштаба. Одна-две битые ссылки после случайного удаления — восстанавливаем объект или правим вручную. Сотни ссылок после сбоя обмена или загрузки — сначала находим их запросом, потом решаем пакетно. Тотальная очистка через тестирование — крайний вариант: данные о том, что там было, теряются.
Откуда в базе данных появляются битые ссылки
В 1С ссылка — это не текст, а пара «тип объекта + уникальный идентификатор (GUID)». Документ хранит в реквизите «Контрагент» только этот GUID. Если запись справочника с таким GUID пропала, документ продолжает её «помнить», но показать уже нечего.
Платформа проверяет, ссылается ли кто-то на объект, только при удалении через обработку «Удаление помеченных объектов». Все остальные способы удаления этот контроль обходят.
Типичные источники проблемы:
- 🗑️ Непосредственное удаление. Пользователь с правом «Интерактивное удаление» удалил элемент клавишей
Shift+Deleteили командой удаления без пометки. Объект исчез сразу, ссылки на него остались. - 🔄 Обмен данными. Документ пришёл из другой базы, а связанный справочник — нет: правило обмена не выгрузило элемент, обмен прервался на середине, узлы рассинхронизировались.
- 📥 Загрузка из файла. Выгрузка/загрузка XML, «Загрузка данных из табличного документа», самописные обработки переноса. Объекты создаются с готовыми ссылками, а их «соседей» в базе нет.
- 💻 Программный код. Обработка или расширение удаляет объекты методом
Удалить()без проверки, кто на них ссылается. - ⚡ Аварии. Обрыв питания, сбой диска, падение сервера СУБД во время записи. Часть данных записалась, часть — нет.
- 🧩 Ручные правки в СУБД. Кто-то удалил строки SQL-запросом прямо в таблицах. Так делать нельзя ни при каких обстоятельствах.
Число перед двоеточием в строке <Объект не найден> (32:...) — внутренний номер таблицы, то есть тип объекта. Вторая часть — GUID. По GUID объект потом и восстанавливают, поэтому скопируйте эту строку целиком, прежде чем что-то менять.
Как понять, что в базе есть битые ссылки
Прямой признак — текст <Объект не найден> в поле формы, в колонке списка или в отчёте. Но ссылка может «спрятаться» в табличной части или в движениях регистра, куда пользователи не смотрят.
Косвенные симптомы:
- Документ не проводится с ошибкой о незаполненном реквизите, хотя поле на экране заполнено.
- В оборотно-сальдовой ведомости появляется строка без названия или с пустой аналитикой, а суммы по ней не нулевые.
- Отчёт в разрезе контрагентов показывает итог, который не сходится с суммой строк.
- Выгрузка в другую программу или обмен останавливается с сообщением о том, что объект не найден.
- Печатная форма выходит с пустым наименованием покупателя или товара.
- Обработка «Удаление помеченных объектов» не находит связей, хотя данные явно ссылались на удалённый элемент.
Кто и когда удалил объект: журнал регистрации и технический журнал
Прежде чем исправлять, выясните причину. Иначе через неделю битые ссылки появятся снова.
Журнал регистрации
Это первое место, куда стоит заглянуть. В пользовательском режиме он открывается через Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — через Администрирование → Журнал регистрации.
Что настроить в отборе:
- Событие —
Данные. Удаление. - Метаданные — нужный справочник или документ.
- Период — от даты, когда объект точно был на месте.
В найденной записи видно пользователя, компьютер, время и представление удалённого объекта. Если событий удаления нет, а ссылки битые, источник почти наверняка в обмене или загрузке: ищите события обмена в тот же день.
Журнал регистрации хранит события столько, сколько задано в его настройках. Если там стоит «хранить за месяц», удаление полугодовой давности уже не найти.
Технический журнал
Технический журнал нужен, когда журнал регистрации молчит: ошибка возникает в коде обработки, при обмене на сервере или в фоновом задании. Его включают файлом logcfg.xml в каталоге conf платформы (например, C:\Program Files\1cv8\conf). Платформа перечитывает файл сама, перезапуск не нужен.
Минимальная настройка для поиска исключений:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\1c_techlog" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
В логах ищите события EXCP с текстом об отсутствующем объекте и смотрите свойство Context: там стек вызовов, то есть модуль и строка кода, которые споткнулись о битую ссылку.
Технический журнал быстро растёт. Включайте его на время диагностики, на отдельный диск, и удаляйте logcfg.xml сразу после поиска. Иначе логи забьют диск сервера, и остановится уже вся база.
Тестирование и исправление информационной базы
Штатный инструмент платформы для ссылочной целостности — режим «Тестирование и исправление» в Конфигураторе: Администрирование → Тестирование и исправление.
Режим требует монопольного доступа: все пользователи должны выйти из базы, фоновые задания — остановиться. Запускайте вечером или в выходной, предупредив коллег. Перед запуском сделайте выгрузку .dt или резервную копию средствами СУБД.
Порядок действий:
- Сначала запустите проверку с вариантом «Только тестирование». Так вы увидите масштаб, ничего не меняя.
- Включите флажки «Проверка логической целостности информационной базы» и «Проверка ссылочной целостности информационной базы».
- Изучите протокол: какие объекты и какие реквизиты ссылаются на несуществующие данные.
- Решите, как поступать с битыми ссылками, и запустите повторно с вариантом «Тестирование и исправление».
Для ссылок на несуществующие объекты есть три варианта:
| Вариант | Что делает | Когда выбирать | Риск |
|---|---|---|---|
| Создавать объекты | Создаёт объекты-заглушки с теми же GUID | Ссылок много, данные важны, объекты можно потом переименовать и заполнить | В справочниках появятся пустые элементы, их придётся разбирать |
| Очищать ссылки | Делает реквизит пустым | Ссылки точно мусорные, например в старых черновиках | Информация о том, что было в поле, теряется насовсем |
| Не изменять | Оставляет как есть | Нужен только протокол | Проблема остаётся |
💡 На практике чаще всего выбирают «Создавать объекты». Заглушка сохраняет связь: в документах снова виден элемент справочника, а не <Объект не найден>. Дальше заглушку можно заполнить реквизитами или объединить с правильным элементом через стандартную обработку поиска и удаления дублей.
Запуск из командной строки
Для серверной базы, которую нельзя надолго отключать днём, тестирование удобно запускать по расписанию в пакетном режиме:
"C:\Program Files\1cv8\8.3.25.1394\bin\1cv8.exe" DESIGNER /S "srv1c\buh" /N "Администратор" /P "пароль" /IBCheckAndRepair -LogAndRefsIntegrity -BadRefCreate /Out "D:\logs\check.txt"
Ключ -BadRefCreate соответствует варианту «Создавать объекты», -BadRefClear — «Очищать ссылки», -BadRefNone — «Не изменять». Для пробного прогона вместо них используйте -TestOnly. Номер платформы в пути замените на свой.
Проверка ссылочной целостности в пользовательском режиме
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) есть встроенный контроль ведения учёта. Он умеет находить битые ссылки без Конфигуратора и без монопольного режима. Ищите его в разделе Администрирование → Обслуживание, в группе корректировки данных или проверок учёта.
Плюсы такого способа:
- ✅ пользователи могут продолжать работать;
- ✅ результат виден списком с переходом к проблемному объекту;
- ✅ проверку можно поставить регламентным заданием.
Минус — он только находит. Исправлять приходится вручную или способами из следующего раздела.
Если раздел найти не получается, откройте Все функции (включается в настройках как «Отображать команду Все функции») и найдите обработку по слову «проверка» в разделе «Обработки».
Поиск и ручное исправление через консоль запросов
Когда нужно точечно понять, где именно битые ссылки, помогает консоль запросов. Приём простой: при разыменовании битой ссылки поля «пропавшего» объекта возвращают NULL, хотя сама ссылка не пустая.
Пример для документов реализации и справочника контрагентов:
ВЫБРАТЬ
Док.Ссылка КАК Документ,
Док.Контрагент КАК БитаяСсылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
Док.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
И Док.Контрагент.Наименование ЕСТЬ NULL
Для табличных частей замените источник на Документ.РеализацияТоваровУслуг.Товары и проверяйте Номенклатура.Наименование ЕСТЬ NULL. Так же ищут битые ссылки в регистрах: источник — таблица регистра, условие — по полю измерения или субконто.
Восстановление объекта с тем же GUID
Это главный приём, когда объект удалили по ошибке, а восстановить всю базу из копии нельзя. Создаём новый элемент справочника, но с идентификатором пропавшего. Все документы сразу «увидят» его снова.
Код выполняется на сервере, в обработке или в консоли с режимом выполнения произвольного кода:
// GUID берём из результата запроса: Строка(БитаяСсылка.УникальныйИдентификатор())
// Значение ниже — пример, подставьте своё
ИдентификаторСтроки = "4d2a9b7c-5e01-11ef-8f3a-0050568b2c1e";
Ид = Новый УникальныйИдентификатор(ИдентификаторСтроки);
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Ид);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Элемент = Справочники.Контрагенты.СоздатьЭлемент();
Элемент.УстановитьСсылкуНового(Ссылка);
Элемент.Наименование = "Восстановленный контрагент";
Элемент.Записать();
КонецЕсли;
Учтите: в строке <Объект не найден> GUID записан в «перевёрнутом» внутреннем порядке, без дефисов. Надёжнее получить его из запроса методом УникальныйИдентификатор() у самой битой ссылки.
После создания заполните реквизиты элемента: ИНН, КПП, договоры. Если сохранилась резервная копия, проще перенести элемент оттуда выгрузкой в XML — он придёт с тем же GUID и всеми реквизитами.
Замена на правильный объект
Если нужный контрагент в базе есть, но под другим GUID, битую ссылку меняют на него. Для десятка документов хватит ручной правки. Для сотен — используйте групповое изменение реквизитов (Администрирование → Обслуживание → Корректировка данных) с отбором по проблемному значению.
Документ, в котором вы поменяли реквизит, нужно перепровести: движения регистров сами не исправятся. В закрытом периоде это меняет отчётность, поэтому согласуйте правку с главным бухгалтером.
Как не допустить битых ссылок в базе 1С
Профилактика дешевле разбора последствий. Основные меры:
- Уберите непосредственное удаление. Право «Интерактивное удаление» в профилях пользователей должно быть только у администратора. Остальные ставят пометку на удаление, а удаляет обработка «Удаление помеченных объектов» — она проверяет связи.
- Настройте хранение журнала регистрации минимум на год, чтобы всегда можно было найти, кто удалил объект.
- Проверяйте обмены. После изменения правил обмена или обновления одной из баз сделайте пробный обмен и проверку ссылочной целостности в базе-приёмнике.
- Контролируйте самописные обработки. Любой код с
Удалить()должен сначала искать ссылки на объект методомНайтиПоСсылкам(). - Делайте резервные копии по расписанию и раз в квартал проверяйте, что копия разворачивается.
- Запускайте тестирование без исправления раз в месяц или после каждого крупного обновления, чтобы видеть проблему, пока она маленькая.