Почему 1С не видит часть данных регистра накопления в SQL и как это исправить?

Программист IT и автоматизация бизнеса
← На главную

При восстановлении базы данных после аварийного завершения работы или сбоя оборудования можно столкнуться с аномальным поведением: физически записи в таблице движений регистра накопления в MS SQL Server присутствуют (включая флаг активности _Active = 0x1), но при выполнении запросов из платформы 1С выборка возвращает только данные за самый последний период или не возвращает их вовсе.

Разберем подробно причины такого поведения системы и рассмотрим пошаговый алгоритм устранения проблемы.

Выясним причину: почему данные есть в MS SQL, но отсутствуют в 1С?

Проанализируем архитектуру взаимодействия платформы 1С с СУБД. При формировании запросов к виртуальным или физическим таблицам регистров платформа не всегда выполняет полное сканирование таблицы (Table Scan). Вместо этого оптимизатор SQL-запросов активно использует индексы (Index Seek), а также служебные таблицы итогов (такие как _AccumRgT и _AccumRgOpt).

Основные причины, почему 1С не видит физически существующие строки:

  1. Разрушение некластеризованных индексов. Если в результате сбоя индекс таблицы был поврежден, прямой SQL-запрос без использования индексов может находить строки, в то время как запрос с использованием индекса их пропустит. Платформа 1С «не увидит» данные, пока индекс не будет перестроен.
  2. Рассинхронизация таблиц итогов и физических движений. Запросы 1С к виртуальным таблицам («Остатки», «Обороты») обращаются к таблицам итогов. Если границы периодов или суммовые итоги сдвинулись при сбое, платформа перестает видеть движения за предыдущие периоды.
  3. Нарушение ссылочной целостности с регистраторами. Если в поле _RecorderRRef содержится ссылочный идентификатор (GUID) документа, которого больше нет в базе, платформа при фоновых процессах или обновлении итогов может считать такие записи «сиротскими».

Шаг 1. Проверка и переиндексация таблицы на стороне СУБД

Прежде чем выполнять операции на стороне 1С, необходимо убедиться в физической целостности страниц данных и перестроить индексы в MS SQL Server.

Рассмотрим порядок действий на сервере баз данных:

  1. Выполним проверку целостности структуры базы данных с помощью команды DBCC CHECKDB:

DBCC CHECKDB ('ИмяБазыДанных') WITH NO_INFOMSGS, ALL_ERRORMSGS;

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

  1. Выполним перестроение всех индексов для целевой таблицы регистра:

ALTER INDEX ALL ON _AccumRg1234 REBUILD;

Где _AccumRg1234 — физическое имя таблицы вашего регистра накопления в СУБД (узнать его можно через функцию ПолучитьСтруктуруХраненияБазыДанных() в 1С).

Шаг 2. Переиндексация и тестирование на стороне 1С

После перестроения индексов на стороне SQL Server необходимо обновить индексные файлы и таблицы итогов средствами самой платформы 1С.

Разберем по шагам порядок выполнения процедуры:

  1. Запустим конфигуратор 1С в монопольном режиме.
  2. Откроем пункт меню «Администрирование» — «Тестирование и исправление».
  3. Установим следующие флаги:
    • Реиндексация таблиц информационной базы;
    • Пересчет итогов;
    • Проверка логической целостности информационной базы.
  4. В переключателе «При наличии ссылок на несуществующие объекты» рекомендуется выбрать вариант «Создавать объекты». Это позволит сохранить «сиротские» записи регистратора, не позволяя платформе очистить их при обработке.
  5. Нажмем кнопку «Выполнить» и дождемся завершения процесса.

Альтернативное решение: пересчет итогов и пересоздание таблиц через выгрузку в .dt

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

  1. Программное отключение и включение итогов регистра. Программно отключим использование итогов для проблемного регистра накопления, сохраним настройки и включим их заново. При включении итогов платформа полностью пересчитает агрегированные данные на основе таблицы движений.
  2. Выгрузка и загрузка информационной базы (.dt). Выгрузка базы в файл .dt с последующей загрузкой в чистую базу данных СУБД принудительно пересоздает всю физическую структуру таблиц и индексов на уровне SQL на основе метаданных 1С, полностью устраняя рассинхронизацию.
← На главную