Что хранят CDX-файлы 1С и что делать, если они повреждены

· 10 мин

Содержание

Файлы CDX в 1С — это индексы таблиц файловой базы 1С:Предприятие 7.7 в формате DBF. Каждой таблице *.DBF соответствует свой *.CDX с тем же именем: в нём лежат отсортированные ключи, по которым платформа быстро находит записи. Если CDX повреждён или удалён, 1С пересоздаёт его переиндексацией, данные при этом не теряются — они хранятся в DBF.

В 1С 8.3 файлов CDX нет. Файловая база 8.3 — это один файл 1Cv8.1CD, индексы живут внутри него, а в клиент-серверном варианте — в СУБД. Поэтому всё, что ниже сказано про CDX, относится к 7.7, а в конце показано, как те же задачи решаются в 8.3.

Типичная ситуация: бухгалтер открывает старую базу 7.7, а журнал документов показывает пустой список, отчёт падает с ошибкой или сортировка справочника «съехала». Почти всегда это сбой индекса, а не потеря данных.

Как устроен каталог базы 1С 7.7 и где в нём CDX

Каталог DBF-базы 7.7 содержит несколько групп файлов. Конфигурация и описание данных хранятся отдельно от самих таблиц.

ФайлЧто в нём
1Cv7.MDконфигурация: метаданные, формы, модули
1Cv7.DDсловарь данных: описание таблиц, полей и индексов
*.DBFсами данные, одна таблица — один файл
*.CDXиндексы к таблице с тем же именем
*.DBF + *.CDX с префиксом 1Sслужебные таблицы: константы, журнал документов, блокировки, пользователи

Имена прикладных таблиц строятся по префиксу и внутреннему номеру объекта:

  • 📗 SCnnn — справочники;
  • 📄 DHnnn — шапки документов;
  • 📋 DTnnn — табличные части документов;
  • 📊 RAnnn — движения регистров;
  • 📈 RGnnn — итоги регистров;
  • ⚙️ 1SCONST, 1SJOURN, 1SCRDOC и другие — служебные таблицы платформы.

К каждой таблице идёт пара SC123.DBF + SC123.CDX. Номер связывает файл с объектом метаданных через 1Cv7.DD.

Что внутри одного CDX

CDX — составной (compound) индекс в формате FoxPro. В одном файле хранится сразу несколько «тегов» — отдельных индексов по разным полям одной таблицы. Например, у справочника обычно есть индексы по коду, по наименованию, по родителю, а также по реквизитам, для которых в конфигураторе включена сортировка.

У документов отдельные индексы получают реквизиты шапки с признаком сортировки или отбора. У табличных частей индексы строятся по ссылке на документ и номеру строки. Именно поэтому при сбое CDX табличной части документ открывается, но строки пропадают или идут в неправильном порядке.

Сам CDX не содержит данных, только ключи и ссылки на номера записей в DBF. Удалить CDX безопасно в смысле данных — опасно только запустить базу с несогласованным индексом и продолжить в ней работать.

Зачем CDX-индексы нужны для скорости работы

Без индекса платформе приходится читать таблицу целиком, чтобы найти нужную запись. В DBF-базе это особенно больно: файлы лежат на сетевом диске, каждый пользователь читает их по сети.

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

Где индексы работают напрямую:

  • 🔎 поиск элемента справочника по коду и наименованию;
  • 📅 выборка документов журнала за интервал дат;
  • 🗂 открытие табличной части документа;
  • 📊 запросы к регистрам и расчёт итогов;
  • 🔤 сортировка списков по реквизиту с признаком сортировки.

Обратная сторона индексов

Каждый индекс нужно обновлять при записи. Чем больше реквизитов с признаком сортировки или отбора, тем медленнее проводятся документы и тем больше весят CDX-файлы.

Со временем CDX «пухнет»: после массовых удалений и перепроведения в нём остаётся много пустого места. Переиндексация строит файл заново, и он часто становится заметно меньше. Если база начала тормозить без видимых причин, переиндексация — один из первых шагов.

Не включайте сортировку и отбор «на всякий случай» на десятках реквизитов. Это прямой путь к медленному проведению и большим CDX.

Как восстановить повреждённые CDX-файлы

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

  • ❌ сообщения об ошибке индекса или о нарушении структуры таблицы при открытии базы;
  • 👻 документы «пропали» из журнала, но находятся через другие отборы;
  • 🔀 списки отсортированы неправильно, дубли в справочнике;
  • 🐢 база резко замедлилась после сбоя.

