В практике сопровождения 1С периодически возникает нетипичная ситуация: формируется стандартный бухгалтерский отчет (например, Оборотно-сальдовая ведомость по счету или Карточка счета), и в нем отображаются строки по контрагенту или конкретному документу. При попытке открыть документ система либо выдает объект не найден, либо выясняется, что сам документ был предварительно помечен на удаление и физически удален из информационной базы, а в журнале проводок и наборе записей регистра бухгалтерии никаких записей по нему нет. Контрагент также помечен на удаление, но система не позволяет удалить его окончательно, ссылаясь на наличие остатков.
Проанализируем природу этой ошибки и разберем проверенные способы восстановления целостности базы данных.
Причины расхождения между регистрами и отчетами
Чтобы понять, откуда берутся «фантомные» данные, рассмотрим архитектуру регистра бухгалтерии в платформе 1С:
Разделение движений и итогов. На уровне СУБД регистр бухгалтерии состоит не из одной таблицы, а из нескольких. Основные проводки хранятся в таблице движений, а для быстрого формирования отчетов платформа поддерживает специальные таблицы итогов (остатков, оборотов, субконто). Виртуальные таблицы (например, ОстаткиИОбороты), к которым обращаются отчеты уровня ОСВ, считывают агрегированные данные напрямую из таблиц итогов, не сканируя каждый раз первичные проводки за все прошлые годы.
Рассинхронизация таблиц. Если удаление тестовых или ошибочных документов происходило в момент сбоя сеанса, некорректного завершения транзакции или при программной очистке данных без вызова типовых механизмов контроля, записи проводок физически удаляются, а сводные остатки в таблицах итогов не пересчитываются. В результате проводок нет, но виртуальная таблица возвращает ненулевой оборот или остаток.
Повреждение индексов в файловой базе. Для баз с расширением .1CD повреждение внутренних B-Tree индексов может приводить к тому, что выборка запроса продолжает возвращать некорректно закэшированные или разорванные строки.
Важно: перед выполнением любых регламентных и восстановительных процедур обязательно создайте резервную копию базы данных (для файловой базы достаточно скопировать файл 1Cv8.1CD при закрытых сеансах пользователей).
Способ 1. Выполнение тестирования и исправления через Конфигуратор
Это классический и наиболее надежный способ исправления ошибок структуры базы данных, подтвержденный практикой решения проблемы. Процедура выполняется в монопольном режиме:
Завершим все сеансы пользователей и запустим информационную базу в режиме Конфигуратор.
Откроем пункт меню Администрирование → Тестирование и исправление....
В появившемся окне снимем лишние флажки и отметим только ключевые пункты, необходимые для устранения расхождения:
Реиндексация таблиц информационной базы (восстанавливает индексные файлы и устраняет повреждения структуры поиска);
Пересчет итогов (принудительно пересчитывает все агрегаты регистров накопления и бухгалтерии на основании реальных физических движений);
При подозрении на битые ссылки можно включить Проверка логической целостности (в блоке действий при наличии ссылочной целостности выберем «Очищать ссылки»).
Нажмем кнопку Выполнить и дождемся завершения операции в окне служебных сообщений.
После пересчета итогов виртуальные таблицы обновят данные, и фантомные строки по удаленным документам полностью исчезнут из ОСВ.
Способ 2. Пересчет итогов в пользовательском режиме через БСП
Если нет возможности получить монопольный доступ через Конфигуратор, разберем альтернативный вариант в режиме «1С:Предприятие», доступный в типовых конфигурациях на базе Библиотеки стандартных подсистем:
Перейдем в раздел Администрирование → Обслуживание.
Развернем блок Регламентные операции и выберем пункт Управление итогами и агрегатами (или Управление итогами).
В списке регистров найдем нужный регистр бухгалтерии (как правило, Хозрасчетный).
Нажмем кнопку Пересчитать итоги за период или выполним полный пересчет, указав начальную дату ведения учета в базе.
В программном коде платформы эта операция реализуется с помощью метода менеджера регистра:
// Полный пересчет итогов регистра бухгалтерии
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();
Способ 3. Проверка физической целостности утилитой chdbfl.exe
Если база файловая и пересчет итогов завершается системной ошибкой СУБД, проанализируем файл базы на физические повреждения:
Закроем Конфигуратор и все сеансы работы с базой.
Перейдем в каталог установки платформы: C:\Program Files\1cv8\[номер_версии]\bin\.
Запустим утилиту chdbfl.exe.
Укажем путь к файлу базы данных 1Cv8.1CD.
Обязательно установим флажок Исправлять обнаруженные ошибки и нажмем Выполнить.
После устранения ошибок файловой структуры повторно запустим тестирование и исправление для актуализации итогов.
Способ 4. Выгрузка и загрузка информационной базы
Если повреждены внутренние таблицы и стандартный пересчет не помогает, применим метод полной пересборки файла базы:
В Конфигураторе выберем Администрирование → Выгрузить информационную базу... и сохраним файл выгрузки с расширением .dt.
Создадим в списке запуска новую пустую информационную базу без конфигурации.
Откроем ее в режиме Конфигуратора и выберем Администрирование → Загрузить информационную базу..., указав ранее созданный файл.
При загрузке из формата выгрузки платформа заново создает физические таблицы и перестраивает все индексы и таблицы итогов с нуля, устраняя любые накопленные расхождения.