«Объект не найден» в поле: возвращаем потерянные данные в базу 1С
Содержание
Битую ссылку в 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
Проверка всей базы в Конфигураторе
Полный список битых ссылок даёт тестирование в режиме только проверки. Оно ничего не меняет в данных.
- Сделайте резервную копию: выгрузите базу в
.dtили скопируйте каталог файловой базы. - Попросите всех пользователей выйти. Тестированию нужен монопольный доступ.
- В Конфигураторе откройте
Администрирование → Тестирование и исправление. - Отметьте проверку логической и ссылочной целостности.
- Выберите режим только тестирования, без исправления.
- Нажмите «Выполнить» и сохраните протокол из окна служебных сообщений.
В протоколе будут строки с объектом, в котором найдена ссылка, и с самой битой ссылкой. По ним и составляют список: какие типы объектов потеряны и сколько документов затронуто.
Если в протоколе десятки ссылок одного типа (например, вся номенклатура одного поставщика), почти наверняка это сбой обмена. Такой случай лечится повторной выгрузкой, а не ручной правкой.
Способы восстановить битую ссылку: от безопасного к радикальному
Главное правило: новый элемент с тем же наименованием битую ссылку не починит. У него будет другой GUID, и документы так и будут указывать на пустоту. Нужен объект именно с тем идентификатором, который хранится в документах.
| Способ | Когда подходит | Риски |
|---|---|---|
| Повторный обмен | Объект есть в базе-источнике | Почти нет, если обмен настроен правильно |
| Перенос из резервной копии через XML | Объект был в базе раньше | Можно случайно перезаписать изменённые позже данные |
| Создание объекта с нужным GUID кодом | Объекта нет нигде, но известен тип | Реквизиты придётся заполнить вручную |
| Тестирование: «Создавать объекты» | Битых ссылок много, восстанавливать нужно всё | Появятся пустые заглушки, их надо заполнить |
| Тестирование: «Очищать ссылки» | Данные не нужны совсем | Поля станут пустыми, информация потеряна навсегда |
Способ 1. Повторить обмен
Если база получает данные из другой базы, сначала найдите объект там. Проверьте, что он не удалён и не помечен на удаление. Затем зарегистрируйте его к выгрузке в узел обмена: в типовых конфигурациях это делается в настройках синхронизации через состав отправляемых данных. После очередного сеанса обмена объект придёт с тем же GUID, и ссылки «оживут» сами.
Способ 2. Достать объект из резервной копии
Это главный приём, если объект удалили в самой базе.
- Разверните резервную копию в отдельную базу. Рабочую не трогайте.
- В копии найдите объект по GUID. Удобнее всего — через консоль кода:
Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID)). - Откройте в копии универсальную обработку выгрузки и загрузки данных XML (
ВыгрузкаЗагрузкаДанныхXML, она подходит к конфигурации на той же платформе). - Отметьте только нужные объекты и выгрузите их в файл.
- В рабочей базе той же обработкой загрузите файл.
Объект встанет на место с прежним идентификатором, и все документы его снова увидят.
Обработка загружает данные как есть. Если в выгрузку попали объекты, которые в рабочей базе с тех пор изменились, изменения затрутся. Выгружайте только то, чего в рабочей базе нет.
Способ 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 можно разбирать скриптом и отправлять администратору, если в нём есть строки про ссылки на несуществующие объекты.
Как не допустить новых битых ссылок
Отдельно про права. В типовых конфигурациях на БСП право интерактивного удаления у обычных профилей отключено. Проблемы начинаются, когда кто-то выдаёт пользователям полные права «чтобы не мешало». Проверьте профили групп доступа и роли пользователей, которые работают в базе каждый день.
Для обмена полезная привычка — после первичной настройки синхронизации сверить количество элементов основных справочников в обеих базах. Расхождение в десяток контрагентов сегодня — это сотня битых ссылок через месяц.