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

· 9 мин

Содержание

Сообщение Объект не найден при проверке логической целостности значит одно: в реквизите или табличной части лежит ссылка на элемент, которого в базе уже нет. Сама запись документа цела, пропал объект, на который она указывает. Лечится это в Конфигураторе через Администрирование → Тестирование и исправление с флажком проверки ссылочной целостности, но запускать исправление вслепую не стоит.

Частое заблуждение: «ТиИ починит всё само». Нет. Тестирование и исправление умеет либо очистить битую ссылку, либо создать на её месте пустую заглушку. Вернуть настоящего контрагента с ИНН и договорами оно не может. Поэтому сначала находим, что именно пропало, и только потом выбираем способ исправления.

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

В 1С любое поле ссылочного типа хранит внутренний идентификатор (GUID) объекта. Если объект удалили в обход контроля ссылок, GUID в документах остаётся, а находить по нему нечего. На форме такое поле выглядит как <Объект не найден> и рядом номер таблицы с идентификатором.

Откуда это берётся на практике:

  • 🗑️ Непосредственное удаление. Удаление без пометки (у пользователя с правом интерактивного удаления, например через «Все функции») стирает элемент сразу, без проверки, кто на него ссылается.
  • 🔌 Аварийное завершение записи. Отключили питание, упал рабочий процесс, кончилось место на диске. Транзакция могла записать документ, а связанный объект потерять.
  • 🔄 Обмены и РИБ. Документ пришёл из другой базы, а элемент справочника, на который он ссылается, ещё не выгрузился или был отфильтрован правилами обмена.
  • 📥 Загрузка данных. Внешние обработки, загрузка из XML или из Excel, которые пишут ссылки по GUID, не проверяя, есть ли объект в базе.
  • 🧹 Ручная чистка SQL-таблиц. Кто-то удалил строки напрямую в СУБД, «чтобы база меньше весила».
  • 💾 Повреждение файла базы. В файловом варианте битый 1Cv8.1CD даёт сразу и логические, и физические ошибки.

Битая ссылка не всегда авария. В РИБ она часто «доезжает» следующим сеансом обмена. Если ошибка появилась сразу после обмена, сначала повторите синхронизацию, а уже потом лечите базу.

Как понять, какой объект пропал: журнал регистрации и форма документа

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

Журнал регистрации

В пользовательском режиме он открывается в Администрирование → Обслуживание → Журнал регистрации, в Конфигураторе — через Администрирование → Журнал регистрации.

  1. Установите отбор по уровню «Ошибка» и по нужному периоду.
  2. Найдите события с текстом про отсутствующий объект или ошибку проведения.
  3. В колонке «Данные» будет документ, при работе с которым случилась ошибка.
  4. Отдельно посмотрите события удаления данных за тот же период: часто видно, кто и когда удалил элемент.

Форма документа

Откройте документ из журнала. Поле с битой ссылкой выделяется сразу: вместо наименования там <Объект не найден> и идентификатор. По полю понятен тип — если это реквизит «Контрагент», пропал элемент справочника контрагентов.

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

Поиск битых ссылок запросом до запуска исправления

ТиИ показывает итог, но в его протоколе тяжело разобраться, когда ошибок сотни. Гораздо удобнее заранее получить список запросом. Подойдёт любая консоль запросов: встроенная в «Все функции» или внешняя обработка.

Приём простой. Разыменование битой ссылки возвращает NULL. Значит, нужно найти записи, где поле заполнено, но его .Ссылка пустая:

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

Для табличной части запрос тот же, только источник Документ.РеализацияТоваровУслуг.Товары и поле Номенклатура. Так же проверяются регистры: источник РегистрНакопления.ТоварыНаСкладах (в вашей конфигурации регистр может называться иначе) и нужное измерение.

Чтобы узнать GUID пропавшего объекта, допишите в выборку вычисление идентификатора в коде обработки. Метод работает и на битой ссылке:

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Ид = Выборка.БитаяСсылка.УникальныйИдентификатор();
    Сообщить(Строка(Выборка.Документ) + " → " + Строка(Ид));
КонецЦикла;

Полученный список GUID — главное, что нужно для восстановления. Сохраните его в файл.

Штатная проверка: тестирование и исправление информационной базы

Это основной инструмент. Перед запуском сделайте резервную копию: исправления ТиИ не отменяются. В файловом варианте достаточно скопировать каталог базы, в клиент-серверном — выгрузить .dt или сделать бэкап средствами СУБД.

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

Настройки для битых ссылок

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

  1. «Проверка логической целостности информационной базы».
  2. «Проверка ссылочной целостности информационной базы».
  3. Режим «Только тестирование» — для первого прохода.

Первый проход ничего не меняет и даёт протокол. Изучите его, сверьте со списком из запроса. Второй проход — в режиме «Тестирование и исправление» с выбранной реакцией на битые ссылки.

Что выбрать при ссылках на несуществующие объекты

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

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

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

Как найти созданные заглушки

После исправления откройте справочник, где были битые ссылки, и отсортируйте список по наименованию. Созданные элементы видно по пустым реквизитам и по наименованию с текстом про ненайденный объект. Заполните их вручную или замените на дубль через Администрирование → Обслуживание → Корректировка данных → Поиск и удаление дублей (путь для БП 3.0 и других конфигураций на БСП).

Пакетный запуск без открытия Конфигуратора

Для больших баз ТиИ удобно запускать из командной строки ночью:

"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" DESIGNER /S "srv1c\buh" /N "Администратор" /P "пароль" /IBCheckAndRepair -LogAndRefsIntegrity -TestOnly /Out "D:\logs\tii.txt"

