В практике сопровождения информационных баз 1С нередко возникает ситуация, когда отчет по остаткам номенклатуры или взаиморасчетов выводит данные, которых фактически нет в программе. При расшифровке до регистратора список оказывается пустым, документы движений давно удалены, а стандартное тестирование и исправление базы не находит ошибок в структуре данных. Разберем детально механику возникновения подобной проблемы и последовательность действий для ее полного устранения.
Для оптимизации скорости построения отчетов платформа 1С:Предприятие хранит регистры накопления в нескольких физических таблицах СУБД: таблице движений и таблице итогов (а также буферных таблицах, если включен режим разделения итогов). Выясним, почему возникает рассинхронизация между ними:
Корректировка записей регистров записи в таблице движений могут быть помечены как неактивные или удалены, в то время как физическая таблица итогов сохраняет ранее рассчитанные агрегаты.Первый и наиболее быстрый способ устранить проблему в пользовательском режиме — сдвинуть границу рассчитанных итогов до даты возникновения сбоя и затем вернуть ее обратно. Рассмотрим, как это сделать по шагам:
Важно понимать: операция пересчета и установки даты итогов не является перепроведением документов, она не изменяет первичные данные учета, а лишь пересчитывает агрегаты на основе существующих записей в таблицах движений.
Если стандартный сдвиг даты не решает проблему окончательно и после даты расчета итогов остатки снова появляются, проанализируем программный способ полной очистки таблицы итогов конкретного регистра накопления. Полное отключение и повторное включение итогов принудительно очищает физическую таблицу агрегатов и заполняет ее строго по имеющимся движениям.
Напишем и выполним во внешней обработке следующий код:
ИмяРегистра = "ТоварыНаСкладах";
МенеджерРегистра = РегистрыНакопления[ИмяРегистра];
// Отключаем использование итогов - таблица итогов очищается
МенеджерРегистра.УстановитьИспользованиеИтогов(Ложь);
// Включаем использование итогов обратно
МенеджерРегистра.УстановитьИспользованиеИтогов(Истина);
// Выполняем полный пересчет агрегатов
МенеджерРегистра.ПересчитатьИтоги();
Если в регистре используется разделение итогов, выполним аналогичный сброс для очистки буферных записей параллельности:
МенеджерРегистра.УстановитьИспользованиеРазделенияИтогов(Ложь);
МенеджерРегистра.УстановитьИспользованиеРазделенияИтогов(Истина);
В ситуациях, когда в базе остались скрытые повреждения ссылочной целостности после некорректного удаления документов-регистраторов, применим реструктуризацию:
Для файловых информационных баз при сохранении проблем также рекомендуется выполнить проверку физической целостности файла с помощью утилиты chdbfl.exe, расположенной в каталоге bin установленной платформы 1С.