Где 1С хранит индексы и что делать, если они повреждены

· 9 мин

Содержание

Индексный файл 1С — это служебная структура, по которой программа быстро находит записи в таблицах базы, не перебирая их целиком. В 1С 7.7 (DBF-версия) это отдельные файлы .cdx рядом с каждой таблицей. В 1С 8.3 отдельных индексных файлов у таблиц нет: в файловой базе индексы лежат внутри 1Cv8.1CD, в клиент-серверной — в СУБД. Отдельной папкой на диске живёт только индекс полнотекстового поиска.

Типичная ситуация: бухгалтер жалуется, что список контрагентов открывается полминуты, а поиск по ИНН не находит фирму, которая точно есть в базе. Чаще всего дело не в «глюке», а в повреждённых или устаревших индексах. Их можно перестроить штатными средствами, не трогая данные.

Зачем 1С нужны индексы и что они дают

Таблица базы — это набор строк в порядке добавления. Без индекса, чтобы найти документ по номеру, платформа читает таблицу от начала до конца. На 300 записях это незаметно, на 3 миллионах проводок — минуты.

Индекс хранит отсортированные значения ключевого поля и ссылку на строку. Поиск по нему идёт как по алфавитному указателю в книге.

Что ускоряют индексы в повседневной работе:

  • 🔎 поиск по коду, наименованию, номеру документа и ИНН;
  • 📋 открытие и сортировку списков справочников и журналов;
  • 📊 отчёты, которые отбирают данные по периоду, организации, счёту;
  • 🧮 получение остатков и оборотов из регистров накопления и бухгалтерии.

Цена индексов — место на диске и время на запись. Каждый новый документ платформа заносит не только в таблицу, но и во все её индексы. Поэтому индексировать «всё подряд» вредно.

Какие бывают индексы в 1С: файлы и места хранения

Где именно искать индексы, зависит от версии платформы и варианта работы базы.

Вариант базыГде хранятся индексыЧто видно на диске
1С 7.7, DBF-версияОтдельный файл на каждую таблицуПары SC123.DBF + SC123.CDX, 1SJOURN.DBF + 1SJOURN.CDX
1С 7.7, SQL-версияВнутри базы MS SQL ServerФайлов .cdx нет
1С 8.3, файловая базаВнутри файла базыОдин файл 1Cv8.1CD
1С 8.3, клиент-сервернаяВ СУБД (MS SQL, PostgreSQL и др.)Файлы СУБД на сервере
Полнотекстовый поиск 8.3Отдельная папкаКаталог, имя которого начинается с 1Cv8FTxt

Несколько уточнений:

  • 📁 .cdx — формат составного индекса FoxPro. В нём один файл держит сразу несколько индексов для одной таблицы .dbf.
  • 📦 1Cv8.1CD — единый контейнер. Таблицы, индексы, конфигурация и служебные данные лежат внутри, «вытащить» индекс отдельно нельзя.
  • 🖥️ В клиент-серверной 8.3 у таблиц служебные имена вида _Reference25, _Document123, _AccumRg456. Их индексы видны в средствах СУБД, например в SQL Server Management Studio или pgAdmin.
  • 🔤 Индекс полнотекстового поиска в файловой базе лежит в каталоге базы рядом с 1Cv8.1CD. В клиент-серверной — на сервере 1С, в каталоге данных информационной базы внутри srvinfo.

Если в статье или на форуме речь идёт про «удалить .cdx и перезапустить», это совет для 7.7. В каталоге базы 8.3 таких файлов нет, и искать их бессмысленно.

Как работает индекс внутри: от реквизита до таблицы СУБД

Разработчик 1С не создаёт индексы руками. Он задаёт свойства объектов в Конфигураторе, а платформа сама строит нужные индексы.

Что индексируется автоматически

  • у справочников — ссылка, код, наименование, владелец и родитель;
  • у документов — ссылка, дата и номер;
  • у регистров — измерения и период; для каждого измерения можно включить или отключить индексирование;
  • у регистров бухгалтерии — счёт, субконто и период.

Свойство «Индексирование» у реквизита

У реквизитов справочников и документов есть свойство Индексирование с тремя значениями:

ЗначениеЧто строит платформаКогда выбирать
Не индексироватьНичегоРеквизит редко участвует в отборах
ИндексироватьИндекс по реквизиту и ссылкеЧастый отбор или поиск по реквизиту (ИНН, артикул)
Индексировать с доп. упорядочиваниемИндекс с учётом основного порядка объектаСписки, которые отбирают по реквизиту и сразу сортируют по коду или наименованию

Изменение этого свойства меняет структуру таблицы. При обновлении конфигурации базы платформа выполнит реструктуризацию. На большой таблице это занимает время и требует монопольного доступа.