Перед любыми действиями скопируйте весь каталог базы целиком. Копию делайте, когда все пользователи вышли: копия «на ходу» может оказаться несогласованной.

Способ 1. Тестирование и исправление в конфигураторе

Это штатный путь, начинать нужно с него.

  1. Попросите всех пользователей выйти из базы. Для этой операции нужен монопольный доступ, открытые сеансы будут мешать.
  2. Запустите 1С:Предприятие 7.7 в режиме «Конфигуратор» для нужной базы.
  3. Откройте Администрирование → Тестирование и исправление ИБ.
  4. Отметьте переиндексацию и проверку физической целостности. Для первого прохода выберите режим тестирования без исправления, чтобы увидеть масштаб проблемы.
  5. Если найдены ошибки — повторите с режимом исправления.
  6. Откройте базу в режиме «Предприятие» и проверьте журналы и проблемные документы.

Если ошибки затрагивают итоги регистров, запустите также пересчёт итогов — после переиндексации он даёт верные остатки.

Способ 2. Удаление CDX и пересоздание при запуске

Когда конфигуратор не открывает базу или тестирование падает на конкретной таблице, используют ручной способ.

  1. Убедитесь, что в базе никто не работает , и сделайте копию каталога.
  2. Удалите из каталога базы все файлы *.CDX. Файлы *.DBF, 1Cv7.MD и 1Cv7.DD не трогайте.
  3. Запустите 1С в монопольном режиме. Платформа обнаружит отсутствие индексов и построит их заново по описанию из 1Cv7.DD.
  4. Дождитесь окончания переиндексации: на большой базе это может занять от нескольких минут до часа.
  5. После запуска выполните тестирование и исправление из способа 1.

Удалить индексы можно командой из каталога базы:

cd /d D:\Base1C77\Buh
del /q *.CDX

Удаляйте только CDX. Случайно удалённый DBF — это потерянная таблица, и восстановить её можно только из копии.

Если не помогло

  • 🧩 Ошибка повторяется на одной таблице — повреждён сам DBF. Найдите по номеру в 1Cv7.DD, чей это объект, и восстановите таблицу из последней копии.
  • 💾 Индексы ломаются снова через несколько дней — ищите причину в сети и сервере: нестабильное соединение, антивирус, кеширование файлов.
  • 📦 Переиндексация не завершается — проверьте, не упёрся ли какой-то файл в лимит размера (см. ниже).
Диагностика: выберите симптом

CDX и клиент-серверный вариант: SQL-версия 7.7 и 1С 8.3

В SQL-версии 1С 7.7 данные хранятся в Microsoft SQL Server. Файлов *.DBF и *.CDX в каталоге базы нет, словарь данных называется 1Cv7.DDS. Индексы — это обычные индексы таблиц SQL Server.

Переиндексация в этом варианте выполняется средствами СУБД: заданиями обслуживания (maintenance plan) или командами перестроения индексов. Тестирование и исправление в конфигураторе для SQL-версии работает иначе и с физикой индексов почти не связано.

В 1С 8.3 ситуация следующая:

ВариантГде индексыКак перестроить
Файловая база 8.3внутри 1Cv8.1CDАдминистрирование → Тестирование и исправление в конфигураторе, флажок реиндексации таблиц; либо утилита chdbfl.exe
Клиент-серверная база 8.3в СУБД (MS SQL, PostgreSQL)регламентные операции СУБД: перестроение индексов и обновление статистики

Утилита chdbfl.exe лежит в каталоге bin установленной платформы. Она проверяет и исправляет файл 1Cv8.1CD без запуска конфигуратора.

Если вам попалась инструкция «удалите CDX-файлы» для 1С 8.3 — она не про вашу версию. В каталоге файловой базы 8.3 таких файлов нет, и удалять там ничего не нужно.

Размеры и лимиты CDX и DBF

Формат DBF придуман задолго до гигабайтных баз, у него жёсткие ограничения. Главное из них — 2 ГБ на один файл. Это касается и таблицы DBF, и её CDX.

На практике первыми в лимит упираются:

  • 📊 таблицы движений регистров (RAnnn) — в них каждая строка каждого проведённого документа;
  • 📋 табличные части крупных документов (DTnnn);
  • 📚 журнал документов 1SJOURN и его индекс.

