Почему отчет показывает несуществующие остатки в 1С и как убрать фантомные записи?

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

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

Причины рассинхронизации таблиц движений и итогов

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

  1. Некорректная загрузка данных и удаление документов. При переносе данных внешними обработками через XML без вызова событий записи или при манипуляциях с документом Корректировка записей регистров записи в таблице движений могут быть помечены как неактивные или удалены, в то время как физическая таблица итогов сохраняет ранее рассчитанные агрегаты.
  2. Принцип работы виртуальных таблиц остатков. Запрос к виртуальной таблице остатков не сканирует все движения с начала ведения базы. Платформа берет последнюю сохраненную точку из таблицы итогов и прибавляет или вычитает движения только за интервал от этой точки до запрошенной даты. Если в таблице итогов осталась «зависшая» строка, а движений после даты расчета нет, платформа формирует неверный остаток.
  3. Особенности буфера разделения итогов. Механизм разделения итогов создает дополнительные агрегаты для параллельной записи. Сбой транзакции может оставить в них фантомные значения, которые не всегда очищаются типовым пересчетом.

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

Первый и наиболее быстрый способ устранить проблему в пользовательском режиме — сдвинуть границу рассчитанных итогов до даты возникновения сбоя и затем вернуть ее обратно. Рассмотрим, как это сделать по шагам:

  1. Перейдем в режим управления итогами через меню конфигурации (обычно раздел Администрирование — Обслуживание — Регламентные операции — Управление итогами и агрегатами).
  2. Установим период расчета итогов на дату, предшествующую периоду появления ошибочных остатков.
  3. Выполним расчет итогов по эту дату.
  4. Вернем дату расчета на текущий период (конец предыдущего или текущего месяца) и повторно выполним расчет.

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

Способ 2. Программное пересоздание таблиц итогов регистра

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

Напишем и выполним во внешней обработке следующий код:


ИмяРегистра = "ТоварыНаСкладах";
МенеджерРегистра = РегистрыНакопления[ИмяРегистра];

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

// Включаем использование итогов обратно
МенеджерРегистра.УстановитьИспользованиеИтогов(Истина);

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

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


МенеджерРегистра.УстановитьИспользованиеРазделенияИтогов(Ложь);
МенеджерРегистра.УстановитьИспользованиеРазделенияИтогов(Истина);

Способ 3. Реструктуризация таблиц информационной базы

В ситуациях, когда в базе остались скрытые повреждения ссылочной целостности после некорректного удаления документов-регистраторов, применим реструктуризацию:

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

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

← На главную