Что хранят CDX-файлы 1С и что делать, если они повреждены
Содержание
Файлы 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С:Предприятие 7.7 в режиме «Конфигуратор» для нужной базы.
- Откройте
Администрирование → Тестирование и исправление ИБ. - Отметьте переиндексацию и проверку физической целостности. Для первого прохода выберите режим тестирования без исправления, чтобы увидеть масштаб проблемы.
- Если найдены ошибки — повторите с режимом исправления.
- Откройте базу в режиме «Предприятие» и проверьте журналы и проблемные документы.
Если ошибки затрагивают итоги регистров, запустите также пересчёт итогов — после переиндексации он даёт верные остатки.
Способ 2. Удаление CDX и пересоздание при запуске
Когда конфигуратор не открывает базу или тестирование падает на конкретной таблице, используют ручной способ.
- Убедитесь, что в базе никто не работает , и сделайте копию каталога.
- Удалите из каталога базы все файлы
*.CDX. Файлы*.DBF,1Cv7.MDи1Cv7.DDне трогайте. - Запустите 1С в монопольном режиме. Платформа обнаружит отсутствие индексов и построит их заново по описанию из
1Cv7.DD. - Дождитесь окончания переиндексации: на большой базе это может занять от нескольких минут до часа.
- После запуска выполните тестирование и исправление из способа 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 индексируются только по началу строки.
Что делать, когда база приближается к лимиту:
- Проверьте размеры файлов в каталоге базы и найдите самые большие.
- Сделайте свёртку базы: перенесите остатки на новую дату и удалите старые документы.
- Если свёртка невозможна, переходите на 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С, а из-за среды, в которой она работает.
Ещё два приёма практиков:
- 🌐 Не держите DBF-базу 7.7 на нестабильном сетевом диске или в облачной папке с синхронизацией. Синхронизация копирует файлы по одному, и DBF с CDX расходятся.
- 🖥 Для удалённой работы используйте подключение к серверу через удалённый рабочий стол: 1С работает рядом с файлами, по сети идёт только картинка, и индексы ломаются гораздо реже.
Частые вопросы
Можно ли просто удалить CDX-файлы в 1С 7.7?
1Cv7.DD. Данные хранятся в DBF и не теряются.Почему после переиндексации база стала меньше?
Есть ли файлы CDX в 1С 8.3?
1Cv8.1CD, клиент-серверная — в СУБД.Как узнать, к какому объекту относится файл SC45.CDX?
1Cv7.DD текстовым редактором только для чтения и найдите по тексту SC45 — рядом будет имя справочника.