Когда файл подходит к 2 ГБ, запись начинает падать с ошибками, а индекс может сломаться без видимой причины. Ещё один ограничитель — длина ключа индекса в формате FoxPro, около 240 байт. Поэтому длинные строковые реквизиты в 7.7 индексируются только по началу строки.

Что делать, когда база приближается к лимиту:

  1. Проверьте размеры файлов в каталоге базы и найдите самые большие.
  2. Сделайте свёртку базы: перенесите остатки на новую дату и удалите старые документы.
  3. Если свёртка невозможна, переходите на SQL-версию 7.7 или переносите учёт в 1С 8.3.

Свёртка — операция необратимая для рабочей базы. Выполняйте её на копии, проверяйте остатки и только потом заменяйте рабочий каталог.

У файловой базы 8.3 таких проблем нет: формат 1Cv8.1CD рассчитан на большие объёмы, а ограничения по скорости в основном связаны с числом одновременных пользователей и с сетью.

Как посмотреть структуру индексов программно

В 1С 7.7

Описание всех индексов лежит в 1Cv7.DD. Это текстовый файл: в нём перечислены таблицы, их поля и индексные выражения. Открыть его можно любым текстовым редактором в режиме только чтения — так удобно найти, к какому объекту относится, например, DT1234.DBF.

Сами DBF и CDX открываются сторонними просмотрщиками DBF и драйверами FoxPro. Читать так данные можно, а вот менять — нельзя.

Не редактируйте DBF внешними программами, пока к базе подключены пользователи. Даже при закрытой базе после внешней правки обязательно выполните переиндексацию: внешняя программа может не обновить все теги CDX, и 1С увидит несогласованные данные.

В 1С 8.3

В 8.3 структуру хранения показывает функция ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает таблицу значений: каждая строка — таблица базы с её полями и индексами. Второй параметр Истина возвращает имена так, как они называются в СУБД.

&НаСервере
Процедура ПоказатьИндексыНаСервере()
	Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
	Для Каждого СтрокаТаблицы Из Структура Цикл
		Для Каждого Индекс Из СтрокаТаблицы.Индексы Цикл
			Сообщить(СтрокаТаблицы.Метаданные + " | "
				+ СтрокаТаблицы.ИмяТаблицыХранения + " | "
				+ Индекс.ИмяИндексаХранения);
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

Код выводит объект метаданных, имя таблицы в базе и имя каждого индекса. Пригодится, когда в журнале СУБД или в профайлере запросов видна таблица вида _Reference45, а нужно понять, какой это справочник.

На индексы в 8.3 влияет свойство реквизита «Индексировать» в конфигураторе. Варианты «Индексировать» и «Индексировать с доп. упорядочиванием» создают отдельный индекс в базе — как сортировка реквизита в 7.7.

Как не доводить CDX до повреждения

Большинство сбоев индексов в 7.7 возникает не из-за самой 1С, а из-за среды, в которой она работает.

Профилактика сбоев индексов 7.7
Выполнено: 0 / 6

Ещё два приёма практиков:

  • 🌐 Не держите DBF-базу 7.7 на нестабильном сетевом диске или в облачной папке с синхронизацией. Синхронизация копирует файлы по одному, и DBF с CDX расходятся.
  • 🖥 Для удалённой работы используйте подключение к серверу через удалённый рабочий стол: 1С работает рядом с файлами, по сети идёт только картинка, и индексы ломаются гораздо реже.

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

Можно ли просто удалить CDX-файлы в 1С 7.7?
Да, если в базе никто не работает и есть копия каталога. При следующем монопольном запуске 1С построит индексы заново по словарю 1Cv7.DD. Данные хранятся в DBF и не теряются.
Почему после переиндексации база стала меньше?
Старые CDX накапливают пустое место после удалений и перепроведения. Переиндексация строит индексы с нуля, без «дыр», и файлы уменьшаются.
Есть ли файлы CDX в 1С 8.3?
Нет. Файловая база 8.3 хранит данные и индексы в одном файле 1Cv8.1CD, клиент-серверная — в СУБД.
Как узнать, к какому объекту относится файл SC45.CDX?
Откройте 1Cv7.DD текстовым редактором только для чтения и найдите по тексту SC45 — рядом будет имя справочника.
Можно ли переносить базу 7.7 без CDX-файлов?
Можно: скопируйте MD, DD и все DBF, а индексы платформа пересоздаст при первом монопольном запуске. Архив без CDX заметно меньше.