После проведения процедуры свертки информационной базы пользователи и разработчики нередко сталкиваются с ситуацией, когда отчеты по регистрам накопления (например, ТоварыНаСкладах) показывают некорректные остатки за прошлые периоды. Если формировать отчет с пустой датой начала, данные могут сходиться, но стоит задать дату среза из свернутого периода, как в отчете появляются «фантомные» остатки без регистраторов. Разберем по шагам причины такого поведения платформы 1С и подробно рассмотрим эффективные способы полного восстановления итогов.
Проанализируем ситуацию, чтобы понять механизм возникновения ошибки. Существует несколько основных технических факторов:
ОстаткиИОбороты и методы дополнения: при формировании отчета с пустой датой начала платформа рассчитывает остаток напрямую от первой фактической записи. Если же указана дата из свернутого периода и задействован метод дополнения ДвиженияИГраницыПериода, расчет остатка принудительно привязывается к ближайшей точке итогов (первое число месяца). Если в таблицах итогов за прошлые периоды сохранились старые служебные записи, возникают ложные границы периодов.Активность = Ложь). Такие записи не видны в стандартных отчетах, но могут искажать структуру итогов.Объект не найден).ПересчитатьИтоги(): стандартное тестирование и исправление или вызов метода ПересчитатьИтоги() пересчитывают данные поверх существующей структуры, не очищая физически накопившиеся нулевые или поврежденные записи в таблицах итогов.Самый быстрый и штатный способ очистить таблицы итогов — временно отключить использование итогов для регистра накопления и включить его заново. При отключении итогов платформа 1С физически очищает служебные таблицы итогов, а при повторном включении пересчитывает их исключительно по актуальным физическим движениям базы данных.
Рассмотрим пример кода для сброса итогов по конкретному регистру накопления:
// Полный сброс таблиц итогов для регистра "ТоварыНаСкладах"
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Истина);
Если требуется выполнить полный сброс и актуализацию итогов по всей информационной базе сразу, воспользуемся глобальным объектом УправлениеИтогами:
// Отключаем и заново включаем итоги для всех регистров конфигурации
УправлениеИтогами.УстановитьИспользованиеИтогов(Ложь);
УправлениеИтогами.УстановитьИспользованиеИтогов(Истина);
// Устанавливаем границу рассчитанных итогов на конец текущего месяца
УправлениеИтогами.УстановитьПериодРассчитанныхИтогов(КонецМесяца(ТекущаяДата()));
Перед пересчетом полезно убедиться, что в базе действительно отсутствуют движения до даты свертки. Для этого выполним запрос не к виртуальным таблицам (Остатки или ОстаткиИОбороты), а к реальной физической таблице движений регистра с отключенным фильтром активности:
ВЫБРАТЬ
Регистр.Период,
Регистр.Регистратор,
Регистр.Активность,
Регистр.Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК Регистр
ГДЕ
Регистр.Период < &ДатаСвертки
Если запрос возвращает строки, это означает, что свертка базы завершилась не полностью. В таком случае необходимо программно очистить наборы записей по найденным регистраторам:
// Очистка движений регистра по конкретному документу
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаНайденныйДокумент);
Набор.Записать(); // Запись пустого набора удаляет движения
В файловом режиме работы (файл 1Cv8.1CD) при сильных повреждениях внутренней структуры пересчет может завершаться без ошибок, но фактически не изменять таблицы. Разберем порядок действий для гарантированного исправления:
chdbfl.exe: завершим работу всех пользователей и запустим утилиту из каталога bin платформы 1С с установленным флагом «Исправлять обнаруженные ошибки». Это восстановит битые индексы таблиц..dt, а затем загрузим ее в новую пустую информационную базу. При загрузке файла выгрузки таблицы итогов не переносятся в готовом виде, а полностью формируются платформой с нуля по реальным движениям документов.Выполнение полного сброса итогов через УстановитьИспользованиеИтогов(Ложь) в сочетании с проверкой физических записей регистра позволяет полностью устранить «плавающие» остатки за свернутый период.