В практике сопровождения баз 1С нередко возникает ситуация, когда стандартный отчет «Оборотно-сальдовая ведомость» показывает корректные данные, а отчеты с детализацией по дням (например, кассовая книга) или прямые запросы к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты выдают фантомные остатки на миллионные суммы. При этом полное «Тестирование и исправление» (ТиИ) на рабочей базе запускать рискованно, если база не обслуживалась годами.
Разберем причины такого поведения платформы и выясним, как точечно исправить данные по конкретному регистру бухгалтерии без риска повредить остальные объекты информационной базы.
Проанализируем механику работы платформы 1С при получении данных регистра бухгалтерии:
ДвиженияИГраницыПериода и периодичности ДЕНЬ виртуальная таблица рассчитывает остаток на каждый день, отталкиваясь от ближайшей точки рассчитанных итогов и последовательно накладывая дневные обороты. Если агрегированные итоги повреждены или рассинхронизированы с реальными движениями документов, ошибка накапливается внутри интервала отчета. Стандартная ОСВ обращается к итогам на конкретную границу даты без подневного разворота и может не затронуть поврежденные агрегаты.Организация или Счет В ИЕРАРХИИ) СУБД использует составные индексы. При логическом сбое индекса оптимизатор СУБД может прочитать не все страницы данных либо вернуть лишние записи.Штатный диалог «Тестирование и исправление» в конфигураторе не позволяет выбрать одну таблицу, однако мы можем выполнить полный пересчет для одного регистра бухгалтерии программно во внешней обработке. Для этого необходимо сначала отключить использование итогов (чтобы физически очистить таблицы агрегатов), а затем включить их заново и запустить пересчет.
Посмотрим на пример кода:
// 1. Отключаем использование итогов — платформа физически очищает таблицы агрегатов регистра
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
// 2. Включаем использование итогов обратно
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);
// 3. Устанавливаем границу рассчитанных итогов на конец нужного периода
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(КонецМесяца(ТекущаяДата()));
// 4. Запускаем полный пересчет по всем фактическим движениям
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();
Такой подход полностью пересоздает агрегированные данные регистра Хозрасчетный по реальным проводкам документов, не затрагивая другие регистры и справочники базы.
Если проблема вызвана повреждением структуры хранения или внутренних индексов платформы, можно принудительно запустить реструктуризацию только для нужного регистра:
РегистрБухгалтерии.Хозрасчетный.В процессе сохранения платформа выполнит реструктуризацию и полное перестроение таблиц и индексов только для измененного регистра бухгалтерии, не выполняя длительных операций над остальными объектами конфигурации.
Если решено запустить стандартное тестирование и исправление через Конфигуратор (меню Администрирование — Тестирование и исправление), но есть опасения, что в старой базе могут повредиться данные, необходимо правильно выставить флаги:
Режимы реиндексации и пересчета итогов являются абсолютно неразрушающими: они не модифицируют пользовательские документы и проводки, а лишь перестраивают индексные файлы и заново суммируют обороты по существующим записям.
В клиент-серверном варианте (MS SQL Server или PostgreSQL) исправить проблему с чтением данных можно через регламентные процедуры СУБД:
ПолучитьСтруктуруХраненияБазыДанных() определим имена физических таблиц регистра бухгалтерии в СУБД (основная таблица записей, таблица субконто, таблицы итогов).REBUILD INDEX в MS SQL или REINDEX TABLE в PostgreSQL).UPDATE STATISTICS / ANALYZE).Это исключит выбор неоптимальных планов запросов сервером баз данных и устранит физические повреждения индексов.