Проблема
В отчётах, карточках счетов и формах документов появляются строки вида:
<Объект не найден> (110:85890cc47a32cc0811efd3e4b019a9ce)
Это так называемая битая ссылка: в реквизите документа или в измерении/субконто регистра хранится ссылка на объект, которого физически нет в таблице. Чаще всего так бывает после прямого удаления без контроля ссылочной целостности, после неудачной загрузки или обмена, после «чистки» справочников сторонними обработками.
Практическое следствие неприятное: такую ссылку нельзя выбрать в документе. По «потерянному» сотруднику, контрагенту или номенклатуре невозможно ни закрыть сальдо, ни провести корректировку — в форме подбора этого объекта просто нет.
Почему не всегда помогает тестирование и исправление
Штатный путь — «Тестирование и исправление» в конфигураторе с режимом «Создавать объекты». Платформа создаёт пустые объекты с теми же идентификаторами, и ссылки «оживают».
На практике есть несколько подводных камней:
- Проверка ссылочной целостности — это подмножество проверки логической целостности и отдельно от неё не включается. Если снята галка логической целостности, ссылочная проверка не выполняется вовсе.
- На больших базах проверка идёт часами и сутками, причём самая долгая часть — как раз субконто регистров бухгалтерии, где чаще всего и лежат битые ссылки. Требуется монопольный режим на всё это время.
- ТиИ создаёт объекты массово по всей базе, а не только те, которые вам нужны. Выборочно «оживить» пять ссылок нельзя.
- Встречаются ситуации, когда проверка отработала, а конкретные ссылки так и остались «<Объект не найден>». Стоит смотреть протокол в окне сообщений: если в нём нет строк про нужную таблицу, проверка до неё не дошла.
Когда нужно быстро и точечно восстановить несколько объектов, удобнее сделать это кодом.
Как устроено представление битой ссылки
Строка (110:85890cc47a32cc0811efd3e4b019a9ce) состоит из двух частей:
- 110 — внутренний номер таблицы (типа). Одинаков для всех ссылок одного объекта метаданных в данной базе.
- 32 шестнадцатеричных символа — уникальный идентификатор, но в переставленном порядке.
Если просто вставить эти 32 символа в Новый УникальныйИдентификатор(), получится другой GUID. Половинки строки нужно поменять местами:
Строка: 85890cc47a32cc08 | 11efd3e4b019a9ce
А (16 симв.) Б (16 симв.)
GUID = Б[9..16] - Б[5..8] - Б[1..4] - А[1..4] - А[5..16]
= b019a9ce-d3e4-11ef-8589-0cc47a32cc08
На встроенном языке:
А = Лев(Hex, 16);
Б = Прав(Hex, 16);
СтрУИД = Сред(Б, 9, 8) + "-" + Сред(Б, 5, 4) + "-" + Лев(Б, 4) + "-"
+ Лев(А, 4) + "-" + Сред(А, 5, 12);
Бонус: дата создания исходного объекта
Платформа генерирует идентификаторы версии 1 (символ 1 в начале третьей группы GUID). В таком UUID зашито время создания — количество 100-наносекундных интервалов с 15.10.1582 — и MAC-адрес сетевой карты компьютера, на котором объект был записан.
Это полезно для расследования: по дате понятно, в каком периоде искать документы с этим физлицом или контрагентом, а по MAC-адресу — с какого сервера или рабочего места он создавался. Обработка подставляет дату создания в наименование восстановленного объекта, например «Восстановлено 16.01.2025».
Возможности обработки
- Принимает текст ошибки как есть:
<Объект не найден> (110:...)или просто110:.... - Если поле «Метаданные» не заполнено — сама определяет объект метаданных по номеру типа, перебирая ссылочные типы конфигурации.
- Если поле заполнено вручную — сверяет номер типа, чтобы по ошибке не создать объект в чужом справочнике.
- Поддерживает справочники, документы, планы видов характеристик, планы счетов, планы видов расчёта, планы обмена, бизнес-процессы и задачи.
- Заполняет наименование, код, для документов — дату (из UUID) и номер, комментарий.
- Не создаёт дубль, если объект с таким идентификатором уже существует.
- Документы записываются без проведения — движений не появится, но ссылки из регистров начнут указывать на существующий документ.
Запись выполняется с ОбменДанными.Загрузка = Истина, чтобы обработчики типовой конфигурации не требовали заполнения обязательных реквизитов.
Порядок работы
- Сделайте резервную копию базы.
- Скопируйте текст ошибки из отчёта (например, из ОСВ по счёту) или из формы документа. Точное значение надёжнее всего брать по кнопке «Подробно…» в окне ошибки.
- Вставьте текст в поле «Текст ошибки», при необходимости укажите полное имя метаданных (например,
Справочник.ФизическиеЛица). - Нажмите «Восстановить». В сообщениях появится результат и определённый тип.
- Переформируйте отчёт — вместо «<Объект не найден>» появится восстановленный объект, который теперь можно выбрать в документах.
Чтобы найти сразу все битые ссылки, например на физлиц в субконто Хозрасчетного, удобен такой запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ХС.Значение КАК Ссылка
ИЗ
РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХС
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК Ф
ПО ХС.Значение = Ф.Ссылка
ГДЕ
ХС.Значение ССЫЛКА Справочник.ФизическиеЛица
И Ф.Ссылка ЕСТЬ NULL
ВНИМАНИЕ: РИБ и базы с обменом данными
Не запускайте обработку в распределённой информационной базе и в базах, участвующих в синхронизации, не разобравшись в причине появления битых ссылок.
В распределённой базе висячая ссылка далеко не всегда означает потерю данных. Объект может существовать в другом узле и просто ещё не прийти по обмену, либо не входить в состав данных этого узла по правилам регистрации. Методическая поддержка 1С прямо предупреждает, что в базах, хранящих неполный набор объектов, проверку ссылочной целостности, а тем более исправление, проводить не следует (ИТС).
Что может произойти, если восстановить объект «заглушкой» в таком узле:
- Заглушка уходит по обмену и затирает настоящий объект. Восстановленный элемент имеет тот же GUID, что и настоящий в другом узле. Если изменение зарегистрируется к выгрузке, при следующем обмене пустой объект с наименованием «Восстановлено …» перезапишет реальные данные в центральной базе, а оттуда разойдётся по всем остальным узлам. Откатить это можно только из резервных копий всех затронутых баз.
- Массовая порча справочников. Особенно опасно, если восстанавливать объекты циклом по результату запроса: одним запуском можно отправить в обмен сотни пустых элементов номенклатуры или контрагентов.
- Конфликты синхронизации между разными конфигурациями (например, БП и ЗУП через EnterpriseData): заглушка может сопоставиться с существующим объектом приёмника или создать в нём дубль.
- Потеря реквизитов. Даже если настоящий объект позже придёт по обмену и перезапишет заглушку, всё, что вы успели «дозаполнить» руками в заглушке, будет потеряно, — или наоборот, при неудачном порядке обмена потеряются реальные реквизиты.
Что делать в базах с обменом:
- Сначала найдите объект по GUID в других узлах или связанных базах. Если он там есть — зарегистрируйте его к выгрузке в источнике и выполните синхронизацию. Ссылки «склеятся» сами, без заглушек.
- Если заглушку всё же нужно создать — после создания проверьте в «Регистрации изменений для обмена», не попал ли объект в выгрузку, и при необходимости снимите регистрацию до ближайшего сеанса обмена.
- По возможности выполняйте восстановление в главном узле, а не в подчинённом.
Ограничения
- Значения перечислений восстановить нельзя — они задаются в конфигураторе, а не создаются в данных.
- Для подчинённых справочников может понадобиться заполнить владельца вручную.
- Если битая ссылка вела на группу иерархического справочника, будет создан обычный элемент.
- Восстанавливается только «оболочка» объекта: реквизиты исходного объекта утрачены. Если объект реально существовал под другим GUID (например, человек был заведён заново), правильнее не восстанавливать заглушку, а заменить ссылки на существующий элемент штатной обработкой поиска и замены значений — иначе появится дубль.
Совместимость
Управляемые формы, любая конфигурация на платформе 8.3. Проверено на платформе 8.3.27 и конфигурации «Бухгалтерия предприятия 3.0», клиент-серверный вариант.
Перед использованием обязательно сделайте резервную копию информационной базы.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.206.19
Вступайте в нашу телеграмм-группу Инфостарт