Восстановление битых ссылок в 1С
Простая и относительно бескровная методика восстановления битых ссылок и ссылочной целостности.
- Описание
- Подробнее
Описание
Столкнулся сегодня с проблемой, известной в 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. В принципе, стандартный инструмент базы «Тестирование и исправление» делает тоже самое, он восстанавливает главное — объект с правильной ссылкой. Но созданный таким образом объект, конечно, не имеет никаких данных внутри. Простой тест на стандартной УТ с удалением и восстановлением номенклатуры выявил на свет целую тонну ошибок конфигуратора при попытки открыть эту номенклатуру, при попытке открыть документы с восстановленной номенклатурой и пр.
Буду рад любым комментариям.