Каталог решений - Восстановление битых ссылок в 1С

Восстановление битых ссылок в 1С

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

 

Буду рад любым комментариям.

has been added to your cart:
Оформление заказа