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

· 10 мин

Содержание

Ошибка «Объект не найден» в 1С означает, что в базе осталась ссылка на объект, которого уже нет: справочник, документ или элемент перечисления удалили, а поле, которое на него указывало, осталось. Чтобы её убрать, найдите все такие «битые» ссылки и либо восстановите объект, либо очистите поле. Массово это делает Конфигуратор: Администрирование → Тестирование и исправление с флажком проверки ссылочной целостности.

Типичная картина: бухгалтер открывает реализацию полугодовой давности, а в поле «Контрагент» вместо названия стоит <Объект не найден> (45:8f2a00155d0a1b2c11e9a4c3b7d0e112). Документ не проводится, отчёт по взаиморасчётам падает. Ниже — как найти виновника, исправить данные и не допустить повторения.

Почему в 1С появляются ссылки на несуществующие объекты

Платформа хранит в реквизите не название, а внутренний идентификатор объекта. Если объект исчез, а идентификатор остался, при открытии формы 1С пытается его найти и выводит <Объект не найден> с номером таблицы и шестнадцатеричной строкой.

Основные источники таких ссылок:

  • 🗑️ Удаление без контроля ссылок. Обработка или код вызвали метод Удалить() у объекта напрямую. Штатное «Удаление помеченных» проверяет, кто ссылается на объект, а прямое удаление — нет.
  • 🔄 Незавершённый обмен. В РИБ или при синхронизации с другой программой пришёл документ, а справочник, на который он ссылается, ещё не загрузился или не выгрузился вовсе.
  • 📦 Частичный перенос данных. Загрузили документы через универсальный обмен или выгрузку XML, а связанные справочники не перенесли.
  • 💥 Сбой при записи. Отключение питания, обрыв сети, переполнение диска в момент записи. Особенно уязвима файловая база.
  • 🛠️ Правка базы в обход платформы. Удаление строк SQL-запросом прямо в СУБД.
  • 📋 Изменение конфигурации. Удалили справочник или значение перечисления, а в реквизитах остались ссылки на них.

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

Где искать причину: журнал регистрации

Журнал регистрации отвечает на два вопроса: кто удалил объект и когда. Это нужно, чтобы понять, восстанавливать ли объект или хватит очистить ссылку.

Как открыть журнал:

  1. В режиме Предприятия в БП 3.0, ЗУП 3.1 и УТ 11 — Администрирование → Обслуживание → Журнал регистрации.
  2. В любой конфигурации — через меню «Функции для технического специалиста»: Стандартные → Журнал регистрации. Если пункта нет, включите его в Сервис и настройки → Параметры.
  3. В Конфигураторе — Администрирование → Журнал регистрации.

Дальше нажмите «Установить отбор» и задайте:

  • События — «Данные. Удаление»;
  • Метаданные — тип потерянного объекта, например справочник «Контрагенты»;
  • Период — от даты создания документа с битой ссылкой до сегодняшнего дня.

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

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

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

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

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

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

ВЫБРАТЬ
    Док.Ссылка КАК Документ,
    Док.Контрагент КАК БитаяСсылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
    Док.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    И Док.Контрагент.Наименование ЕСТЬ NULL

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

Что делать с результатом:

Сколько нашлиЧто разумно сделать
1–10 документов, объект не нуженОткрыть документы и выбрать правильное значение вручную
Много документов, объект нуженВосстановить объект с тем же идентификатором (раздел ниже)
Сотни ссылок в разных таблицахТестирование и исправление базы с созданием объектов

Тестирование и исправление базы в Конфигураторе

Это главный штатный инструмент против ошибки «Объект не найден». Он проходит по всем таблицам, находит ссылки на несуществующие объекты и делает с ними то, что вы выберете.

Перед запуском сделайте копию базы : Администрирование → Выгрузить информационную базу в Конфигураторе или резервную копию средствами СУБД. Режим исправления меняет данные, откатить его без копии нельзя.

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

Настройки проверки

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

  1. «Проверка логической целостности информационной базы».
  2. «Проверка ссылочной целостности информационной базы» — именно она ищет битые ссылки.
  3. Переключатель «Тестирование и исправление» (не «Только тестирование»).

Затем выберите поведение для двух ситуаций.

При наличии ссылок на несуществующие объекты:

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

При частичной потере данных объектов доступны «Создавать объекты», «Удалять объекты» и «Не изменять». Удаление здесь опасно: исчезнет документ вместе с движениями. Чаще выбирают создание.

Что делать после

Заглушки получат наименования вида «Объект не найден (…)». Найдите их в справочниках поиском по этой фразе и заполните реквизиты: название, ИНН, единицу измерения. Затем перепроведите документы, которые на них ссылаются, если это затрагивает остатки и проводки.

Протокол тестирования сохраните. Он показывает, какие таблицы были затронуты, и пригодится при разборе причины.

Файловая база и chkdbfl

Если у файловой базы есть признаки физического повреждения файла 1Cv8.1CD, до логической проверки запустите утилиту chkdbfl.exe из каталога bin установленной платформы. Она проверяет структуру файла и умеет исправлять часть повреждений. Работает только при закрытой базе и только с копией, которой не жалко рискнуть.

Восстановить потерянный объект с прежним идентификатором

