1C. Поиск «Объект не найден» в регистре и удаление
Иногда в ИБ можно встретить ссылки на объекты <Объект не найден> (75:a353ac9e17b7bc7111e60238e0dc59c6), это ссылки на удаленные объекты. Получаются такие ссылки в ходе сбоев ИБ, РИБ(Распределенных Информационных Баз) или других механизмов создающих ссылки не записанных объектов(разбирал здесь).
В любом случае — это не есть хорошо, будем исправлять! Разберем пример поиска таких ссылок в регистре сведений «Данные для обработки» некой конфигурации, регистр имеет одно измерение «Номенклатура«, тип Справочник.Номенклатура.
В рамках задачи необходимо удалить записи регистра с битыми ссылками, в статье не будет разбираться тестирование и исправление ИБ, или другое восстановление ссылок.
Поиск ссылок <Объект не найден>
Сама ссылка считается валидной, а вот если обратиться к ее реквизиту в запросе, то получим NULL. Из этого пишем запрос получающий наименование из ссылки в измерении «номенклатура» регистра сведений «Данные для обработки» и отбираем записи у которых значение запрашиваемого реквизита равно NULL. Если измерений по которым необходимо производить поиск больше одного, то объединяем условия через ИЛИ.
А для удаления таких записей просто создадим наборы записей указав отборы и запишем.
После выполнения данного кода из регистра сведений будут удалены все записи со ссылками <Объект не найден>.
Как исправить ошибку — объект на найден в 1С
В статье рассмотрим вопрос как исправляются те ситуации в программе, когда можно увидеть ошибку Объект на найден. Рассмотрим на примере конфигурации 1С:Бухгалтерия 3., но материал также будет актуален и для других программных продуктов фирмы 1С. Как показывает практика , ошибка, объект не найден в 1С не редкость и можеи возникать вследствие, к примеру, повреждения информационной базы или удаления объектов информационной базы и пр. Перед выполнением всех действий рекомендуется сделать архивную копию информационной базы.
Для начала приведем пример как может выглядеть данная ошибка в 1С. Как видим вместо номенклатуры в строке табличной части присутствует “объект на найден”.
Также ошибку Объект не найден в 1С можно увидеть в каком-либо сформированном отчете, в котором будем выведен список документов-регистраторов. Вместо конкретного документа может строка с “объект не найден”. При этом по данному документу может отображаться сумма в отчете.
Какие возможны пути решения во втором случае с документом. Можно попробовать произвести тестирование и исправление. Для этого открываем информационную базу в режиме конфигуратора и далее раскрываем раздел “Администрирование”. После этого выбираем пункт “Тестирование и исправление”.
Далее программа предложит перед выполнением сделать резервную копию. Лучше воспользоваться данной рекомендацией. В окне устанавливаем следующие галочки и нажимаем “Выполнить”.
По завершении в окне внизу появится сообщение о том, что тестирование завершено. И можно проверить результат в информационной базе.
В том случае если имело место удаление без пометки на удаление и контроля ссылочной цельности, то восстановить удаленный объект в этой базе уже нельзя. Для решения проблемы, при наличии свежей резервной копии можно восстановить ее и работать в ней.
Если мы знаем какой объект был удален, то можно прибегнуть к помощи обработки “Выгрузка и загрузка данных XML”. Найти ее можно на просторах интернета или скачать с сайта ИТС. Битые ссылки заменятся нужным объектом из развернутой копии. В нашем примере в документа была удалена номенклатура конфеты “Белочка”.
Открываем обработку в архивной копии и нас будет интересовать закладка “Выгрузка”. Далее переходим на закладку “Дополнительные объекты для выгрузки”. Добавляем интересующую нас номенклатуру в табличную часть и ниже указываем путь, куда будет сохранен выгружаемый xml файл. После чего нажимаем “Выгрузить”.
Далее открываем данную обработку в той базе, где объект не найден и переходим на закладку “Загрузка”. Выбираем наш сохраненный файл выгрузки и нажимаем “Загрузить данные”.
После загрузки проверяем наш документ и видим вместо объект не найдем стоит нужная номенклатура “Белочка”.
Поиск и восстановление битых ссылок (объект не найден)
Битые ссылки появляются в базе как правило после непосредственного удаления объектов (без контроля ссылок на них).
Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом:
Такие ссылки могут возникать:
1. В результате действий пользователей имеющих право непосредственного удаления объектов, без пометки на удаление и контроля ссылочной целостности перед удалением. Поэтому такие права у пользователей желательно забрать;
2. При выполнении обработки некорректно удаляющей объекты;
3. При выполнении обмена между информационными базами в варианте РИБ или обмен по правилам обмена между отличающимися базами.
Бывает так, что пользователь в одной базе участвующей в обмене, вполне корректно удалил объект т.к. ссылок на него в этой базе не было. Информация об удалении объекта передается в другую базу, где на него есть ссылки. В типовых конфигурациях объект при этом удаляется непосредственно, и возникают «битые» ссылки. Как пример — процедура УдалитьОбъектПоСсылке() в модуле обработки ОбменДаннымиXML. В конце этой процедуры вызывается процедура УдалитьОбъект(Объект, Истина). Вторым параметром в этой процедуре является признак непосредственного удаления объекта. Необходимо заменить его на Ложь;
Битые ссылки можно обнаружить при выполнении тестирования и исправления, включив опцию «Проверка ссылочной целостности информационной базы». А также их можно увидеть при работе с базой в режиме 1С:Предприятие, открыв форму объекта содержащего в одном из реквизитов «битую» ссылку.
Как с этим бороться?. Ну во первых ограничить права пользователей на непосредственное удаление объектов и поправить проблемные участки кода в конфигурации создающие предпосылки для возникновения таких ссылок. А также не забывать делать архивные копии базы.
Эти записи, конечно, можно исправить при тестировании, поставив опцию «Создавать объекты» или «Очищать ссылки». В таком случае мы избавимся от битых ссылок, но это не поможет нам восстановить исходное состояние базы. Тогда из учета окончательно потеряются изменения, внесенные этими объектами, а это опасно.
Если имеется достаточно свежая архивная копия базы, то можно попробовать восстановить эти ссылки.
Для этих целей в интернете можно найти достаточно много обработок.
Например вот эта: http://help1c.com/faq/view/1128.html «Поиск в базе битых ссылок — «объект не найден», которая позволяет найти битые ссылки в режиме 1С:Предприятия, без запуска конфигуратора 1С и выполнения «тестирования и справления».
Найти удаленный объект в архивной копии базы можно при помощи этой обработки: //infostart.ru/public/14655/
Однако, заниматься этим вручную — это утомительная и малопроизводительная трата времени. Гораздо эффективнее поручить эту работу самой же 1С.
На Инфостарте уже публиковались обработки позволяющие сделать это автоматически.
И хотя цели у моей и этой обработки одинаковые — восстановление «битых» ссылок по архивной копии, подход к решению этих целей у нас разный.
Основное отличие моей обработки состоит в следующем:
Не используется протокол тестирования полученный в конфигураторе. Битые ссылки ищутся непосредственно в режиме 1С:Предприятия. При этом можно ограничивать поиск определенным типом объектов, например искать только ссылки с типом «Справочник.ДоговорыКонтрагентов».
Для удобства подключения к архивной копии базы использована обработка //infostart.ru/public/16628/ которая позволяет выбирать нужную базу из списка аналогичного списку баз 1С и подключаться к ней.
Несмотря на наличие подобных обработок на Инфостарте, возможно эта покажется кому-то более удобной в использовании.
Вовремя сделанная архивная копия может избавить вас от многих проблем. Удачи!