Ключ -TestOnly оставляет базу без изменений. Для исправления уберите его и добавьте реакцию на битые ссылки: -BadRefCreate, -BadRefClear или -BadRefNone. Для файловой базы вместо /S укажите /F "D:\Bases\Buh".

Ручное исправление: консоль запросов, обработки и SQL

Когда битых ссылок десяток, проще починить их вручную, а не гонять ТиИ по всей базе.

Через обработки в пользовательском режиме

  1. По списку из запроса открывайте документы и выбирайте правильное значение в поле.
  2. Если документов много и правильное значение одно, используйте Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов. Отберите документы по списку и задайте новое значение реквизита.
  3. Перепроведите исправленные документы, иначе движения в регистрах останутся со старой ссылкой.

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

Через SQL — только для чтения

В клиент-серверной базе можно посмотреть таблицы в СУБД напрямую. Таблицы называются служебно: _Reference45, _Document123. Соответствие имён объектам метаданных выдаёт функция ПолучитьСтруктуруХраненияБазыДанных().

Не правьте данные 1С запросами UPDATE или DELETE в СУБД. Платформа не узнает об изменениях: не обновятся итоги, кэши, история, обмены. Результат может оказаться хуже исходной ошибки. SQL годится для поиска и подсчёта, а исправлять нужно средствами 1С.

Возврат удалённого объекта из резервной копии по GUID

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

Шаг 1. Разверните копию рядом

Загрузите старую .dt или бэкап в отдельную базу. Не поверх рабочей! Берите копию, сделанную до того, как объект пропал. Дату подскажет журнал регистрации.

Шаг 2. Проверьте, есть ли объект в копии

Выполните в копии код по каждому GUID из списка:

Ид = Новый УникальныйИдентификатор("b1c2d3e4-0000-1111-2222-333344445555");
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Ид);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("В копии объекта нет");
Иначе
    Сообщить("Найден: " + Ссылка.Наименование);
КонецЕсли;

Шаг 3. Перенесите объекты с сохранением ссылки

Выгрузите найденные объекты из копии универсальной обработкой выгрузки и загрузки данных в XML и загрузите в рабочую базу. Обработка переносит объекты с их GUID, поэтому все битые ссылки восстанавливаются разом.

Вместе с контрагентом выгрузите и его подчинённые элементы, например договоры, если они тоже пропали. Иначе вы просто перенесёте ошибку на уровень ниже.

Шаг 4. Повторите проверку

Запустите ТиИ в режиме «Только тестирование». Протокол должен быть пустым.

Полное восстановление базы: когда без него не обойтись

Откат всей базы на резервную копию — крайняя мера. Все документы, введённые после даты копии, пропадут, и их придётся вводить заново.

Выбирайте этот путь только если:

  • ⛔ ТиИ во время работы падает с ошибкой или зависает;
  • ⛔ битых ссылок тысячи, они разных типов, и восстановить объекты из копии по одному невозможно;
  • ⛔ есть признаки физического повреждения файла базы.

Для файловой базы перед откатом проверьте физическую целостность утилитой chdbfl.exe из каталога bin установленной платформы. Работает она только при закрытой базе: всех пользователей нужно отключить заранее, иначе их несохранённые данные пропадут. Если утилита находит и исправляет ошибки, после неё повторите ТиИ — возможно, откат не понадобится.

Перед откатом выгрузите текущую базу в .dt, даже повреждённую. Из неё потом можно достать документы, введённые после даты копии.

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

Профилактика сводится к трём вещам: запрет опасного удаления, регулярная проверка и свежие копии.

Права пользователей

  • 🔒 Уберите у пользователей право интерактивного удаления. Удалять только через пометку и штатную обработку Администрирование → Обслуживание → Удаление помеченных объектов: она проверяет ссылки и не удалит используемый объект.
  • 🔒 Не давайте бухгалтерам доступ в режим «Все функции» без нужды.
  • 🔒 Внешние обработки загрузки данных допускайте в базу только после проверки на копии.

Регулярная проверка по расписанию

В самой 1С нет регламентного задания для ТиИ: это функция Конфигуратора. Поэтому проверку ставят в планировщик Windows командой из раздела про пакетный запуск, с ключом -TestOnly. Раз в неделю ночью достаточно. Протокол из /Out можно отправлять себе на почту скриптом.

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

Резервные копии

Восстановить объект по GUID можно, только если есть копия до его удаления. Держите хотя бы ежедневные копии за последние две недели и ежемесячные за год.

Профилактика битых ссылок
Выполнено: 0 / 5

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

Можно ли запустить тестирование и исправление, пока пользователи работают?
Нет. ТиИ требует монопольного доступа. Предупредите пользователей, завершите сеансы и заблокируйте регламентные задания на время проверки.
Сколько времени занимает проверка ссылочной целостности?
Зависит от размера базы и диска. На базе в несколько гигабайт это обычно десятки минут, на крупных — несколько часов. Первый прогон делайте ночью.
Что лучше: создавать объекты или очищать ссылки?
Для учётных данных — создавать. Заглушка сохраняет связь между документами, её можно заполнить или заменить. Очищенную ссылку восстановить можно только из копии.
Почему после ТиИ ошибка «Объект не найден» осталась в отчёте?
Проверьте, не выбран ли вариант «Не изменять». Если исправление прошло, перепроведите документы, по которым строится отчёт, и пересчитайте итоги регистров.
Битые ссылки появляются в РИБ после каждого обмена. Что делать?
Проверьте правила и фильтры обмена: элемент справочника, вероятно, не попадает в выгрузку. Лечить базу ТиИ бесполезно, пока источник ошибки в обмене не устранён.