Ситуация, когда в регистрах накопления вместо ссылки на документ отображается надпись «Объект не обнаружен...», является критической для учета. Это означает, что в таблице базы данных идентификатор (GUID) присутствует, но система не может сопоставить его ни с одним существующим объектом метаданных. Чаще всего это происходит из-за аварийного завершения работы базы (отключение света), некорректного обновления конфигурации или физического удаления документов. Разберем подробно, как восстановить такие ссылки и вернуть базу в рабочее состояние.
Прежде чем приступать к восстановлению, нам необходимо проанализировать природу битой ссылки. В 1С:Предприятии ссылка (Ref) состоит из двух частей: Идентификатора типа объекта (Metadata ID) и Уникального идентификатора (UUID). Рассмотрим пример из практики: {"#",b66fce8c-a030-4906-89c6-db40d78acdd7,548:00000000000000000000000000000000}.
Здесь 548 — это внутренний числовой код таблицы в конкретной базе данных. Если после обновления конфигурации состав регистраторов у регистра накопления изменился, 1С может «забыть», что документ с этим кодом имел право делать записи в этот регистр. Проанализируем ситуацию: если код типа объекта виден в ссылке, но объект не открывается, первым делом стоит проверить состав регистраторов в Конфигураторе. Если нужный тип документа был исключен из списка регистраторов, достаточно вернуть его обратно, и ссылки «оживут» без написания кода.
Если мы точно знаем, какой тип документа должен быть на месте битой ссылки (например, РеализацияТоваровУслуг), мы можем создать пустой документ и «подставить» ему тот самый ГУИД, который сохранился в регистре. Рассмотрим программный метод восстановления:
&НаСервере
Процедура ВосстановитьДокументПоГУИД(БитыйРегистратор, ТипДокументаСтрокой)
// Получаем уникальный идентификатор из битой ссылки
НужныйГУИД = БитыйРегистратор.УникальныйИдентификатор();
// Создаем новый объект нужного типа
// Например, "РеализацияТоваровУслуг"
НовДок = Документы[ТипДокументаСтрокой].СоздатьДокумент();
// Самый важный шаг: назначаем новому объекту ГУИД битой ссылки
НовДок.УстановитьСсылкуНового(Документы[ТипДокументаСтрокой].ПолучитьСсылку(НужныйГУИД));
// Заполняем минимально необходимые данные, чтобы документ можно было провести
НовДок.Дата = ТекущаяДата();
НовДок.Организация = Справочники.Организации.ПустаяСсылка(); // Нужно заполнить реальными данными
Попытка
НовДок.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Объект успешно восстановлен с ГУИД: " + НужныйГУИД);
Исключение
Сообщить("Не удалось записать документ: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот код создает «болванку» документа. После его выполнения надпись «Объект не обнаружен» исчезнет, а на ее месте появится ссылка на пустой документ. Далее пользователю или программисту останется заполнить его реквизиты (сумму, контрагента, дату), основываясь на данных, которые сохранились в самих записях регистра накопления.
Если битых ссылок много и они относятся к разным типам объектов, ручное создание через УстановитьСсылкуНового() может быть трудоемким. Проанализируем возможности стандартного механизма 1С.
Запустим информационную базу в режиме Конфигуратора и выберем пункт Администрирование — Тестирование и исправление. Для восстановления объектов нам важны следующие настройки:
Важный нюанс: Система автоматически создаст пустые документы во всех местах, где были битые ссылки. Эти документы будут иметь правильные ГУИДы, и записи в регистрах снова станут корректными. Однако эти объекты будут абсолютно пустыми (без сумм и дат). После завершения ТиИ их можно найти обработкой Поиск и замена значений или обычным списком и дозаполнить данными.
Когда ссылка восстановлена, перед нами встает вопрос: какими данными заполнить документ? Выясним причину потери данных. Если объект был удален физически, мы можем попытаться найти информацию о нем в Журнале регистрации. Рассмотрим порядок действий:
Данные.Проведение или Данные.Изменение. Часто в теле сообщения журнала фиксируются основные реквизиты: номер документа, дата, сумма и контрагент.Бывают случаи, когда мы видим код (например, 333), но не понимаем, какому документу он соответствовал. Проанализируем ситуацию через SQL-запрос или программный метод. В базе данных 1С существует системная таблица DBSchema, где хранится соответствие кодов типам метаданных. Программист может воспользоваться методом ПолучитьИмяТаблицыПоНомеру (в некоторых конфигурациях) или просто перебрать метаданные, сравнивая их внутренний идентификатор.
Если вы столкнулись с кодом, который отсутствует в текущей конфигурации, это явный признак того, что после обновления объект был либо удален из метаданных, либо перемещен в «Удаленные» (префикс Удалить...). В этом случае создание нового объекта через Документы.РеализацияТоваровУслуг.СоздатьДокумент() не поможет, так как система ожидает другой тип метаданных.
Восстановление битых ссылок — процесс кропотливый. Мы рекомендуем придерживаться следующего алгоритма:
УстановитьСсылкуНового().Для предотвращения подобных ситуаций в будущем крайне важно обеспечить сервер 1С надежным источником бесперебойного питания (ИБП) и настроить регулярное резервное копирование. При работе с несколькими базами этот процесс и профилактическую проверку целостности удобнее автоматизировать через программу для пакетного архивирования и тестирования 1С по расписанию.