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

19.01.11

Задачи пользователя - Корректировка данных

Простая и относительно бескровная методика восстановления битых ссылок и ссылочной целостности.

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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Корректировка данных Системный администратор Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    116955    702    176    

744

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    40320    121    152    

83

Закрытие периода Корректировка данных Программист Пользователь 1С v8.3 Система компоновки данных 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

5000 руб.

13.07.2015    53273    183    29    

135

Взаиморасчеты Корректировка данных Бухгалтер Пользователь 1С v8.3 1C:Бухгалтерия Бухгалтерский учет Управленческий учет Платные (руб)

Вы наконец разобрались с закрытием месяцев и пора начать контролировать сроки оплаты поставщикам и задолженности клиентов, но в базе расчеты не идут из-за развернутого сальдо? Не беда, есть решение!

12000 руб.

02.11.2020    8756    6    3    

9

Ценообразование, анализ цен Корректировка данных 1С v8.3 1С:Управление торговлей 11 Платные (руб)

Подключаемая внешняя обработка с простой настройкой - позволяет автоматически рассчитывать в документах продажи скидку процентом на каждый второй, третий и т.д. товар с наименьшей ценой из выбранного сегмента. Ничего лишнего для удобного использования!

5000 руб.

07.05.2025    1050    1    0    

2

Загрузка и выгрузка в Excel Корректировка данных Пользователь 1С v8.3 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Обработка для группового редактирования реквизитов номенклатуры в 1С для УТ 11 / КА 2. Позволяет редактировать реквизиты (как основные, так и дополнительные реквизиты и сведения) непосредственно в таблице, устанавливать новые значения реквизитов на выбранную номенклатуру, а также загружать новые значения из Excel. Предусмотрена возможность добавления фото к товарам перетаскиванием файла из проводника на строку с товаром (drag'n'drop)

4200 руб.

16.11.2020    18831    13    6    

12

Печатные формы Корректировка данных Учет документов 1С v8.3 1C:Бухгалтерия 1С:Управление нашей фирмой 3.0

Данная обработка позволяет работать со справками об оплате медицинских услуг в любой конфигурации 1С 8.3 Решение выполнено в виде внешней обработки, поэтому будет работать так же на базовых версиях конфигураций 1С, где нет возможности добавить расширение.

3600 руб.

28.01.2025    1495    0    0    

3

Корректировка данных Бухгалтер 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Налоговый учет Налог на прибыль Платные (руб)

Обработка служит для: выравнивания бухгалтерского и налогового учета на определенную дату по выбранным счетам; закрытия остатков по выбранным счетам; обнуления налогового учета (ПР, ВР также будут обнулены)

2880 руб.

05.05.2024    1808    16    0    

12
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. strelez 7 20.01.11 15:24 Сейчас в теме
Прекрасная статья! Благодарю! Реально помогла в решении насущных срочных проблем :!: :!: :!:
Новиков; +1 Ответить
2. Новиков 292 20.01.11 15:45 Сейчас в теме
Отличная статья! Спасибо! Надеюсь автор продолжит радовать нас столь замечательными статьями. Все коротко и по делу.

Так держать!
3. ediks 338 21.01.11 07:44 Сейчас в теме
А не проще было воспользоваться типовой обработкой "Выгрузка и загрузка XML", чем изобретать велосипед что-то свое? Она делает все то же самое. Более того, она имеет возможность по умолчанию выгружать все реквизиты по ссылкам, которые, кстати, тоже могут могут иметь битые ссылки в приемнике.
Bob_D; RustIG; +2 Ответить
4. romansun 194 21.01.11 11:26 Сейчас в теме
Да, согласен, разных способов много. "Выгрузка и загрузка XML" - отличный вариант.


Дело в том, что в моём случае нет прямого доступа к живой базе. И самым оптимальным и неломаемым вариантом обработки для обслуживающего базу персонала будет обработка с одной кнопкой "Сделать всё и правильно" :). Да и на инструменты сложнее одной кнопки, в принципе, могут потребовать документацию.

Повторюсь, это не обработка, это именно методика.
5. ediks 338 21.01.11 12:18 Сейчас в теме
(4)ОК, любой вариант имеет право на жизнь, если он наилучшим образом решает поставленную задачу. Если эта методика реально помогла восстановить битые ссылки с наименьшими затратами, то это только приветствуется.
6. romansun 194 21.01.11 12:23 Сейчас в теме
7. RustIG 1931 24.01.11 13:47 Сейчас в теме
(0) можно еще использовать такой вариант:

