После проведения процедуры свертки информационной базы и последующего удаления помеченных объектов пользователи часто сталкиваются с неприятной ситуацией: стандартные отчеты (например, «Ведомость по денежным средствам» или «Ведомость по товарам на складах») показывают начальные остатки с битыми ссылками вида <Объект не найден> [GUID]. При этом в самих документах ввода начальных остатков такие строки отсутствуют, а стандартное тестирование и исправление базы данных не всегда находит ошибки ссылочной целостности.
Разберем причины возникновения этой проблемы и рассмотрим пошаговые методы ее гарантированного устранения.
Для понимания природы ошибки проанализируем, как платформа 1С хранит данные регистров накопления остатков. Физически в СУБД для каждого регистра остатков создаются минимум две таблицы:
Когда выполняется свертка базы, обработка очищает старые документы и удаляет записи из таблицы движений. Если после этого объекты аналитики (например, кассы, склады или контрагенты) удаляются из базы, а итоги по регистру не были корректно очищены, в таблице итогов остаются «зависшие» агрегаты. При формировании отчетов система обращается к виртуальной таблице остатков, которая считывает данные напрямую из таблицы итогов. В результате мы видим остаток по несуществующему объекту, хотя в физической таблице движений никаких записей уже нет.
Если мы попытаемся выполнить запрос к физической таблице регистра накопления с условием отбора пустых ссылок, запрос вернет пустой результат. Чтобы обнаружить реальные фантомные остатки, обратимся к виртуальной таблице Остатки с помощью левого соединения:
ВЫБРАТЬ
Остатки.Касса КАК Касса,
Остатки.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрНакопления.ДенежныеСредстваНаличные.Остатки(&Период, ) КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Кассы КАК СпрКассы
ПО Остатки.Касса = СпрКассы.Ссылка
ГДЕ
СпрКассы.Ссылка ЕСТЬ NULL
Такой запрос точно покажет, по каким именно удаленным элементам справочника в таблице итогов регистра все еще числятся ненулевые суммы.
Самый быстрый способ сбросить неактуальные агрегаты — принудительно изменить границу рассчитанных итогов регистра:
При смещении периода назад платформа отсекает и перезаписывает агрегированные данные, полностью удаляя фантомные записи.
Если через пользовательский интерфейс кнопка пересчета недоступна или регистр не очищается, применим программный сброс таблицы итогов. Для этого во внешней обработке выполним следующий код:
// Отключаем использование итогов (таблица итогов физически очищается в СУБД)
РегистрыНакопления.ДенежныеСредстваНаличные.УстановитьИспользованиеИтогов(Ложь);
// Включаем использование итогов обратно (таблица формируется заново строго по движениям)
РегистрыНакопления.ДенежныеСредстваНаличные.УстановитьИспользованиеИтогов(Истина);
// Выполняем полный пересчет итогов
РегистрыНакопления.ДенежныеСредстваНаличные.ПолныйПересчетИтогов();
Этот метод гарантированно перестраивает таблицу агрегатов с нуля, исключая любые несоответствия между реальными движениями и остатками.
Для комплексного решения проблемы по всей информационной базе используем стандартный механизм конфигуратора:
В случаях, когда повреждены внутренние служебные таблицы или включено разделение итогов, помогает перезагрузка данных через файл выгрузки. При загрузке файла .dt платформа полностью воссоздает структуры СУБД и пересчитывает итоги всех регистров исключительно на основе актуальных документов и движений.
Если в процессе анализа выяснилось, что остаток реален, а объект справочника был удален по ошибке, восстановим его с сохранением прежнего уникального идентификатора:
// Извлекаем GUID из представления битой ссылки "<Объект не найден> (849daec3-...)"
УИД = Новый УникальныйИдентификатор("849daec3-1234-5678-9abc-def012345678");
СсылкаНаКассу = Справочники.Кассы.ПолучитьСсылку(УИД);
НоваяКасса = Справочники.Кассы.СоздатьЭлемент();
НоваяКасса.УстановитьСсылкуНового(СсылкаНаКассу);
НоваяКасса.Наименование = "Восстановленная касса";
НоваяКасса.Записать();
После записи нового элемента со старым GUID битая ссылка в отчетах автоматически заменится на корректное наименование созданного объекта.