«Объект не найден» в поле: возвращаем потерянные данные в базу 1С

· 10 мин

Содержание

Битую ссылку в 1С восстанавливают так: находят объект, на который она указывала, и возвращают его в базу с тем же внутренним идентификатором (GUID). Лучший источник — резервная копия или база, с которой идёт обмен. Если объекта нигде нет, его создают заново программно с нужным GUID или через тестирование базы в режиме «Создавать объекты», а потом заполняют реквизиты.

Узнать битую ссылку просто: вместо контрагента, номенклатуры или склада в поле стоит <Объект не найден> (54:b8a5001e67fc0f2f11d9c7e3b7b8c79b). Документ при этом может не проводиться, отчёты показывают пустые строки, а обмен падает с ошибкой.

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

Ссылка в 1С — это не текст, а номер таблицы плюс GUID объекта. Документ хранит только этот идентификатор. Если сам объект из базы исчез, идентификатор остаётся, а показать по нему нечего.

Откуда берутся такие «сироты»:

  • 🗑️ Непосредственное удаление. Пользователь с правом интерактивного удаления стёр элемент кнопкой Shift+Del, минуя пометку и контроль ссылок.
  • 🔄 Обмен данными. В базу пришёл документ, а элемент справочника, на который он ссылается, не был зарегистрирован к выгрузке или потерялся в пакете. Частая история в РИБ и в обмене БП с ЗУП или УТ.
  • 📦 Частичный перенос через XML. Выгрузили документы без связанных справочников и загрузили в другую базу.
  • 💻 Программное удаление. Обработка или код в расширении вызывает Удалить() у объекта без проверки, используется ли он где-то.
  • ⚡ Сбой файловой базы. Отключение питания или обрыв сети во время записи. Часть данных теряется, и вместе с битыми ссылками часто появляются другие ошибки структуры.
  • 🛠️ Правка данных напрямую в СУБД. Удаление записей SQL-запросом в обход платформы.

Штатная обработка удаления помеченных объектов битых ссылок не оставляет: она не удаляет то, на что есть ссылки. Поэтому если битые ссылки появились массово, ищите виновника среди обменов, загрузок и самописных обработок.

Как найти все битые ссылки и понять, что потеряно

Одну битую ссылку видно в форме документа. Но обычно их десятки, и важно сразу оценить масштаб.

Расшифровываем текст «Объект не найден»

Строка (54:b8a5001e67fc0f2f11d9c7e3b7b8c79b) состоит из двух частей:

ЧастьЧто значитКак использовать
54Номер таблицы хранения, то есть тип объектаПо нему определяют, какой это справочник или документ
32 символа после двоеточияGUID объекта в порядке храненияИз него собирают идентификатор для поиска в копии или создания объекта

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

GUID в строке записан не в привычном виде. Чтобы получить стандартный формат xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, части переставляют:

// Стр — 32 символа после двоеточия
Стр = "b8a5001e67fc0f2f11d9c7e3b7b8c79b";
GUID = Сред(Стр, 25, 8) + "-" + Сред(Стр, 21, 4) + "-"
     + Сред(Стр, 17, 4) + "-" + Сред(Стр, 1, 4) + "-" + Сред(Стр, 5, 12);
// Результат: b7b8c79b-c7e3-11d9-b8a5-001e67fc0f2f

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

Полный список битых ссылок даёт тестирование в режиме только проверки. Оно ничего не меняет в данных.

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

В протоколе будут строки с объектом, в котором найдена ссылка, и с самой битой ссылкой. По ним и составляют список: какие типы объектов потеряны и сколько документов затронуто.

Если в протоколе десятки ссылок одного типа (например, вся номенклатура одного поставщика), почти наверняка это сбой обмена. Такой случай лечится повторной выгрузкой, а не ручной правкой.

Способы восстановить битую ссылку: от безопасного к радикальному

Главное правило: новый элемент с тем же наименованием битую ссылку не починит. У него будет другой GUID, и документы так и будут указывать на пустоту. Нужен объект именно с тем идентификатором, который хранится в документах.

СпособКогда подходитРиски
Повторный обменОбъект есть в базе-источникеПочти нет, если обмен настроен правильно
Перенос из резервной копии через XMLОбъект был в базе раньшеМожно случайно перезаписать изменённые позже данные
Создание объекта с нужным GUID кодомОбъекта нет нигде, но известен типРеквизиты придётся заполнить вручную
Тестирование: «Создавать объекты»Битых ссылок много, восстанавливать нужно всёПоявятся пустые заглушки, их надо заполнить
Тестирование: «Очищать ссылки»Данные не нужны совсемПоля станут пустыми, информация потеряна навсегда

Способ 1. Повторить обмен

Если база получает данные из другой базы, сначала найдите объект там. Проверьте, что он не удалён и не помечен на удаление. Затем зарегистрируйте его к выгрузке в узел обмена: в типовых конфигурациях это делается в настройках синхронизации через состав отправляемых данных. После очередного сеанса обмена объект придёт с тем же GUID, и ссылки «оживут» сами.