//получаем уникальный идентификатор ссылки
СтрокаУникальныйИдентификатор = Строка(АвансовыйОтчет.Ссылка.УникальныйИдентификатор());

//выгружаем уникальный идентификатор в строку и
//выгружаем всю информацию по документу с привязкой к уникальному идентификатору
//....


//загружаем данные ...
Док = Документы.АвансовыйОтчет.СоздатьДокумент();
Док.УстановитьСсылкуНового(Документы.АвансовыйОтчет.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУникальныйИдентификатор)));
Док.Дата
= ТекущаяДата();
//заполняем реквизиты ...
Док.Записать();

Отрывок из статьи "Особенности использования сериализации" на ИТС: "...в 1с 8 методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() реализованы в основном для сохранения функциональной совместимости с 1с 7.7..." - мало что поясняет... может кто примером объяснит?
8. romansun 194 24.01.11 14:37 Сейчас в теме
(7)
Объяснить в смысле что? Разницу в вариантах?

По поводу приведенного варианта - да, это, в общем, то же самое. Только здесь используется ПолучитьСсылку() и УникальныйИдентификатор().
Этот способ, в принципе, классический :). Мне только он не нравится тем, что здесь нет типизации ссылки. Поясняю.
Вот, что выдает нам УникальныйИдентификатор() и ЗначениеВСтрокуВнутр() от одной и той же ссылки соответственно:

"14418025-ec08-11df-ab2b-001b78e134e0"
"{"#",54c3544f-651b-4887-ae3a-2df362efbacb,9659:ab2b001b78e134e011dfec0814418025}"

По сути, первый вариант - это та же ссылка, только "перемешанная". В чем смысл этого? Тут я хз :). Но в первом варианте отсутствует информация откуда, из какой таблицы взята ссылка. Поэтому, чтобы правильно привязать её к таблице, мы вынуждены указывать конкретно, от какого объекта метаданных ссылка Документы.АвансовыйОтчет.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУникальныйИдентификатор)), либо (если не знаем тип заранее) писать цикл по метаданным и пытаться получить ссылку поочередно от всех объектов.

Что никак не хорошо.

Ну и плюс УникальныйИдентификатор() всё-таки полезен скорее для другого, чем для переноса ссылок - для генерации новой ссылки и возможности подстановки её в нужное место еще до записи самой сгенеренной ссылки.
Thalt; Cat-Ek; kosikov_oleg; Spacer; +4 Ответить
9. a4a 15.12.11 15:35 Сейчас в теме
10. maxdot 15.12.11 15:51 Сейчас в теме
Для себя нового ничего не узнал, но спасибо за труды. Дал ссылку нескольим товарищям, им помогло! =)
11. Гость 20.02.12 00:23
Спасибо, очень пригодилась
12. Жолтокнижниг 282 17.01.13 12:33 Сейчас в теме
А не проще получить объект ссылки в нормальной базе, серилизовать его.
объект=Ссылка.ПолучитьОбъект();
ЗаписатьXML(записьХМЛ,объект);


А в базе с битыми ссылками просто прочитать и записать этот объект.

прочитанноеЗначение=ПрочитатьXML(чтениеХМЛ);
прочитанноеЗначение.записать();
romansun; kosikov_oleg; +2 Ответить
13. kosikov_oleg 24.10.17 10:16 Сейчас в теме
Спасибо, мне очень помогло!
14. kollegue 23.11.17 12:01 Сейчас в теме
А каковы принципиальные недостатки решения данной проблемы при помощи тестирования и исправления с созданием объектов? У нас после краха системы пропали некоторые объекты и я сейчас думаю как их лучше восстановить.
15. Cat-Ek 26.12.17 10:49 Сейчас в теме
Спасибо автору. Буду сегодня проверять
16. Briz_65 8 11.04.23 12:48 Сейчас в теме
Если есть резервная копия базы где присутствует удаленная ссылка, проще ее выгрузить через универсальный обмен, безо всяких танцев с бубном.
17. romansun 194 11.04.23 16:16 Сейчас в теме
(16) Публикации 12 лет :)

Так-то вариантов восстановить ссылки много, конечно. В публикации один из возможных.

в (12) по сути, это же самое описано
18. Evgeniy.Pecheykin 31 18.01.24 16:03 Сейчас в теме
Очень помогло - спасибо)
romansun; +1 Ответить
19. пользователь 30.07.24 15:15
Сообщение было скрыто модератором.
...
Для отправки сообщения требуется регистрация/авторизация