Как индекс используется при запросе

Когда отчёт выполняет запрос с условием ГДЕ Контрагенты.ИНН = &ИНН, платформа (или СУБД) ищет подходящий индекс. Если он есть, читается несколько страниц индекса и нужные строки. Если нет — вся таблица целиком.

Отсюда практическое правило: индекс помогает, только если поле стоит в условии отбора первым или единственным. Отбор по «хвосту» составного индекса его не использует.

Признаки того, что индексы повреждены или устарели

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

Сигналы, на которые стоит обратить внимание:

  • 🐢 резкое замедление отдельного списка или отчёта, хотя объём данных не менялся;
  • ❓ поиск не находит объект, который виден в списке при ручном пролистывании;
  • 👯 в списке появляются строки-двойники или «пропадают» записи при сортировке;
  • 🔢 нарушается нумерация: программа предлагает номер, который уже занят;
  • ⛔ при запуске или в ходе работы 1С сообщает о повреждении файла базы или ошибке чтения таблицы.

Для клиент-серверной базы картина другая. Сами индексы СУБД ломаются редко, зато со временем фрагментируются, а статистика устаревает. Признак — постепенное замедление всех операций, которое проходит после регламентного обслуживания.

Диагностика: выберите симптом

Как восстановить индексные файлы 1С: пошагово

Перед любым из способов ниже сделайте копию базы — скопируйте каталог файловой базы целиком или выгрузите .dt. Все операции требуют, чтобы пользователи вышли из программы: открытые сеансы оборвутся, несохранённые документы пропадут. Делайте это вечером или в выходной.

Файловая база 8.3: реиндексация через Конфигуратор

  1. Убедитесь, что в базе никто не работает.
  2. Откройте базу в режиме Конфигуратор.
  3. Выберите Администрирование → Тестирование и исправление.
  4. Отметьте флажок Реиндексация таблиц информационной базы. Для начала достаточно добавить Проверка логической целостности информационной базы.
  5. В блоке режима выберите Тестирование и исправление (не «Только тестирование»).
  6. Нажмите Выполнить и дождитесь протокола в окне сообщений.

На базе 5–10 ГБ процедура обычно идёт от нескольких минут до часа, многое зависит от скорости диска.

То же из командной строки — для регламента

Реиндексацию удобно запускать ночью из планировщика заданий Windows:

"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /F"D:\Bases\Buh" /N"Администратор" /P"пароль" /IBCheckAndRepair -ReIndex -LogIntegrity /Out"D:\Logs\reindex.txt"

Ключ -ReIndex включает реиндексацию, -LogIntegrity — проверку логической целостности, /Out пишет протокол в файл. Пароль в bat-файле храните только на защищённом сервере.

Если база не открывается: утилита chdbfl.exe

Когда файл 1Cv8.1CD повреждён физически, Конфигуратор может не запуститься вовсе. Тогда сначала нужна утилита проверки физической целостности:

  1. Закройте все сеансы и скопируйте 1Cv8.1CD в отдельную папку.
  2. Запустите chdbfl.exe из каталога bin установленной платформы.
  3. Укажите путь к файлу базы, включите флажок исправления обнаруженных ошибок и запустите проверку.
  4. После успешной проверки выполните реиндексацию через Конфигуратор, как описано выше.

1С 7.7, DBF-версия: пересоздание .cdx

В 7.7 индексы можно перестроить двумя способами:

  • через Конфигуратор → Администрирование → Тестирование и исправление ИБ с отметкой реиндексации таблиц;
  • вручную: при закрытой базе перенести все файлы *.cdx из каталога базы в отдельную папку и запустить 1С монопольно. Не найдя индексов, программа построит их заново по описанию структуры из 1Cv7.dd.

Файлы .dbf и 1Cv7.md при этом не трогайте. Перенесённые .cdx удалите только после того, как база успешно откроется и проверка пройдёт без ошибок.

Индекс полнотекстового поиска

  1. В режиме 1С:Предприятие откройте Все функции → Стандартные → Управление полнотекстовым поиском.
  2. Нажмите Очистить индекс.
  3. Нажмите Обновить индекс и дождитесь окончания.

На крупной базе построение индекса полнотекстового поиска занимает часы, а папка индекса может весить несколько гигабайт. Запускайте вне рабочего времени.

Клиент-серверная база: средства СУБД

В клиент-серверном варианте реиндексацию делают средствами СУБД, а не Конфигуратором. Сначала посмотрите фрагментацию в MS SQL Server:

SELECT OBJECT_NAME(ips.object_id) AS table_name,
       i.name AS index_name,
       ips.avg_fragmentation_in_percent,
       ips.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS ips
