Поиск и восстановление битых ссылок (объект не найден)

Часто после повреждений информационной базы теряются некоторые объекты и остаются только "битые" ссылки на них, имеющие примерно такой вид: "<Объект не найден> (77:805f000c291e652311e0ad237dea6181)".
Данная обработка позволяет найти такие ссылки и восстановить их в автоматическом режиме (при наличии копии информационной базы).

Битые ссылки появляются в базе как правило после непосредственного удаления объектов (без контроля ссылок на них).

Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом: 

(77:805f000c291e652311e0ad237dea6181)

Такие ссылки могут возникать:

1. В результате действий пользователей имеющих право непосредственного удаления объектов, без пометки на удаление и контроля ссылочной целостности перед удалением. Поэтому такие права у пользователей желательно забрать;

2. При выполнении обработки некорректно удаляющей объекты;

3. При выполнении обмена между информационными базами в варианте РИБ или обмен по правилам обмена между отличающимися базами.

Бывает так, что пользователь в одной базе участвующей в обмене, вполне корректно удалил объект т.к. ссылок на него в этой базе не было. Информация об удалении объекта передается в другую базу, где на него есть ссылки. В типовых конфигурациях объект при этом удаляется непосредственно, и возникают «битые» ссылки. Как пример — процедура УдалитьОбъектПоСсылке() в модуле обработки ОбменДаннымиXML. В конце этой процедуры вызывается процедура УдалитьОбъект(Объект, Истина). Вторым параметром в этой процедуре является признак непосредственного удаления объекта. Необходимо заменить его на Ложь;

Битые ссылки можно обнаружить при выполнении тестирования и исправления, включив опцию «Проверка ссылочной целостности информационной базы». А также их можно увидеть при работе с базой в режиме 1С:Предприятие, открыв форму объекта содержащего в одном из реквизитов «битую» ссылку.

Как с этим бороться?. Ну во первых ограничить права пользователей на непосредственное удаление объектов и поправить проблемные участки кода в конфигурации создающие предпосылки для возникновения таких ссылок. А также не забывать делать архивные копии базы.

Эти записи, конечно, можно исправить при тестировании, поставив опцию «Создавать объекты» или «Очищать ссылки». В таком случае мы избавимся от битых ссылок, но это не поможет нам восстановить исходное состояние базы. Тогда из учета окончательно потеряются изменения, внесенные этими объектами, а это опасно.

Если имеется достаточно свежая архивная копия базы, то можно попробовать восстановить эти ссылки.

Для этих целей в интернете можно найти достаточно много обработок.

Например вот эта: http://help1c.com/faq/view/1128.html «Поиск в базе битых ссылок — «объект не найден», которая позволяет найти битые ссылки в режиме 1С:Предприятия, без запуска конфигуратора 1С и выполнения «тестирования и справления».

Найти удаленный объект в архивной копии базы можно при помощи этой обработки: http://help1c.com/faq/view/483.html

Таким образом, мы можем вручную восстановить «битые» ссылки по архивной копии. При этом важно чтобы вновь созданный объект имел такой же уникальный идентификатор (GUID), каким он был раньше. Для этого можно воспользоваться например этой обработкой: //infostart.ru/public/14655/

Однако, заниматься этим вручную — это утомительная и малопроизводительная трата времени. Гораздо эффективнее поручить эту работу самой же 1С.

На Инфостарте уже публиковались обработки позволяющие сделать это автоматически.

Например вот эта обработка: //infostart.ru/public/91438/

И хотя цели у моей и этой обработки одинаковые — восстановление «битых» ссылок по архивной копии, подход к решению этих целей у нас разный.

Основное отличие моей обработки состоит в следующем:

Не используется протокол тестирования полученный в конфигураторе. Битые ссылки ищутся непосредственно в режиме 1С:Предприятия. При этом можно ограничивать поиск определенным типом объектов, например искать только ссылки с типом «Справочник.ДоговорыКонтрагентов».

Для удобства подключения к архивной копии базы использована обработка //infostart.ru/public/16628/ которая позволяет выбирать нужную базу из списка аналогичного списку баз 1С и подключаться к ней.

