Как избавиться от битых ссылок «Объект не найден» в отчетах после свертки базы в 1С?

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

После проведения процедуры свертки информационной базы и последующего удаления помеченных объектов пользователи часто сталкиваются с неприятной ситуацией: стандартные отчеты (например, «Ведомость по денежным средствам» или «Ведомость по товарам на складах») показывают начальные остатки с битыми ссылками вида <Объект не найден> [GUID]. При этом в самих документах ввода начальных остатков такие строки отсутствуют, а стандартное тестирование и исправление базы данных не всегда находит ошибки ссылочной целостности.

Разберем причины возникновения этой проблемы и рассмотрим пошаговые методы ее гарантированного устранения.

Почему возникают фантомные остатки и битые ссылки

Для понимания природы ошибки проанализируем, как платформа 1С хранит данные регистров накопления остатков. Физически в СУБД для каждого регистра остатков создаются минимум две таблицы:

  1. Таблица движений — хранит детальные записи (приход/расход) с привязкой к документам-регистраторам.
  2. Таблица итогов — хранит предварительно рассчитанные агрегированные остатки на определенные моменты времени (обычно на начало каждого месяца) в разрезе измерений.

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

Диагностика зависших записей через консоль запросов

Если мы попытаемся выполнить запрос к физической таблице регистра накопления с условием отбора пустых ссылок, запрос вернет пустой результат. Чтобы обнаружить реальные фантомные остатки, обратимся к виртуальной таблице Остатки с помощью левого соединения:


ВЫБРАТЬ
    Остатки.Касса КАК Касса,
    Остатки.СуммаОстаток КАК СуммаОстаток
ИЗ
    РегистрНакопления.ДенежныеСредстваНаличные.Остатки(&Период, ) КАК Остатки
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Кассы КАК СпрКассы
    ПО Остатки.Касса = СпрКассы.Ссылка
ГДЕ
    СпрКассы.Ссылка ЕСТЬ NULL

Такой запрос точно покажет, по каким именно удаленным элементам справочника в таблице итогов регистра все еще числятся ненулевые суммы.

Способ 1. Сдвиг периода итогов и пересчет

Самый быстрый способ сбросить неактуальные агрегаты — принудительно изменить границу рассчитанных итогов регистра:

  1. Откроем форму «Управление итогами» (в интерфейсе администрирования или через функции для технического специалиста).
  2. Установим период рассчитанных итогов по проблемному регистру на несколько лет назад (на дату до момента свертки базы).
  3. Выполним пересчет итогов.
  4. Вернем дату расчета итогов на текущий момент и повторно запустим пересчет.

При смещении периода назад платформа отсекает и перезаписывает агрегированные данные, полностью удаляя фантомные записи.

Способ 2. Программный сброс и полный пересчет итогов

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


// Отключаем использование итогов (таблица итогов физически очищается в СУБД)
РегистрыНакопления.ДенежныеСредстваНаличные.УстановитьИспользованиеИтогов(Ложь);

// Включаем использование итогов обратно (таблица формируется заново строго по движениям)
РегистрыНакопления.ДенежныеСредстваНаличные.УстановитьИспользованиеИтогов(Истина);

// Выполняем полный пересчет итогов
РегистрыНакопления.ДенежныеСредстваНаличные.ПолныйПересчетИтогов();

Этот метод гарантированно перестраивает таблицу агрегатов с нуля, исключая любые несоответствия между реальными движениями и остатками.

Способ 3. Пересчет итогов через тестирование и исправление

Для комплексного решения проблемы по всей информационной базе используем стандартный механизм конфигуратора:

  1. Создадим резервную копию информационной базы.
  2. Запустим конфигуратор в монопольном режиме.
  3. Перейдем в меню Администрирование — Тестирование и исправление...
  4. Установим флажки «Пересчет итогов» и «Реиндексация таблиц информационной базы».
  5. Нажмем «Выполнить» и дождемся завершения операции.

Способ 4. Выгрузка и загрузка информационной базы (.dt)

В случаях, когда повреждены внутренние служебные таблицы или включено разделение итогов, помогает перезагрузка данных через файл выгрузки. При загрузке файла .dt платформа полностью воссоздает структуры СУБД и пересчитывает итоги всех регистров исключительно на основе актуальных документов и движений.

Способ 5. Восстановление объекта по GUID (если касса удалена ошибочно)

Если в процессе анализа выяснилось, что остаток реален, а объект справочника был удален по ошибке, восстановим его с сохранением прежнего уникального идентификатора:


// Извлекаем GUID из представления битой ссылки "<Объект не найден> (849daec3-...)"
УИД = Новый УникальныйИдентификатор("849daec3-1234-5678-9abc-def012345678");
СсылкаНаКассу = Справочники.Кассы.ПолучитьСсылку(УИД);

НоваяКасса = Справочники.Кассы.СоздатьЭлемент();
НоваяКасса.УстановитьСсылкуНового(СсылкаНаКассу);
НоваяКасса.Наименование = "Восстановленная касса";
НоваяКасса.Записать();

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

← На главную