Столкнулся сегодня с проблемой, известной в 1С как "<Объект не найден>".
Собственно, проблема такая иногда возникала и обычно решалась средствами SQL. Но тут с серверной версией базы возникли проблемы, а битые ссылки надо устранять...
Вкратце суть:
<Объект не найден> (9659:ab2b001b78e134e011dfec0814418025)
То, что указано за фразой "Объект не найден" - это совершенно конкретное указание что и где необходимо восстановить. Т.е., в моём случае,
"9659" - это номер таблицы (_Reference9659)
"ab2b001b78e134e011dfec0814418025" - это как раз та самая пресловутая ссылка, а по сути, просто значение в формате binary(16). В таблице SQL оно выглядит как "0xab2b001b78e134e011dfec0814418025"
Т.е., если сильно упрощенно, достаточно завести в таблице "_Reference9659" новую запись с этим значением в поле "_IDRRef" и всё. Новый элемент появится в справочнике и во всех связных объектах.
Как всё это осуществить средствами 1С?
Простой и бескровный способ - воспользоваться двумя замечательными командами:
ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр().
Загружаем резервную копию базы (все же делают регулярные бэкапы, ведь так?), ищем ссылку, которая была удалена и преобразуем её через ЗначениеВСтрокуВнутр(ИскомаяСсылка) в строку вида "{"#",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}", где мы уже видим знакомые цифры.
В рабочей копии применяем обратную команду ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}"). Не забудьте про двойные кавычки вокруг решетки! Результатом будет как раз тот самый <Объект не найден> ссылочного типа. На а дальше применяем УстановитьСсылкуНового().
Общий вид кода будет таким:
НовЭл.УстановитьСсылкуНового(ЗначениеИзСтрокиВнутр("{""#"",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}")); НовЭл.Наименование = "ДКР";
НовЭл = Справочники.БюджетныеЦентры.СоздатьЭлемент();
...
НовЭл.Записать();
Данный способ позволит очень быстро восстановить ссылочную целостность даже в файловой базе в полном объёме. В случае, если вы каким-либо образом удалили половину таблицы, то не составит труда написать обычную переливку, к примеру ТЗ, через ЗначениеВФайл()/ЗначениеИзФайла().
P.S. В принципе, стандартный инструмент базы "Тестирование и исправление" делает тоже самое, он восстанавливает главное - объект с правильной ссылкой. Но созданный таким образом объект, конечно, не имеет никаких данных внутри. Простой тест на стандартной УТ с удалением и восстановлением номенклатуры выявил на свет целую тонну ошибок конфигуратора при попытки открыть эту номенклатуру, при попытке открыть документы с восстановленной номенклатурой и пр.
Буду рад любым комментариям.