Итоги регистра накопления разошлись — как пересчитать

· 9 мин

Содержание

Регистр накопления хранит не только движения документов, но и предрассчитанные итоги — остатки и обороты на границах периодов. Именно из итогов строятся быстрые отчёты по остаткам. Когда в отчётах появляются отрицательные остатки, задвоенные суммы или цифры, которые не бьются с движениями, пересчитать регистр накопления можно четырьмя способами: перепровести документы , запустить обработку «Управление итогами», вызвать метод ПересчитатьИтоги() в своей обработке или выполнить пересчёт итогов через тестирование базы в Конфигураторе.

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

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

Когда итоги действительно нужно пересчитывать

Сначала убедитесь, что проблема именно в итогах, а не в самих данных. Симптомы, при которых помогает пересчёт:

  • 📉 отчёт по остаткам показывает минус, хотя товар физически есть;
  • 🔁 остаток «завис» — не меняется после проведения новых документов;
  • ⚠️ суммы в оборотно-сальдовой ведомости не сходятся с реестром документов;
  • 🧩 после загрузки данных из другой базы остатки задвоились.

Если же неверны сами движения (документ провёлся не теми суммами, не на тот склад), пересчёт итогов не поможет — там нужно исправлять документ и перепроводить его. Поэтому первый шаг всегда — диагностика.

Понять тип регистра тоже важно. Регистр остатков хранит итоги по остаткам (склад, взаиморасчёты). Регистр оборотов хранит обороты за период, и для него вместо обычных итогов работают агрегаты. Способы пересчёта похожи, но у оборотного регистра появляется ещё и работа с агрегатами.

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

Как убедиться, что расхождение реальное

Самый надёжный тест — сравнить два числа: остаток из виртуальной таблицы Остатки (он считается из итогов) и остаток, посчитанный суммированием всех движений регистра с нуля. Если они разные — итоги действительно разошлись.

Проще всего это сделать в консоли запросов (внешняя обработка «Консоль запросов»). Консоль только читает данные и ничего не портит, поэтому ей можно пользоваться на рабочей базе. Сравните по одной номенклатуре и складу:

  • остаток из таблицы РегистрНакопления.ТоварыНаСкладах.Остатки;
  • сумму Количество по той же номенклатуре из основной таблицы РегистрНакопления.ТоварыНаСкладах с учётом вида движения (приход минус расход).

Расхождение этих величин — прямое доказательство, что пора пересчитывать. Совпадение означает, что итоги в порядке и причину сбоя надо искать в другом месте (в настройках отчёта, периоде, отборе).

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

ВЫБРАТЬ Склад, Номенклатура, СУММА(Количество) КАК ПоДвижениям
ИЗ РегистрНакопления.ТоварыНаСкладах
СГРУППИРОВАТЬ ПО Склад, Номенклатура

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

Отрицательный остаток сам по себе не всегда означает сбой итогов. Иногда это реальное превышение расхода над приходом из-за задним числом проведённого документа. Такой минус пересчётом не уберётся — нужно восстановить последовательность и перепровести документы по порядку.

Способ 1. Перепроведение документов

Это самый безопасный способ: при перепроведении платформа заново формирует движения каждого документа, а заодно корректно обновляет итоги. Данные остаются логически целостными, потому что пересчёт идёт в хронологическом порядке.

Для массового перепроведения используется стандартная обработка «Проведение документов» (в ряде конфигураций — «Групповое перепроведение документов »). Открыть её вручную проще всего через команду Главное меню → Все функции → Обработки. Если пункта «Все функции» нет, включите его: Главное меню → Сервис → Параметры → Отображать команду "Все функции".

Порядок действий:

  1. Откройте обработку перепроведения документов.
  2. Задайте период и, при необходимости, отбор по видам документов.
  3. Запустите перепроведение и дождитесь окончания.

В типовых конфигурациях на платформе 8.3 перепроведение за закрытый период лучше запускать как регламентную операцию из раздела Администрирование → Обслуживание — там же настраивается фоновое «Групповое перепроведение документов » по расписанию.

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

Минус способа — он самый тяжёлый. Перепроведение тысяч документов за год может идти часами. Если нужно только поправить агрегаты, а движения верны, быстрее пересчитать именно итоги.

Способ 2. Обработка «Управление итогами»

Когда движения в порядке и трогать документы не нужно, применяют стандартную обработку управления итогами. В конфигурациях на Библиотеке стандартных подсистем она называется «Управление итогами» (в свежих релизах — «Управление итогами и агрегатами») и открывается через Главное меню → Все функции → Обработки.

Обработка даёт сделать три вещи:

  • 🔄 пересчитать итоги выбранных регистров;
  • 📆 задать период рассчитанных итогов — границу, до которой хранятся агрегаты;
  • ⏸ временно отключить использование итогов на время массовых операций.

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

Способ 3. Пересчёт итогов кодом

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

РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтоги();

Установить границу рассчитанных итогов (например, на начало текущего месяца):

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

