Как исправить некорректные остатки по регистру бухгалтерии и можно ли выполнить тестирование и исправление для одной таблицы?

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

В практике сопровождения баз 1С нередко возникает ситуация, когда стандартный отчет «Оборотно-сальдовая ведомость» показывает корректные данные, а отчеты с детализацией по дням (например, кассовая книга) или прямые запросы к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты выдают фантомные остатки на миллионные суммы. При этом полное «Тестирование и исправление» (ТиИ) на рабочей базе запускать рискованно, если база не обслуживалась годами.

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

Почему расходятся данные в ОСВ и виртуальной таблице «ОстаткиИОбороты»

Проанализируем механику работы платформы 1С при получении данных регистра бухгалтерии:

  1. Разные алгоритмы выборки: при использовании метода дополнения ДвиженияИГраницыПериода и периодичности ДЕНЬ виртуальная таблица рассчитывает остаток на каждый день, отталкиваясь от ближайшей точки рассчитанных итогов и последовательно накладывая дневные обороты. Если агрегированные итоги повреждены или рассинхронизированы с реальными движениями документов, ошибка накапливается внутри интервала отчета. Стандартная ОСВ обращается к итогам на конкретную границу даты без подневного разворота и может не затронуть поврежденные агрегаты.
  2. Повреждение индексов в СУБД: при наложении отборов по измерениям (например, Организация или Счет В ИЕРАРХИИ) СУБД использует составные индексы. При логическом сбое индекса оптимизатор СУБД может прочитать не все страницы данных либо вернуть лишние записи.
  3. Особенности стандартного пересчета: вызов обычного пересчета итогов из меню конфигуратора или режима 1С:Предприятие часто пересчитывает лишь дельту изменений, не очищая «мусорные» записи в таблицах итогов.

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

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

Посмотрим на пример кода:


// 1. Отключаем использование итогов — платформа физически очищает таблицы агрегатов регистра
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);

// 2. Включаем использование итогов обратно
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);

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

// 4. Запускаем полный пересчет по всем фактическим движениям
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();

Такой подход полностью пересоздает агрегированные данные регистра Хозрасчетный по реальным проводкам документов, не затрагивая другие регистры и справочники базы.

Способ 2. Точечная реструктуризация одного объекта метаданных

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

  1. Откроем конфигуратор и найдем РегистрБухгалтерии.Хозрасчетный.
  2. Внесем незначительное изменение в свойства регистра: например, изменим текст в поле Комментарий или добавим временный реквизит.
  3. Нажмем клавишу F7 (Обновить конфигурацию базы данных).

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

Способ 3. Безопасная настройка штатного «Тестирования и исправления»

Если решено запустить стандартное тестирование и исправление через Конфигуратор (меню Администрирование — Тестирование и исправление), но есть опасения, что в старой базе могут повредиться данные, необходимо правильно выставить флаги:

  1. Снимаем флаги: «Проверка логической целостности» и «Проверка ссылочной целостности». Именно эти проверки при обнаружении битых ссылок создают объекты «Объект не найден» или очищают ссылки в документах, что может исказить учет.
  2. Включаем флаги: «Реиндексация таблиц информационной базы» и «Пересчет итогов».

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

Способ 4. Обслуживание таблиц регистра на уровне СУБД

В клиент-серверном варианте (MS SQL Server или PostgreSQL) исправить проблему с чтением данных можно через регламентные процедуры СУБД:

  1. С помощью метода ПолучитьСтруктуруХраненияБазыДанных() определим имена физических таблиц регистра бухгалтерии в СУБД (основная таблица записей, таблица субконто, таблицы итогов).
  2. Выполним для этих таблиц команду перестроения индексов (REBUILD INDEX в MS SQL или REINDEX TABLE в PostgreSQL).
  3. Выполним обновление статистики распределения данных (UPDATE STATISTICS / ANALYZE).

Это исключит выбор неоптимальных планов запросов сервером баз данных и устранит физические повреждения индексов.

← На главную