Почему сбиваются итоги после свертки базы 1С и как их исправить?

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

После проведения процедуры свертки информационной базы пользователи и разработчики нередко сталкиваются с ситуацией, когда отчеты по регистрам накопления (например, ТоварыНаСкладах) показывают некорректные остатки за прошлые периоды. Если формировать отчет с пустой датой начала, данные могут сходиться, но стоит задать дату среза из свернутого периода, как в отчете появляются «фантомные» остатки без регистраторов. Разберем по шагам причины такого поведения платформы 1С и подробно рассмотрим эффективные способы полного восстановления итогов.

Причины некорректного поведения итогов после свертки

Проанализируем ситуацию, чтобы понять механизм возникновения ошибки. Существует несколько основных технических факторов:

  1. Особенности виртуальной таблицы ОстаткиИОбороты и методы дополнения: при формировании отчета с пустой датой начала платформа рассчитывает остаток напрямую от первой фактической записи. Если же указана дата из свернутого периода и задействован метод дополнения ДвиженияИГраницыПериода, расчет остатка принудительно привязывается к ближайшей точке итогов (первое число месяца). Если в таблицах итогов за прошлые периоды сохранились старые служебные записи, возникают ложные границы периодов.
  2. Неактивные движения: в процессе свертки документы могли быть не удалены физически, а их наборы записей деактивированы (Активность = Ложь). Такие записи не видны в стандартных отчетах, но могут искажать структуру итогов.
  3. «Повисшие» записи без регистраторов: если удаление документов производилось некорректно в обход штатной очистки движений, в физической таблице регистра могут остаться строки со ссылкой на несуществующий документ (Объект не найден).
  4. Неэффективность стандартного метода ПересчитатьИтоги(): стандартное тестирование и исправление или вызов метода ПересчитатьИтоги() пересчитывают данные поверх существующей структуры, не очищая физически накопившиеся нулевые или поврежденные записи в таблицах итогов.

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

Самый быстрый и штатный способ очистить таблицы итогов — временно отключить использование итогов для регистра накопления и включить его заново. При отключении итогов платформа 1С физически очищает служебные таблицы итогов, а при повторном включении пересчитывает их исключительно по актуальным физическим движениям базы данных.

Рассмотрим пример кода для сброса итогов по конкретному регистру накопления:


// Полный сброс таблиц итогов для регистра "ТоварыНаСкладах"
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Истина);

Если требуется выполнить полный сброс и актуализацию итогов по всей информационной базе сразу, воспользуемся глобальным объектом УправлениеИтогами:


// Отключаем и заново включаем итоги для всех регистров конфигурации
УправлениеИтогами.УстановитьИспользованиеИтогов(Ложь);
УправлениеИтогами.УстановитьИспользованиеИтогов(Истина);

// Устанавливаем границу рассчитанных итогов на конец текущего месяца
УправлениеИтогами.УстановитьПериодРассчитанныхИтогов(КонецМесяца(ТекущаяДата()));

Способ 2. Диагностика скрытых физических записей регистра

Перед пересчетом полезно убедиться, что в базе действительно отсутствуют движения до даты свертки. Для этого выполним запрос не к виртуальным таблицам (Остатки или ОстаткиИОбороты), а к реальной физической таблице движений регистра с отключенным фильтром активности:


ВЫБРАТЬ
    Регистр.Период,
    Регистр.Регистратор,
    Регистр.Активность,
    Регистр.Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Регистр
ГДЕ
    Регистр.Период < &ДатаСвертки

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


// Очистка движений регистра по конкретному документу
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаНайденныйДокумент);
Набор.Записать(); // Запись пустого набора удаляет движения

Способ 3. Проверка файловой базы и перевыгрузка данных

В файловом режиме работы (файл 1Cv8.1CD) при сильных повреждениях внутренней структуры пересчет может завершаться без ошибок, но фактически не изменять таблицы. Разберем порядок действий для гарантированного исправления:

  1. Проверка целостности утилитой chdbfl.exe: завершим работу всех пользователей и запустим утилиту из каталога bin платформы 1С с установленным флагом «Исправлять обнаруженные ошибки». Это восстановит битые индексы таблиц.
  2. Выгрузка и загрузка информационной базы: в конфигураторе выполним «Администрирование» > «Выгрузить информационную базу...» в файл .dt, а затем загрузим ее в новую пустую информационную базу. При загрузке файла выгрузки таблицы итогов не переносятся в готовом виде, а полностью формируются платформой с нуля по реальным движениям документов.

Выполнение полного сброса итогов через УстановитьИспользованиеИтогов(Ложь) в сочетании с проверкой физических записей регистра позволяет полностью устранить «плавающие» остатки за свернутый период.

← На главную