Когда объект удалили по ошибке, а ссылок на него сотни, проще вернуть его, чем перебивать документы. Есть два пути.

Перенести из резервной копии

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

Создать объект кодом

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

Функция ГУИДИзСтрокиОшибки(Хекс32)
    // Хекс32 — 32 символа после двоеточия из сообщения об ошибке
    Возврат Сред(Хекс32, 25, 8) + "-" + Сред(Хекс32, 21, 4) + "-"
        + Сред(Хекс32, 17, 4) + "-" + Сред(Хекс32, 1, 4) + "-"
        + Сред(Хекс32, 5, 12);
КонецФункции

&НаСервере
Процедура ВосстановитьКонтрагента(Хекс32)
    Ид = Новый УникальныйИдентификатор(ГУИДИзСтрокиОшибки(Хекс32));
    Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Ид);
    Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
        Возврат; // объект уже существует
    КонецЕсли;
    Объект = Справочники.Контрагенты.СоздатьЭлемент();
    Объект.УстановитьСсылкуНового(Ссылка);
    Объект.Наименование = "Восстановленный контрагент";
    Объект.Записать();
КонецПроцедуры

После записи откройте любой документ с ошибкой. Если вместо <Объект не найден> появилось «Восстановленный контрагент», идентификатор собран верно. Осталось заполнить реквизиты нового элемента.

Проверить правильность перестановки можно и без записи: получите ссылку через ПолучитьСсылку() и сравните её с битым значением из документа. Если они равны, можно создавать объект.

Режим отладки: когда ошибка возникает в коде

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

Первый шаг — кнопка «Подробно» в окне ошибки. Там видно стек вызовов вида {ОбщийМодуль.ПроведениеСервер.Модуль(1520)}: модуль и номер строки. Иногда этого достаточно.

Если нет, подключите отладчик:

  1. Откройте Конфигуратор той же базы.
  2. Включите Отладка → Остановка по ошибке и отметьте остановку на ошибках, текст которых содержит «Объект не найден».
  3. Запустите Предприятие из Конфигуратора: Отладка → Начать отладку → 1С:Предприятие.
  4. Повторите действие, которое вызывает ошибку. Отладчик остановится на строке.
  5. Наведите курсор на переменные в строке или откройте табло: найдите, какая ссылка не разрешается.

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

Найденную ссылку дальше лечат так же, как битые ссылки в документах: восстановить объект или очистить поле.

Защита кода от удалённых объектов

Если вы дорабатываете конфигурацию, обрабатывайте ситуацию, когда ссылка заполнена, но объекта нет. Проверка ЗначениеЗаполнено() здесь не спасает: для битой ссылки она вернёт Истина.

Проверка существования

Самый простой вариант на сервере — Ссылка.ПолучитьОбъект(): для удалённого объекта он вернёт Неопределено. Но он читает объект целиком. Для частых проверок легче запрос:

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

В конфигурациях на БСП есть готовая функция ОбщегоНазначения.СсылкаСуществует() — используйте её, не пишите свою.

Перехват исключения с записью в журнал

Если операция массовая (загрузка, групповое перепроведение), одна битая ссылка не должна обрывать весь цикл. Ловите ошибку, пишите её в журнал регистрации и идите дальше:

Попытка
    ДокОбъект = ДокСсылка.ПолучитьОбъект();
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ЗаписьЖурналаРегистрации("Перепроведение",
        УровеньЖурналаРегистрации.Ошибка, ,
        ДокСсылка,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Потом достаточно отобрать события «Перепроведение» с уровнем «Ошибка» и разобрать документы по списку.

Не глушите исключение пустым блоком Исключение … КонецПопытки. Ошибка исчезнет с экрана, но данные останутся битыми, и вы узнаете об этом только на закрытии квартала.

Диагностика: выберите симптом

Как не допустить битых ссылок: советы администратору

Ошибку «Объект не найден» дешевле предотвратить, чем потом чистить базу.

  • 🔐 Уберите право «Интерактивное удаление» у обычных пользователей. Пусть они только помечают объекты на удаление, а удаляет администратор через «Удаление помеченных объектов» — оно проверяет ссылки и не даст удалить используемое.
  • 🧩 Проверяйте внешние обработки перед запуском в рабочей базе. Ищите в коде вызовы Удалить() и прямую запись без проверок.
  • 🔄 Доводите обмены до конца. Если синхронизация упала на середине, повторите её полностью и посмотрите протокол, прежде чем работать дальше.
  • 💾 Делайте резервные копии по расписанию и храните их минимум за несколько недель. Удаление часто замечают через месяц.
  • 📝 Не отключайте регистрацию событий в журнале: в Конфигураторе уровень задаётся в Администрирование → Настройка журнала регистрации, лучше регистрировать все события, и не урезайте срок хранения до пары дней.
  • 🚫 Не правьте таблицы 1С в СУБД напрямую. Любое удаление — только средствами платформы.
  • ⚡ Подключите сервер к ИБП, а для файловой базы следите за свободным местом на диске.
  • 🗓️ Раз в квартал запускайте «Только тестирование» на копии базы. Отчёт покажет, не накопились ли битые ссылки, без риска для рабочих данных.

Если не помогло

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

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

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