Способ 2. Достать объект из резервной копии

Это главный приём, если объект удалили в самой базе.

  1. Разверните резервную копию в отдельную базу. Рабочую не трогайте.
  2. В копии найдите объект по GUID. Удобнее всего — через консоль кода: Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID)).
  3. Откройте в копии универсальную обработку выгрузки и загрузки данных XML (ВыгрузкаЗагрузкаДанныхXML, она подходит к конфигурации на той же платформе).
  4. Отметьте только нужные объекты и выгрузите их в файл.
  5. В рабочей базе той же обработкой загрузите файл.

Объект встанет на место с прежним идентификатором, и все документы его снова увидят.

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

Способ 3. Создать объект с тем же GUID программно

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

GUID = "b7b8c79b-c7e3-11d9-b8a5-001e67fc0f2f";
НужнаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID));

Если НужнаяСсылка.ПолучитьОбъект() = Неопределено Тогда
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйЭлемент.УстановитьСсылкуНового(НужнаяСсылка);
    НовыйЭлемент.Наименование = "Восстановлено: уточнить";
    НовыйЭлемент.Записать();
КонецЕсли;

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

Если запись не проходит из-за обязательных реквизитов или проверок при записи, заполните эти реквизиты в коде до вызова Записать().

Способ 4. Тестирование с созданием объектов

Когда битых ссылок сотни, создавать каждую кодом долго. В окне Администрирование → Тестирование и исправление для ссылок на несуществующие объекты есть три варианта действий:

  • Создавать объекты — платформа создаст элементы-заглушки с нужными GUID. Документы останутся целыми.
  • Очищать ссылки — поля станут пустыми.
  • Не изменять — только запись в протокол.

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

Способ 5. Очистить ссылки

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

Где сейчас есть потерянный объект?

Ошибки, из-за которых восстановление делает хуже

  • ❌ Исправление без резервной копии. Тестирование меняет данные необратимо. Неудачный выбор варианта «Очищать ссылки» без копии не откатить.
  • ❌ Удаление заглушек сразу после тестирования. Пустые элементы кажутся мусором, но именно на них держатся документы. Удалите их — ссылки снова станут битыми.
  • ❌ Загрузка всей копии поверх рабочей базы. Теряются документы, введённые после даты копии. Переносите только недостающие объекты.
  • ❌ Перепроведение без проверки. Документ с заглушкой вместо номенклатуры проведётся, но по пустой карточке: без счёта учёта, без ставки НДС. Сначала заполните заглушку, потом проводите.
  • ❌ Запуск в рабочее время. Тестированию нужен монопольный доступ, и пользователей придётся выгнать. Планируйте на вечер или выходные.

Особенности в файловых, клиент-серверных и распределённых базах

Файловая база. Битые ссылки часто идут в паре с повреждением файла 1Cv8.1CD. Если в протоколе тестирования есть ошибки структуры, сначала исправьте их, потом занимайтесь ссылками. Для сильно повреждённого файла используют утилиту chdbfl.exe из каталога платформы, после неё — тестирование в Конфигураторе.

Клиент-серверная база . Тестирование крупной базы может идти часами. Для поиска битых ссылок одного типа быстрее работает запрос (см. следующий раздел), а полное тестирование оставьте на выходные. Монопольный режим всё равно нужен, поэтому заранее предупредите пользователей: их сеансы будут завершены.

РИБ. Восстанавливать объект лучше в главном узле. Созданный там объект с нужным GUID уйдёт в подчинённые узлы обычным обменом. Если создать его только в подчинённом узле, при следующем обмене возможны конфликты.

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

Как автоматизировать поиск битых ссылок

Ручной контроль раз в квартал пропускает проблемы. Лучше ловить битые ссылки сразу после обмена или загрузки.

Запрос по конкретному реквизиту

Битая ссылка не находит пары в таблице справочника. На этом построен запрос с левым соединением:

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

Подставьте свой документ и реквизит. Запрос работает за секунды даже на большой базе и не требует монопольного режима. Его можно сохранить в консоли запросов и запускать после каждого обмена.

В коде проверка ЗначениеЗаполнено() битую ссылку не отличит от нормальной: она вернёт Истина. Надёжный признак — Ссылка.ПолучитьОбъект() = Неопределено.

Тестирование по расписанию из командной строки

Проверку целостности можно запускать без открытия Конфигуратора, например ночным заданием планировщика Windows. Пример для файловой базы:

"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "пароль" /IBCheckAndRepair -LogAndRefsIntegrity -TestOnly /Out "D:\Logs\check.txt"

Ключ -TestOnly включает только проверку, без исправлений. Путь к платформе и номер версии подставьте свои. Перед запуском убедитесь, что в базе нет пользователей: команда требует монопольного доступа и не стартует при активных сеансах. Протокол из файла check.txt можно разбирать скриптом и отправлять администратору, если в нём есть строки про ссылки на несуществующие объекты.

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

Защита базы от битых ссылок
Выполнено: 0 / 6

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

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

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

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