JOIN sys.indexes AS i
  ON i.object_id = ips.object_id AND i.index_id = ips.index_id
WHERE ips.page_count > 1000
ORDER BY ips.avg_fragmentation_in_percent DESC;

Ориентир из практики Microsoft: при фрагментации 5–30% индекс реорганизуют, выше 30% — перестраивают:

ALTER INDEX ALL ON dbo._AccumRg456 REORGANIZE;
ALTER INDEX ALL ON dbo._AccumRg456 REBUILD;
EXEC sp_updatestats;

Для PostgreSQL аналог — VACUUM ANALYZE для статистики и REINDEX TABLE _accumrg456; для перестроения. Имена таблиц в PostgreSQL у 1С строчными буквами.

REBUILD в SQL Server Standard и REINDEX в PostgreSQL блокируют таблицу на время работы. Пользователи, которые обращаются к ней, будут ждать или получат ошибку блокировки. Запускайте ночью.

Оптимизация индексов: как ускорить работу 1С

Восстановление чинит то, что сломалось. Чтобы индексы не тормозили базу, нужен порядок.

Для файловых баз

  • 🛡️ Добавьте в исключения антивируса файл 1Cv8.1CD и папку полнотекстового индекса. Проверка «на лету» каждого обращения к файлу заметно замедляет 1С и иногда повреждает данные.
  • 💾 Держите базу на SSD-диске локального компьютера или сервера. Работа по общей сетевой папке через Wi-Fi — частая причина повреждений.
  • 🗜️ Раз в квартал выполняйте Сжатие таблиц информационной базы в том же окне «Тестирование и исправление». Файл после удаления помеченных объектов уменьшится.
  • 📈 Если файловой базой одновременно пользуются 10–15 человек и она весит десятки гигабайт, задумайтесь о переходе на клиент-серверный вариант.

Для клиент-серверных баз

  • 🗓️ Настройте регламент в СУБД: ежедневное обновление статистики, еженедельная реорганизация или перестроение индексов.
  • 🧹 Очищайте процедурный кэш СУБД после обновления статистики в MS SQL (DBCC FREEPROCCACHE), чтобы запросы перестроили планы.
  • 🔍 Смотрите на медленные запросы через технологический журнал или средства СУБД, прежде чем добавлять индекс.

Для разработчиков

  • Включайте Индексирование для реквизитов, по которым реально отбирают данные: ИНН, артикул, внешний код.
  • Не индексируйте реквизиты, по которым не ищут: комментарии, флажки, суммы.
  • В запросах ставьте условие на индексированное поле в ГДЕ или в параметры виртуальной таблицы, а не после соединения.

Частые ошибки при работе с индексами 1С

  • ❌ Искать файлы .cdx в базе 8.3. Их там нет. Удаление посторонних файлов из каталога базы ничего не исправит, а может навредить.
  • ❌ Копировать 1Cv8.1CD, пока база открыта. Копия получится несогласованной. Для резервной копии нужны закрытые сеансы или выгрузка .dt.
  • ❌ Удалить .cdx в 7.7 без копии и запустить базу не монопольно. Если перестроение оборвётся, база останется без индексов и откроется с ошибками.
  • ❌ Включить индексирование у десятка реквизитов «для скорости». Запись документов замедлится, а обновление конфигурации потребует долгой реструктуризации.
  • ❌ Запускать перестроение индексов СУБД днём. Блокировки остановят работу пользователей сильнее, чем исходная фрагментация.
  • ❌ Считать реиндексацию лекарством от всего. Если база тормозит из-за неоптимального запроса в отчёте, перестроенный индекс не поможет — нужен анализ запроса.

Частые вопросы

Можно ли удалить индекс полнотекстового поиска, чтобы освободить место?
Да. Данные базы при этом не пострадают, но поиск по всем данным перестанет работать, пока индекс не построят заново.
Влияет ли реиндексация на данные и проводки?
Нет. Реиндексация перестраивает только служебные структуры поиска, документы и движения остаются прежними. Копию всё равно делают на случай сбоя во время процедуры.
Как часто нужна реиндексация файловой базы?
Регулярно — не нужна. Запускайте её после аварийного выключения, сбоя диска или при явных признаках рассинхрона индексов.
Почему после перестроения индексов в SQL база ускорилась всего на день?
Обычно причина в устаревшей статистике или в одном тяжёлом запросе. Настройте ежедневное обновление статистики и найдите медленный запрос в технологическом журнале.
Нужен ли монопольный режим для «Тестирования и исправления»?
Да. Пока в базе есть сеансы пользователей, Конфигуратор не начнёт проверку и попросит завершить работу остальных.