Ситуация, когда после проведения штатной процедуры Тестирования и исправления (ТиИ) в информационной базе внезапно обнаруживаются записи с пометкой «Объект не найден», является довольно распространенной в практике администраторов и программистов 1С. Разберем подробно, почему это происходит, как найти «виновных» и, самое главное, какими способами можно вернуть утраченные данные.
Рассмотрим основные сценарии, при которых ссылки на объекты (например, на элементы справочника Номенклатура) превращаются в битые. Важно понимать, что само по себе ТиИ редко «убивает» живые данные — чаще оно лишь проявляет скрытые проблемы, которые уже существовали в базе.
Если клиент утверждает, что «раньше всё было хорошо», нам необходимо проверить это утверждение. Рассмотрим, как использовать Журнал регистрации (ЖР) для диагностики.
Битая ссылка в пользовательском интерфейсе выглядит как текстовая строка вида <Объект не найден> (84:bf0000155d05070311df90407a518063). Последняя часть в скобках — это GUID (уникальный идентификатор) удаленного объекта. Скопируем этот идентификатор и выполним поиск в Журнале регистрации. Если ЖР велся корректно, мы увидим события «Добавление» или «Изменение» для этого объекта. В колонке «Данные» или «Представление» часто сохраняется текстовое наименование объекта (например, «Клизма для программиста»), что позволит нам понять, что именно было удалено.
Если у нас есть актуальная архивная копия базы, сделанная до проведения ТиИ, мы можем восстановить объекты с сохранением их идентификаторов. Это критически важно: нам нужно не просто создать новую номенклатуру с тем же названием, а создать объект с тем же GUID, чтобы ссылки в документах «ожили».
Для этого лучше всего использовать типовую обработку «Выгрузка и загрузка данных XML» (ее можно найти на диске ИТС или в составе поставки «Конвертации данных»). Разберем алгоритм действий по шагам:
ВыгрузкаЗагрузкаДанныхXML.epf.Номенклатура) и настроим фильтр по тем элементам, которые стали битыми ссылками в рабочей базе.Поскольку обработка XML переносит объекты вместе с их внутренними идентификаторами, после загрузки битые ссылки автоматически заменятся на восстановленные объекты.
Если архивной копии нет, но нам нужно хотя бы вернуть базе работоспособность и понимание структуры, можно запустить Тестирование и исправление с другими настройками. Рассмотрим режим «При наличии ссылок на несуществующие объекты — Создавать объекты».
В этом случае система создаст в справочнике пустые элементы. Они будут называться так же, как идентификаторы (или иметь пометку «Объект создан при проверке целостности»). После этого нам придется вручную или программно заполнить их реквизиты, ориентируясь на данные из Журнала регистрации или бумажных носителей. Посмотрим, как это выглядит на практике: ссылки перестанут быть «битыми», в документах появится ссылка на конкретный (хоть и пустой) элемент, что позволит проводить эти документы и формировать отчеты.
Для автоматизации поиска всех битых ссылок в базе программист может использовать встроенный язык 1С. Рассмотрим пример логики поиска «битых» значений в конкретной таблице:
// Пример логики поиска битых ссылок в справочнике Номенклатура
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ЕСТЬ NULL";
// Это один из признаков битой ссылки в запросе
Однако более универсальным методом является использование функции ПолучитьОбъект(). Проанализируем следующий подход: если Ссылка.ПолучитьОбъект() возвращает Неопределено, при этом сама ссылка не является Пустая(), то перед нами классическая битая ссылка («объект не найден»).
Чтобы избежать подобных ситуаций в будущем, придерживаемся строгих правил профилактики:
Таким образом, появление битых ссылок после ТиИ — это сигнал о том, что в базе нарушена логическая целостность, которая копилась долгое время. Использование инструментов выгрузки-загрузки XML и внимательный анализ Журнала регистрации позволяют восстановить данные даже в самых сложных случаях.