Итоги регистра накопления разошлись — как пересчитать
Содержание
Регистр накопления хранит не только движения документов, но и предрассчитанные итоги — остатки и обороты на границах периодов. Именно из итогов строятся быстрые отчёты по остаткам. Когда в отчётах появляются отрицательные остатки, задвоенные суммы или цифры, которые не бьются с движениями, пересчитать регистр накопления можно четырьмя способами: перепровести документы
, запустить обработку «Управление итогами», вызвать метод ПересчитатьИтоги() в своей обработке или выполнить пересчёт итогов через тестирование базы
в Конфигураторе.
Расхождение итогов возникает после прямой записи движений кодом, после обмена данными, восстановления базы из фрагментов, иногда — после обновления платформы или конфигурации. Движения при этом остаются верными, «съезжают» именно агрегаты. Поэтому в большинстве случаев достаточно пересчитать итоги , не трогая сами документы.
Пересчёт итогов и перепроведение меняют служебные таблицы базы и нагружают сервер. Перед массовой операцией сделайте резервную копию и запускайте пересчёт в нерабочее время — иначе пользователи получат блокировки и зависания.
Когда итоги действительно нужно пересчитывать
Сначала убедитесь, что проблема именно в итогах, а не в самих данных. Симптомы, при которых помогает пересчёт:
- 📉 отчёт по остаткам показывает минус, хотя товар физически есть;
- 🔁 остаток «завис» — не меняется после проведения новых документов;
- ⚠️ суммы в оборотно-сальдовой ведомости не сходятся с реестром документов;
- 🧩 после загрузки данных из другой базы остатки задвоились.
Если же неверны сами движения (документ провёлся не теми суммами, не на тот склад), пересчёт итогов не поможет — там нужно исправлять документ и перепроводить его. Поэтому первый шаг всегда — диагностика.
Понять тип регистра тоже важно. Регистр остатков хранит итоги по остаткам (склад, взаиморасчёты). Регистр оборотов хранит обороты за период, и для него вместо обычных итогов работают агрегаты. Способы пересчёта похожи, но у оборотного регистра появляется ещё и работа с агрегатами.
Определить вид конкретного регистра можно в Конфигураторе: в свойствах регистра накопления есть вид — «Остатки» или «Обороты». От этого зависит, что именно вы пересчитываете: для регистра остатков — таблицу итогов, для оборотного — агрегаты, если они включены. Путать их не стоит: у оборотного регистра обычной таблицы остатков нет, и запрос к виртуальной таблице Остатки для него недоступен.
Как убедиться, что расхождение реальное
Самый надёжный тест — сравнить два числа: остаток из виртуальной таблицы Остатки (он считается из итогов) и остаток, посчитанный суммированием всех движений регистра с нуля. Если они разные — итоги действительно разошлись.
Проще всего это сделать в консоли запросов (внешняя обработка «Консоль запросов»). Консоль только читает данные и ничего не портит, поэтому ей можно пользоваться на рабочей базе. Сравните по одной номенклатуре и складу:
- остаток из таблицы
РегистрНакопления.ТоварыНаСкладах.Остатки; - сумму
Количествопо той же номенклатуре из основной таблицыРегистрНакопления.ТоварыНаСкладахс учётом вида движения (приход минус расход).
Расхождение этих величин — прямое доказательство, что пора пересчитывать. Совпадение означает, что итоги в порядке и причину сбоя надо искать в другом месте (в настройках отчёта, периоде, отборе).
Запрос для сверки по складу и номенклатуре можно построить так: одной частью взять остаток из виртуальной таблицы, другой — сумму движений, и соединить их по измерениям. Упрощённо:
ВЫБРАТЬ Склад, Номенклатура, СУММА(Количество) КАК ПоДвижениям
ИЗ РегистрНакопления.ТоварыНаСкладах
СГРУППИРОВАТЬ ПО Склад, Номенклатура
Полученную сумму движений (с учётом знака прихода и расхода) сравниваете с остатком из таблицы Остатки на ту же дату. Строки, где числа не совпали, и есть проблемные позиции — по ним дальше и смотрите, что пошло не так.
Отрицательный остаток сам по себе не всегда означает сбой итогов. Иногда это реальное превышение расхода над приходом из-за задним числом проведённого документа. Такой минус пересчётом не уберётся — нужно восстановить последовательность и перепровести документы по порядку.
Способ 1. Перепроведение документов
Это самый безопасный способ: при перепроведении платформа заново формирует движения каждого документа, а заодно корректно обновляет итоги. Данные остаются логически целостными, потому что пересчёт идёт в хронологическом порядке.
Для массового перепроведения используется стандартная обработка «Проведение документов» (в ряде конфигураций — «Групповое перепроведение документов
»). Открыть её вручную проще всего через команду Главное меню → Все функции → Обработки. Если пункта «Все функции» нет, включите его: Главное меню → Сервис → Параметры → Отображать команду "Все функции".
Порядок действий:
- Откройте обработку перепроведения документов.
- Задайте период и, при необходимости, отбор по видам документов.
- Запустите перепроведение и дождитесь окончания.
В типовых конфигурациях на платформе 8.3 перепроведение за закрытый период лучше запускать как регламентную операцию из раздела Администрирование → Обслуживание — там же настраивается фоновое «Групповое перепроведение документов
» по расписанию.
Важная тонкость: перепроводить документы нужно строго в хронологическом порядке. Если в базе ведётся последовательность проведения (например, по партиям или взаиморасчётам) и она нарушена — сначала восстановите её, а потом перепроводите. Иначе расход спишется раньше прихода, и вместо исправления остатков вы получите новые минусы. В типовых конфигурациях восстановление последовательности вынесено в то же обслуживание либо в настройки учётной политики.
Минус способа — он самый тяжёлый. Перепроведение тысяч документов за год может идти часами. Если нужно только поправить агрегаты, а движения верны, быстрее пересчитать именно итоги.
Способ 2. Обработка «Управление итогами»
Когда движения в порядке и трогать документы не нужно, применяют стандартную обработку управления итогами. В конфигурациях на Библиотеке стандартных подсистем она называется «Управление итогами» (в свежих релизах — «Управление итогами и агрегатами») и открывается через Главное меню → Все функции → Обработки.
Обработка даёт сделать три вещи:
- 🔄 пересчитать итоги выбранных регистров;
- 📆 задать период рассчитанных итогов — границу, до которой хранятся агрегаты;
- ⏸ временно отключить использование итогов на время массовых операций.
Период рассчитанных итогов — ключевая настройка. Обычно его держат на конце прошлого или текущего месяца: до этой даты остатки берутся из готовых агрегатов (быстро), после — досчитываются по движениям. Слишком глубокий период замедляет запись документов, слишком мелкий — замедляет отчёты.
Способ 3. Пересчёт итогов кодом
Если нужен точечный пересчёт одного регистра или хочется встроить операцию в свою обработку, используйте методы менеджера регистра накопления. Пересчёт итогов одного регистра:
РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтоги();
Установить границу рассчитанных итогов (например, на начало текущего месяца):
РегистрыНакопления.ТоварыНаСкладах.УстановитьПериодРассчитанныхИтогов(
НачалоМесяца(ТекущаяДата()));
Классический приём для ускорения массового пересчёта — на время операции отключить использование итогов, а после включить и пересчитать один раз:
Регистр = РегистрыНакопления.ТоварыНаСкладах;
Регистр.УстановитьИспользованиеИтогов(Ложь);
// ... массовая запись движений ...
Регистр.УстановитьИспользованиеИтогов(Истина);
Регистр.ПересчитатьИтоги();
Так платформа не обновляет агрегаты на каждой записи, а строит их один раз в конце. На больших объёмах это ускоряет работу в разы.
Проверить текущую границу итогов можно методом ПолучитьПериодРассчитанныхИтогов() — он вернёт дату, до которой итоги хранятся готовыми. Если нужно, чтобы итоги считались на максимально возможную дату, примените УстановитьМаксимальныйПериодРассчитанныхИтогов(), но помните: чем глубже период, тем больше таблица и тем медленнее проводятся документы.
У оборотных регистров с агрегатами есть отдельные методы обновления и пересчёта агрегатов. Если отчёты по оборотам считаются медленно, проверьте, включены ли агрегаты и актуальны ли они — обычная таблица итогов для оборотного регистра не используется.
Запускайте такой код из внешней обработки или через Главное меню → Все функции → Стандартные → Выполнение произвольного кода (в конфигурациях, где этот сервис доступен), а на сервере — в фоновом задании.
Способ 4. Пересчёт итогов через тестирование базы
Когда база явно «посыпалась» — не открывается часть отчётов, итоги противоречат движениям по многим регистрам сразу — помогает встроенное тестирование. В Конфигураторе: Администрирование → Тестирование и исправление информационной базы. В списке проверок включите флажок пересчёта итогов регистров (и, при необходимости, реструктуризацию и проверку логической целостности).
Тестирование и исправление требует монопольного (исключительного) доступа: все пользователи должны выйти из базы, фоновые задания — остановиться. Для клиент-серверного варианта операцию запускают в технологическое окно. Поэтому ТиИ — не ежедневный инструмент, а разовое лечение.
Для файловой базы этот режим заодно устраняет мелкие логические дефекты, которые обычным пересчётом из предприятия не поправить. Физическую проверку файла базы (chdbfl) с пересчётом итогов не путайте — это разные операции: chdbfl чинит структуру файла, а итоги пересчитываются именно в ТиИ.
В окне тестирования полезно включать пересчёт итогов вместе с проверкой логической целостности: если итоги разошлись из-за битых ссылок или обрыва транзакции, одна только пересборка агрегатов проблему замаскирует, а не вылечит. Поэтому при серьёзном сбое идут от целостности данных к итогам, а не наоборот.
Как ускорить пересчёт и не мешать пользователям
Массовый пересчёт — это нагрузка на диск и процессор сервера. Чтобы уложиться в технологическое окно:
- ⏰ запускайте пересчёт и перепроведение в нерабочее время или в выходной;
- ⏸ на время массовой записи движений отключайте использование итогов и включайте обратно одним действием;
- 📆 не держите слишком глубокий период рассчитанных итогов — чем он ближе к текущей дате, тем меньше таблица агрегатов;
- 🧱 большой период разбивайте на части (по месяцам или кварталам), а не перепроводите всю историю разом;
- 🖥 в клиент-серверном варианте выполняйте пересчёт в фоновом задании на сервере, а не на клиенте — так операция не оборвётся при разрыве связи.
Выбор способа зависит от ситуации — вот ориентир:
Автоматизация контроля целостности итогов
Чтобы расхождения не накапливались, пересчёт стоит поставить на поток:
- 🗓 регламентное задание перепроведения. В типовых конфигурациях включается «Групповое перепроведение документов» в разделе обслуживания; оно по расписанию перепроводит документы за свежий период и попутно обновляет итоги.
- 🤖 фоновый пересчёт итогов. Своя регламентная обработка с
ПересчитатьИтоги()по нужным регистрам раз в сутки ночью. Подходит, когда данные пишутся обменом в обход проведения: при загрузке набора записей платформа обновляет итоги, но при массовой выгрузке-загрузке агрегаты иногда отстают, и ночной пересчёт возвращает их в норму. - 🔍 периодическая сверка. Отчёт или запрос, который сравнивает остатки из таблицы
Остаткис суммой движений и сигнализирует о расхождении. Это дешёвый мониторинг — он не меняет данные, а только показывает, что пора вмешаться. - 🧪 плановое тестирование. Раз в квартал или перед закрытием периода — ТиИ в технологическое окно, с резервной копией.
Частые вопросы
Чем итоги регистра отличаются от его движений?
Нужен ли монопольный режим, чтобы пересчитать итоги?
ПересчитатьИтоги() и обработки «Управление итогами» монополия не обязательна, но операция тяжёлая, поэтому её делают в нерабочее время. А вот Тестирование и исправление в Конфигураторе требует исключительного доступа.