Несмотря на наличие подобных обработок на Инфостарте, возможно эта покажется кому-то более удобной в использовании.

Вовремя сделанная архивная копия может избавить вас от многих проблем. Удачи!

 

P.S. Добавлена версия портированная на управляемые формы — файл Poisk Objekt ne najden_82UF.epf

Обработка включает как обычные, так и управляемые формы.

Портирование обработки выполнено Андреем Торопчиным.

99 Comments

  1. mr.Kot

    Плюсовать пока не буду, качал аналогичную обработку, сейчас попробую воспользоаться данной. По итогам работы плюсану 🙂

    Reply ↓
  2. xavi

    При нажатии на «Восстановить» появляется сообщение:

    {Форма.Форма.Форма(567)}: Преобразование значения к типу Булево не может быть выполнено

    Если СкопироватьОбъектИзСОМ(ПодключеннаяИБ, сАрхив.ГУИД_Объекта) Тогда

    Конфа Альфа-Авто.

    Reply ↓
  3. Spacer

    (2) xavi, Да, была ошибочка…

    Подправил, перезалил.

    Reply ↓
  4. echo77

    А где для 8.1?

    Написано же что обработка для 8.1/8.2

    Reply ↓
  5. Spacer

    (4) echo77, Будет и для 8.1. Сегодня вечером выложу.

    Reply ↓
  6. mart-sha

    пока не пробовал, но ПЛЮС за отличное описание проблемы, за анализ других обработок. Грамотно и честно.Спасибо

    Reply ↓
  7. Spacer

    (4) echo77, Добавил вариант для версии 1С 8.1.

    Reply ↓
  8. andru_dv

    Спасибо!

    Полезная обработка.

    Reply ↓
  9. shomo

    Замечательно. Очень нужный инструмент.

    Reply ↓
  10. CaSH_2004

    Очень хорошее описание, очень рад что встречаются авторы которые не леняться писать описание, а не только код 🙂

    Кстати есть аналогичный но ПЛАТНЫЙ продукт http://infostart.ru/public/88389/, так что удивительно что этот бесплатный.

    Насчет ссылок дам еще:

    http://infostart.ru/public/58058/ — Поиск битых ссылок с отбором типа

    http://infostart.ru/public/80438/ — Восстановление битых ссылок в 1С

    Вроде они в статье не упомянуты

    Reply ↓
  11. accnt

    уже несколько таких набралось обработок,но эта тоже хорошая,зачет

    Reply ↓
  12. leon111

    Спасибо! Нужная обработка!

    Reply ↓
  13. JamilRG

    Спасибо!

    Полезная обработка.

    Reply ↓
  14. StasssiK

    Спасибо, нужная и полезная штука. Очень пригодилась.

    Reply ↓
  15. Deniz200

    полезно

    Reply ↓
  16. shatshat

    очень пригодилась!!!! Браво автор и огромное СПАСИБО

    все идеи и принципы ясны, более того — расписаны «первоисточники» (с ними тоже ознакомился, очень интересно)

    самое же главное в полезности этой обработки — даже если ты понимаешь «как можно сделать» — в момент «катастрофы» просто нет возможности спокойно и детально все сделать и мозг зачумлен клиентом-владельцем базы данных — «нужно все-все-все восстановить и немедленно!»

    и тут… СПАСЕНИЕ

    спасибо огромное, Владимир

    Reply ↓
  17. Spacer

    (16) shatshat, Очень рад что вам пригодилось.:)

    Reply ↓
  18. Nadegda_P

    Здравствуйте!

    А в «Комплексной автоматизации» работает? У меня почему-то не получается подключиться к архивной копии.

    Reply ↓
  19. Spacer

    (18) Nadegda_P, Теоретически должно работать. А почему не получается подключиться? Что пишет?

    Reply ↓
  20. eagle89

    Отличная обработка, большое спасибо автору!

    Reply ↓
  21. VBod

    В процессе поиска битых ссылок по всей конфигурации появляется сообщение об ошибке:

    Ошибка при вызове метода контекста (Выполнить): {(7, 9)}: Поле не найдено «Об.Валюта»

    ГДЕ Об.<<?>>Валюта ССЫЛКА Справочник.Валюты И ВЫРАЗИТЬ(Об.Валюта КАК Справочник.Валюты).Ссылка есть null И Об.Валюта <> Значение(Справочник.Валюты.ПустаяСсылка) ИнформацияОбОшибке

    Reply ↓
  22. Spacer
    LordTime пишет:

    В процессе поиска битых ссылок по всей конфигурации появляется сообщение об ошибке:

    Ошибка при вызове метода контекста (Выполнить): {(7, 9)}: Поле не найдено «Об.Валюта»

    ГДЕ Об.<<?>>Валюта ССЫЛКА Справочник.Валюты И ВЫРАЗИТЬ(Об.Валюта КАК Справочник.Валюты).Ссылка есть null И Об.Валюта <> Значение(Справочник.Валюты.ПустаяСсылка) ИнформацияОбОшибке

    Да, есть такое дело. Сам сталкивался. Только руки еще не дошли подправить.

    Может быть на выходные подправлю.

    Reply ↓
  23. Spacer
    LordTime пишет:

    В процессе поиска битых ссылок по всей конфигурации появляется сообщение об ошибке

    Ошибка исправлена. Обновил файлы обработки.

    Reply ↓
  24. camomile

    Спасибо! Отличная обработка.

    Reply ↓
  25. Sairys

    Битые ссылки это давно известная проблема, и тема знакома каждому программисту. Вещь интересная нужна наверно практически в любой базе, спасибо автору.

    Reply ↓
  26. Slach

    хорошая обработка, только у меня возникла ситуация, когда «некорректное удаление» было проведено несколько раз… пришлось последовательно брать НЕСКОЛЬКО бекапов…, с учетом того что база была на 80 гигов, занятие это было весьма не быстрым… но справился

    Reply ↓
  27. a4a

    Встала проблема: перенести остатки на начало прошлого года из Бухгалтерии 1.6 под 8.1 в 2.0 под 8.2, в которой уже ведется учет. Пытаюсь через Универсальный обмен в формате XML. Выгрузка не проходит — вылетают битые ссылки. Пытаюсь бороться через тестирование и исправление ИБ — не проходит, вылетает ошибка.

    Проблема новая для меня — тупик просто.Читаю описание — очень надеюсь на вашу обработку!

    Reply ↓
  28. a4a

    За идею плюс , конечно!

    Под 8.1 не сработала — жаль!

    Reply ↓
  29. vik77

    Вещь. Помогла. Плюс.

    У меня возникла небольшая ошибка с COMConnector. Помогла перерегистрация dll

    C:Program Files1cv828.2.13.202incomcntr.dll

    Reply ↓
  30. vishenka

    Хорошая обработочка, пригодилась в «трудную минуту»

    Reply ↓
  31. Victorman

    Создал образ подчинённой базы по плану обмена по Организациям. Получил много битых ссылок. Эта обработка очень помогла.

    Reply ↓
  32. v_id

    Спасибо что бесплатно, будем пробывать!

    Reply ↓
  33. belichenko66

    спасибо

    Reply ↓
  34. petrovaUL

    Плюс. Скачаю, попробую. Спасибо, пригодится.

    Reply ↓
  35. yegorZ

    Пригодилась в ЗУП, спасибо

    Reply ↓
  36. QWer666

    Качаю! Спасибо!

    Reply ↓
  37. Istur

    (0) Было бы хорошо еще проваливаться в объект-источник. Тем более для этого нужна только кнопка открытия в колонке.

    Reply ↓
  38. goodman12

    Спасибо 🙂 Сейчас скачаю, буду тестить.

    Reply ↓
  39. idemousi

    Вот то что именно сейчас и требуется

    Reply ↓
  40. tulaka

    очень удобно

    Reply ↓
  41. Jacky

    Спасибо, сначала находил «первоисточники» и вот нашел итоговую обработку.

    Очень выручила.

    Reply ↓
  42. alekckuc

    Спасибо, обработка очень нужная восстановил с помощью нее затертые дынные из архивной копии, вернул большой объем работы проделанный пользователями и случайно уничтоженный.

    Reply ↓
  43. materiy_boec

    Класс, как раз сегодня в обоих а точнее в четырех база: 2 пары риб бух и зуп, обноружил битые ссылки.

    Плюсую

    Reply ↓
  44. materiy_boec

    Очень важный для меня вопрос!

    Такие битые ссылки появляются еще в каких нибудь случаях?

    В случае с обменом РИБ они появляются только тогда когда в одной из баз выполняешь удаление объектов?

    Очень жду ответа, спасибо

    Reply ↓
  45. materiy_boec

    Подписался на ответы по этой теме

    Reply ↓
  46. Spacer

    (45) materiy_boec, да нет, вроде все случаи описаны.

    Ну, разве что еще физическая порча базы может быть причиной.

    Но в этом случае последствия будут уже сильнее чем просто битые ссылки.

    Что касается случая РИБ, то теоретически при полном обмене информацией между базами здесь проблем быть не должно, т.к. все базы имеют одинаковые данные и контроль ссылок перед непосредственным удалением объекта выдаст ошибку.

    Проблемы могут возникать только когда между базами осуществляется частичный обмен информацией.

    В результате может оказаться так что в одной базе объект удален корректно, а в другой на него имеются ссылки.

    Reply ↓
  47. materiy_boec

    (47) у меня полный обмен риб, и никто последние 2 недели не выполнял удаление помеченных объектов.

    Процедуру УдалитьОбъект(Объект, Истина). я поправил, поставил Ложь. Буду наблюдать.

    Reply ↓
  48. tireal

    Благодарю, обработка очень помогла, только после смены базы для подключения перестает давать выбор пользователя для подключения, соответственно и не подключается, но это мелочи.

    Reply ↓
  49. kostik_love

    спасибо, вот и мне пригодилась ваша обработка

    Reply ↓
  50. commo

    спасибо большое за обработку, я её недели 2 искал. очень помогает. однозначно +

    Reply ↓
  51. commo

    При выборе информационной базы появляется ошибка:

    {Форма.Форма.Форма(388)}:Ошибка при вызове конструктора (COMОбъекта): Не найден указанный модуль.: Не найден указанный модуль.

    Почему возникает данная ошибка? как её избежать?

    Reply ↓
  52. commo

    вылечил бяку сам, добавив новую компоненту «Приложения COM+»

    Reply ↓
  53. DikSer

    Просто мега штука! Спасибо автору!

    Reply ↓
  54. sherbv

    Отличная обработка 🙂

    Кстати никто не замечал — работает нормально только когда версии конфигураций копии и рабочей баз совпадают?

    У меня были ошибки разбора XML при восстановлении. Решилось обновлением копии.

    Reply ↓
  55. 1977

    Под ут11 Подойдет?

    Reply ↓
  56. Spacer

    (56) 1977, Должно подойти.

    Алгоритмы обработки универсальные и на конкретную конфигурацию не завязаны.

    Reply ↓
  57. 1977

    В Управляемых формах?

    Reply ↓
  58. Spacer

    (58) 1977, Нет, управляемых форм нет.

    Reply ↓
  59. pvlunegov

    Спасибо автору за обработку.

    Просьба пояснить, какой должна быть архивная копия базы?

    Подойдет файл «1cv8.1CD»?

    У меня в тестовой базе при запуске обработки возникло сообщение «Файл 1cv8.1CD поврежден!».

    После чего база автоматически закрылась.

    Пришлось из рабочей базы брать файл «1cv8.1CD» и заменять аналогичный файл тестовой базы.

    Попробую запустить вашу обработку, не обновляя конфигурацию в тестовой базе, может поможет.

    Reply ↓
  60. НатальяАлекс

    Спасибо! Скачала. Пока очень нравится… Все так замечательно начинается… Неужели…

    Reply ↓
  61. НатальяАлекс

    У меня выдает служебное сообщение: Ошибка при вызове метода контекста (Выполнить) ИнформацияОбОшибке

    много раз, но работать продолжает…

    Reply ↓
  62. Spacer

    (62) НатальяАлекс, А что еще сообщает об ошибке?

    Номер строки модуля и т.д.?

    Reply ↓
  63. madmpro

    Вот, сегодня беда. Приходится хоть что нибудь написать чтоб имел возможность скачать эту замечательную обработку. Спасибо автору за свой труд.

    Reply ↓
  64. НатальяАлекс

    (63) Я же написала, он продолжает работу… У меня нетиповая БП. Сильно нетиповая. В данный момент уже идет восстановление.

    Reply ↓
  65. НатальяАлекс

    -восстановление ссылок-

    Reply ↓
  66. НатальяАлекс

    При восстановлении выдает ошибку:

    {Форма.Форма.Форма(501)}: Ошибка при вызове метода контекста (ПрочитатьXML)

    ПолучОбъект = ПрочитатьXML(ЧтениеХМЛ);

    по причине:

    Ошибка преобразования данных XML: [12,20]

    Я просто снимаю галочку для восстановления, потом разберусь почему.

    Reply ↓
  67. NittenRenegade

    Не поддерживается платформой 8.2 и очень не хватает регистров бухгалтерии. В принципе, для себя докостылил, но за державу обидно.

    Reply ↓
  68. НатальяАлекс

    Почему не поддерживается? У меня все отлично работает. Регистры бухгалтерии, кстати, проверяются (причем они нетиповые). Зря Вы так… Все очень здорово.

    Reply ↓
  69. НатальяАлекс

    На 1С:Предприятие 8.2 (8.2.15.319).

    Reply ↓
  70. pnvnatali

    Спасибо, все просто и удобно.

    Reply ↓
  71. irishen

    21. LordTime (файл скачал) 10.11.11 14:35

    В процессе поиска битых ссылок по всей конфигурации появляется сообщение об ошибке:

    Ошибка при вызове метода контекста (Выполнить): {(7, 9)}: Поле не найдено «Об.Валюта»

    ГДЕ Об.<<?>>Валюта ССЫЛКА Справочник.Валюты И ВЫРАЗИТЬ(Об.Валюта КАК Справочник.Валюты).Ссылка есть null И Об.Валюта <> Значение(Справочник.Валюты.ПустаяСсылка) ИнформацияОбОшибке

    Тоже такая ошибка. Это из-за неподходящей конфигурации?

    Reply ↓
  72. Spacer

    (72) irishen, Да, возможно у вас какая-то не типовая конфигурация.

    Reply ↓
  73. Spacer

    (68) Niten, платформой 8.2 в режиме обычного приложения поддерживается.

    Может быть вы имели в виду управляемое приложение?

    Reply ↓
  74. Motor24

    Спасибо, попробую

    Reply ↓
  75. BoryaMbi

    Вопрос: можно ли с использование данной обработки восстановить объекты на основе других объектов из той же базы данных?

    Например: у меня был затерт пользователь, случайно. Хочу просто заменить его на другого пользователя из этой же базы данных.

    Эта функция была бы полезна в данной обработке. Как Вы считаете?

    Reply ↓
  76. BoryaMbi

    Получается, что данная обработка не ищет удаленных объектов в независимых реквизитах регистров сведений — полностью отсутствует код.

      Если ОбъектМетаданных.РежимЗаписи = НезависимыйРежимЗаписи Тогда
    //АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
    //АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Ресурсы, ИмяТаблицы);
    //АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
    Возврат;
    КонецЕсли;
    

    Хочу предложить Автору доработать данный код. Считаю, что необходимо предупреждать пользователей о данном ограничении.

    Reply ↓
  77. BoryaMbi

    Самостоятельно доработал эту обработку — теперь ищет в независимых регистрах сведений.

    Reply ↓
  78. Simon14

    {Форма.Форма(501)}: Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XML: [47,30]

    ПолучОбъект = ПрочитатьXML(ЧтениеХМЛ);

    по причине:

    Ошибка преобразования данных XML: [47,30]

    Выдало такую ошибку в чем может быть проблемма

    Reply ↓
  79. Spacer

    (79) Simon14, Ошибка происходит во время копирования удаленного объекта из резервной копии в основную базу.

    Вероятно конфигурации баз у вас чем-то отличаются.

    Reply ↓
  80. NatalyaVP

    Ошибка в обработке «тип не определен(Справочник)»

    Reply ↓
  81. Алексей87

    У меня данная обработка исправила справочники, но вот с документом проблема, ошибка:

    Ошибка при вызове метода контекста (ПолучитьОбъект)

    Если СсылкаНаОбъектГУИД.ПолучитьОбъект() <> Неопределено Тогда

    по причине:

    Произошла исключительная ситуация (1C:Enterprise 8.2.17.153): {Документ.Квитанция(480,30)}: Переменная не определена (глТекущийПользователь). Что то не пойму в чем причина, может кто подскажет?? База не типовая.

    Reply ↓
  82. Spacer

    (82) Алексей87, Ну в этом наверное и дело что база не типовая.

    В типовых конфигурациях есть глобальная переменная «глТекущийПользователь».

    Наверное в вашей конфигурации нет этой переменной.

    Посмотрите какой код у вас в модуле документа «Квитанция» в строке 480.

    Reply ↓
  83. Алексей87

    глобальная переменная есть такая, в строке 480:

    Перерасчет.Ответственный = глТекущийПользователь;

    Перерасчет это документ создаваемый при проведении квитанции.

    Reply ↓
  84. Алексей87

    (83)

    глобальная переменная есть такая, в строке 480:

    Перерасчет.Ответственный = глТекущийПользователь;

    Перерасчет это документ создаваемый при проведении квитанции.

    Reply ↓
  85. Алексей87

    Комментирую в модуле копии строки где встречается глТекущийПользователь и все норм))) в чем прикол не пойму

    Reply ↓
  86. TVA_11

    Архивная копия, выбираю рабочую, архивную базу на сервере.

    Требуется авторизация:

    Пользователи архивной копии не выбираются, набираю себя в ручную, ввожу пароль

    Идентификация пользователя не выполнена. Неправильное имя пользователя или пароль.

    ***

    В чем может быть ошибка?

    Reply ↓
  87. TVA_11

    Может имя пользователя надо писать хитро? Указывать имя сервера, БД?

    Reply ↓
  88. TVA_11

    Второй файл для 8.2 появился недавно?

    Когда скачивал был в выборе только 1. Есть смысл скачать повторно?

    Reply ↓
  89. Spacer

    (87) TVA_11, да. пользователи архивной копии не выбираются. т.к. подключение к архивной копии делается через

    com-соединение. Нужно вводить имя пользователя вручную.

    Если имя пользователя и пароль введены правильно, то авторизация должна проходить нормально.

    Reply ↓
  90. Spacer

    (88) TVA_11, нет, пользователь пишется точно так же как он выводится в списке выбора пользователей.

    Reply ↓
  91. Spacer

    (89) TVA_11, да нет, он уже давно есть.

    Там основное отличие в обработке выбора базы из списка.

    В 8.1 и в 8.2 информация о списке баз получается разными способами.

    Reply ↓
  92. TVA_11

    Проверю, как я мог пароль неправильно ввести!?

    Ответ: картинка ввода другая ).

    Reply ↓
  93. TVA_11

    Нет, пароль правильный и логин правильный.

    Придется вспомнить, что тоже программист, отпишусь.

    Буде что интересно.

    Reply ↓
  94. Tanis

    Спасибо! Отличная обработка! Очень спасла….

    Reply ↓
  95. rhtr

    Пример подключения к файловой базе file=’C:1CФУФЛО’; usr=’Администратор’; pwd=’111111′;

    Reply ↓
  96. alfaret

    обработка отличная!

    единственное, нет поиска битых ссылок в значениях субконто регистра бухгалтерии

    Reply ↓
  97. Andruykha

    +1, Отличная обработка. Для управляемых форм тоже сделайте, вдруг понадобиться.

    Reply ↓
  98. 1cnick8

    (48) materiy_boec,

    Процедуру УдалитьОбъект(Объект, Истина). я поправил, поставил Ложь. Буду наблюдать.

    Поделитесь результатами наблюдений. Постоянно при обмене в формате РИБ появляются битые ссылки <Объект не найден>

    Reply ↓
  99. Anyu-n

    (53) commo, а подскажите как ее подключить? У меня вываливается ошибка «Ошибка при вызове конструктора (СОМобъект,)… недопустимая строка с указанием класса…. помогите пожалуйста… поподробнее что делать нужно :'(

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *