Почему в 1С появляется «Объект не найден» и как восстановить битые ссылки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе сопровождения баз данных 1С специалисты нередко сталкиваются с ситуацией, когда в реквизитах документов или отчетах вместо наименования элемента отображается надпись вида <Объект не найден> (8:bed494de80b92fae11e43cf8abea2cda). При этом визуально в справочнике нужная позиция может присутствовать, а попытка сопоставить идентификатор с архивной копией иногда приводит к совершенно неожиданным результатам. Разберем по шагам, почему возникает эта проблема, как устроена внутренняя ссылка платформы и как восстановить ссылочную целостность информационной базы.

Анатомия битой ссылки: почему поиск по архиву дает не тот объект

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

  1. Числовой префикс перед двоеточием (в нашем примере 8:) — внутренний идентификатор таблицы метаданных в конкретной информационной базе. В разных базах (например, в рабочей и тестовой) этот номер может отличаться, если структура конфигурации накатывалась независимо.
  2. Шестнадцатеричная последовательность после двоеточия — это внутреннее шестнадцатеричное представление уникального идентификатора объекта (GUID).

Важно понимать особенность платформы 1С: при хранении данных в таблицах СУБД используется специфический порядок байтов с внутренней перестановкой групп в UUID. Если взять шестнадцатеричную строку непосредственно из текста битой ссылки и передать ее в конструктор объекта УникальныйИдентификатор без учета обратного преобразования порядка байтов, платформа сформирует искаженный идентификатор. Именно поэтому при поиске в архивной базе по «сырому» коду программист находит совершенно другой, посторонний элемент либо не находит ничего.

Основные причины появления битых ссылок

Выясним причину, из-за которой элемент теряет связь с базой данных:

  1. Непосредственное интерактивное удаление: пользователь, обладающий соответствующими правами, нажимает комбинацию Shift + Delete или выбирает команду непосредственного удаления в списке. В этом случае платформа удаляет запись из таблицы без проверки ссылочной целостности.
  2. Использование внешних обработок: пользователи или администраторы могут запускать универсальные обработки очистки данных или сторонние механизмы, выполняющие программное удаление.
  3. Программный вызов метода Удалить(): если в доработках конфигурации вместо установки пометки на удаление вызван метод Объект.Удалить(), запись физически уничтожается мгновенно, оставляя во всех связанных документах «хвосты».
  4. Ошибки при объединении дублей: аварийное завершение типовой обработки поиска и удаления дублирующихся элементов способно оставить базу в рассинхронизированном состоянии, когда старая ссылка удалена, а замена на новую ссылку произошла лишь частично.
  5. Сбои кэша и динамического обновления: регулярное применение механизма динамического обновления базы данных («демонобновление») приводит к разрушению соответствия таблиц метаданных и физических таблиц СУБД.

Способ 1. Восстановление элемента с исходным GUID

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

Рассмотрим пример кода на встроенном языке:


ИмяСправочника = "Номенклатура";
СтрGUID = "bed494de-80b9-2fae-11e4-3cf8abea2cda";

Идентификатор = Новый УникальныйИдентификатор(СтрGUID);
НоваяСсылка = Справочники[ИмяСправочника].ПолучитьСсылку(Идентификатор);

НовыйОбъект = Справочники[ИмяСправочника].СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Наименование = "Восстановленный элемент";
НовыйОбъект.Записать();

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

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

Если нужный элемент уже существует в справочнике под другим идентификатором, правильнее перенаправить все места использования с «битой» ссылки на правильную. Посмотрим, как это реализовать:

  1. Получим ссылку на удаленный объект через конструктор УникальныйИдентификатор и функцию ПолучитьСсылку().
  2. Найдем все объекты, где эта ссылка встречается, с помощью функции НайтиПоСсылкам().
  3. В цикле заменим старое значение на новое, выполняя запись с установкой флага ОбменДанными.Загрузка = Истина, чтобы обойти лишние проверки проведения и не нарушать границы запрета редактирования.

Посмотрим на пример обработки:


МассивСсылок = Новый Массив;
ИдентификаторБитый = Новый УникальныйИдентификатор("bed494de-80b9-2fae-11e4-3cf8abea2cda");
БитаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИдентификаторБитый);
МассивСсылок.Добавить(БитаяСсылка);

ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
ПравильнаяСсылка = Справочники.Номенклатура.НайтиПоКоду("000000001");

Для Каждого Стр Из ТаблицаСсылок Цикл
    ОбъектМетаданных = Стр.Метаданные;
    СсылкаНаОбъект = Стр.Данные;
    
    // Получаем объект для редактирования
    Попытка
        ОбъектДляИзменения = СсылкаНаОбъект.ПолучитьОбъект();
        ОбъектДляИзменения.ОбменДанными.Загрузка = Истина;
        
        // Заменяем ссылку в реквизите или строке табличной части
        // в зависимости от данных из ТаблицаСсылок
        ОбъектДляИзменения.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ЗаменаСсылок", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

Способ 3. Использование механизма «Тестирование и исправление»

Когда повреждений много, эффективным решением выступает штатный инструмент конфигуратора. Разберем порядок действий:

  1. Создаем резервную копию базы данных в обязательном порядке.
  2. Открываем конфигуратор и переходим в пункт меню Администрирование — Тестирование и исправление...
  3. Устанавливаем флаг Проверка ссылочной целостности информационной базы.
  4. В блоке переключателей При наличии ссылок на несуществующие объекты выбираем одну из стратегий:
    • Создавать объекты: платформа автоматически создаст пустые элементы справочников в соответствующих таблицах. В дальнейшем их можно найти, переименовать или объединить через поиск дублей.
    • Очищать ссылки: платформа заменяет поврежденные значения на пустые ссылки или значение Неопределено. Этот вариант удобен, если данные потеряли актуальность.

Как предотвратить повторение проблемы

Чтобы исключить появление надписей <Объект не найден> в будущем, применим административные и организационные меры:

  1. Отключение прав на непосредственное удаление: проверим роли пользователей. У всех пользовательских ролей должно быть отключено право Интерактивное удаление и Интерактивное удаление помеченных. Пользователь должен иметь возможность только выставить пометку на удаление.
  2. Контроль внешних обработок: ограничим запуск сторонних обработок и доступ к функциям прямого удаления объектов мимо стандартной процедуры контроля ссылочной целостности.
  3. Отказ от динамических обновлений: применим правило обновлять рабочую базу исключительно в монопольном режиме с перезапуском рабочих процессов сервера 1С.
← На главную