Как восстановить битые ссылки на регистратор в 1С по ГУИД?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Налоговый учет
← На главную

Ситуация, когда в регистрах накопления вместо ссылки на документ отображается надпись «Объект не обнаружен...», является критической для учета. Это означает, что в таблице базы данных идентификатор (GUID) присутствует, но система не может сопоставить его ни с одним существующим объектом метаданных. Чаще всего это происходит из-за аварийного завершения работы базы (отключение света), некорректного обновления конфигурации или физического удаления документов. Разберем подробно, как восстановить такие ссылки и вернуть базу в рабочее состояние.

Анализ структуры «битой» ссылки

Прежде чем приступать к восстановлению, нам необходимо проанализировать природу битой ссылки. В 1С:Предприятии ссылка (Ref) состоит из двух частей: Идентификатора типа объекта (Metadata ID) и Уникального идентификатора (UUID). Рассмотрим пример из практики: {"#",b66fce8c-a030-4906-89c6-db40d78acdd7,548:00000000000000000000000000000000}.

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

Способ 1: Программное восстановление через УстановитьСсылкуНового()

Если мы точно знаем, какой тип документа должен быть на месте битой ссылки (например, РеализацияТоваровУслуг), мы можем создать пустой документ и «подставить» ему тот самый ГУИД, который сохранился в регистре. Рассмотрим программный метод восстановления:


&НаСервере
Процедура ВосстановитьДокументПоГУИД(БитыйРегистратор, ТипДокументаСтрокой)
    
    // Получаем уникальный идентификатор из битой ссылки
    НужныйГУИД = БитыйРегистратор.УникальныйИдентификатор();
    
    // Создаем новый объект нужного типа
    // Например, "РеализацияТоваровУслуг"
    НовДок = Документы[ТипДокументаСтрокой].СоздатьДокумент();
    
    // Самый важный шаг: назначаем новому объекту ГУИД битой ссылки
    НовДок.УстановитьСсылкуНового(Документы[ТипДокументаСтрокой].ПолучитьСсылку(НужныйГУИД));
    
    // Заполняем минимально необходимые данные, чтобы документ можно было провести
    НовДок.Дата = ТекущаяДата();
    НовДок.Организация = Справочники.Организации.ПустаяСсылка(); // Нужно заполнить реальными данными
    
    Попытка
        НовДок.Записать(РежимЗаписиДокумента.Запись);
        Сообщить("Объект успешно восстановлен с ГУИД: " + НужныйГУИД);
    Исключение
        Сообщить("Не удалось записать документ: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Этот код создает «болванку» документа. После его выполнения надпись «Объект не обнаружен» исчезнет, а на ее месте появится ссылка на пустой документ. Далее пользователю или программисту останется заполнить его реквизиты (сумму, контрагента, дату), основываясь на данных, которые сохранились в самих записях регистра накопления.

Способ 2: Использование Тестирования и Исправления (ТиИ)

Если битых ссылок много и они относятся к разным типам объектов, ручное создание через УстановитьСсылкуНового() может быть трудоемким. Проанализируем возможности стандартного механизма 1С.

Запустим информационную базу в режиме Конфигуратора и выберем пункт Администрирование — Тестирование и исправление. Для восстановления объектов нам важны следующие настройки:

  1. Установим флаг «Проверка ссылочной целостности».
  2. В поле «При наличии ссылок на несуществующие объекты» выберем вариант «Создавать объекты».
  3. В поле «При частичной потере данных объектов» выберем «Создавать объекты».

Важный нюанс: Система автоматически создаст пустые документы во всех местах, где были битые ссылки. Эти документы будут иметь правильные ГУИДы, и записи в регистрах снова станут корректными. Однако эти объекты будут абсолютно пустыми (без сумм и дат). После завершения ТиИ их можно найти обработкой Поиск и замена значений или обычным списком и дозаполнить данными.

Способ 3: Поиск данных для заполнения в Журнале регистрации

Когда ссылка восстановлена, перед нами встает вопрос: какими данными заполнить документ? Выясним причину потери данных. Если объект был удален физически, мы можем попытаться найти информацию о нем в Журнале регистрации. Рассмотрим порядок действий:

Способ 4: Определение типа объекта по номеру таблицы (TypeID)

Бывают случаи, когда мы видим код (например, 333), но не понимаем, какому документу он соответствовал. Проанализируем ситуацию через SQL-запрос или программный метод. В базе данных 1С существует системная таблица DBSchema, где хранится соответствие кодов типам метаданных. Программист может воспользоваться методом ПолучитьИмяТаблицыПоНомеру (в некоторых конфигурациях) или просто перебрать метаданные, сравнивая их внутренний идентификатор.

Если вы столкнулись с кодом, который отсутствует в текущей конфигурации, это явный признак того, что после обновления объект был либо удален из метаданных, либо перемещен в «Удаленные» (префикс Удалить...). В этом случае создание нового объекта через Документы.РеализацияТоваровУслуг.СоздатьДокумент() не поможет, так как система ожидает другой тип метаданных.

Выводы и рекомендации

Восстановление битых ссылок — процесс кропотливый. Мы рекомендуем придерживаться следующего алгоритма:

  1. Сделать резервную копию базы перед любыми манипуляциями.
  2. Проверить состав регистраторов регистра в конфигураторе — возможно, ссылка «битая» только визуально из-за ограничений метаданных.
  3. Если объектов мало, использовать метод УстановитьСсылкуНового().
  4. Если объектов много — запустить Тестирование и исправление с режимом создания объектов.
  5. Заполнить данные восстановленных объектов, используя Журнал регистрации или данные из записей самого регистра (сумма, период, организация обычно сохраняются в измерениях и ресурсах регистра).

Для предотвращения подобных ситуаций в будущем крайне важно обеспечить сервер 1С надежным источником бесперебойного питания (ИБП) и настроить регулярное резервное копирование. При работе с несколькими базами этот процесс и профилактическую проверку целостности удобнее автоматизировать через программу для пакетного архивирования и тестирования 1С по расписанию.

← На главную