Классический приём для ускорения массового пересчёта — на время операции отключить использование итогов, а после включить и пересчитать один раз:

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

Так платформа не обновляет агрегаты на каждой записи, а строит их один раз в конце. На больших объёмах это ускоряет работу в разы.

Проверить текущую границу итогов можно методом ПолучитьПериодРассчитанныхИтогов() — он вернёт дату, до которой итоги хранятся готовыми. Если нужно, чтобы итоги считались на максимально возможную дату, примените УстановитьМаксимальныйПериодРассчитанныхИтогов(), но помните: чем глубже период, тем больше таблица и тем медленнее проводятся документы.

У оборотных регистров с агрегатами есть отдельные методы обновления и пересчёта агрегатов. Если отчёты по оборотам считаются медленно, проверьте, включены ли агрегаты и актуальны ли они — обычная таблица итогов для оборотного регистра не используется.

Запускайте такой код из внешней обработки или через Главное меню → Все функции → Стандартные → Выполнение произвольного кода (в конфигурациях, где этот сервис доступен), а на сервере — в фоновом задании.

Способ 4. Пересчёт итогов через тестирование базы

Когда база явно «посыпалась» — не открывается часть отчётов, итоги противоречат движениям по многим регистрам сразу — помогает встроенное тестирование. В Конфигураторе: Администрирование → Тестирование и исправление информационной базы. В списке проверок включите флажок пересчёта итогов регистров (и, при необходимости, реструктуризацию и проверку логической целостности).

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

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

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

Как ускорить пересчёт и не мешать пользователям

Массовый пересчёт — это нагрузка на диск и процессор сервера. Чтобы уложиться в технологическое окно:

  • ⏰ запускайте пересчёт и перепроведение в нерабочее время или в выходной;
  • ⏸ на время массовой записи движений отключайте использование итогов и включайте обратно одним действием;
  • 📆 не держите слишком глубокий период рассчитанных итогов — чем он ближе к текущей дате, тем меньше таблица агрегатов;
  • 🧱 большой период разбивайте на части (по месяцам или кварталам), а не перепроводите всю историю разом;
  • 🖥 в клиент-серверном варианте выполняйте пересчёт в фоновом задании на сервере, а не на клиенте — так операция не оборвётся при разрыве связи.

Выбор способа зависит от ситуации — вот ориентир:

Какой способ пересчёта выбрать?

Автоматизация контроля целостности итогов

Чтобы расхождения не накапливались, пересчёт стоит поставить на поток:

  • 🗓 регламентное задание перепроведения. В типовых конфигурациях включается «Групповое перепроведение документов» в разделе обслуживания; оно по расписанию перепроводит документы за свежий период и попутно обновляет итоги.
  • 🤖 фоновый пересчёт итогов. Своя регламентная обработка с ПересчитатьИтоги() по нужным регистрам раз в сутки ночью. Подходит, когда данные пишутся обменом в обход проведения: при загрузке набора записей платформа обновляет итоги, но при массовой выгрузке-загрузке агрегаты иногда отстают, и ночной пересчёт возвращает их в норму.
  • 🔍 периодическая сверка. Отчёт или запрос, который сравнивает остатки из таблицы Остатки с суммой движений и сигнализирует о расхождении. Это дешёвый мониторинг — он не меняет данные, а только показывает, что пора вмешаться.
  • 🧪 плановое тестирование. Раз в квартал или перед закрытием периода — ТиИ в технологическое окно, с резервной копией.
Безопасный пересчёт итогов — порядок
Выполнено: 0 / 5

Частые вопросы

Чем итоги регистра отличаются от его движений?
Движения — это записи, которые делают документы: приход и расход. Итоги — предрассчитанные суммы остатков и оборотов на границах периодов, нужны для быстрых отчётов. Пересчёт итогов не меняет движения.
Нужен ли монопольный режим, чтобы пересчитать итоги?
Для метода ПересчитатьИтоги() и обработки «Управление итогами» монополия не обязательна, но операция тяжёлая, поэтому её делают в нерабочее время. А вот Тестирование и исправление в Конфигураторе требует исключительного доступа.
Изменятся ли суммы в документах после пересчёта итогов?
Нет. Пересчёт пересобирает только таблицу итогов из уже существующих движений. Суммы и количества в документах останутся прежними. Меняются они только при перепроведении, если изменились настройки или последовательность.
Почему после пересчёта остаток всё равно отрицательный?
Значит, минус реальный: по движениям расход превысил приход. Чаще всего виноват документ, проведённый задним числом, или нарушенная последовательность. Здесь нужен не пересчёт итогов, а восстановление последовательности и перепроведение.
Как часто пересчитывать итоги?
Планово — не нужно: платформа обновляет их при каждом проведении. Разовый пересчёт делают после сбоев, обменов и восстановления базы. Для баз, куда данные грузятся в обход проведения, разумно поставить ночной фоновый пересчёт.