Где 1С хранит индексы и что делать, если они повреждены
Содержание
Индексный файл 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: реиндексация через Конфигуратор
- Убедитесь, что в базе никто не работает.
- Откройте базу в режиме
Конфигуратор. - Выберите
Администрирование → Тестирование и исправление. - Отметьте флажок
Реиндексация таблиц информационной базы. Для начала достаточно добавитьПроверка логической целостности информационной базы. - В блоке режима выберите
Тестирование и исправление(не «Только тестирование»). - Нажмите
Выполнитьи дождитесь протокола в окне сообщений.
На базе 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 повреждён физически, Конфигуратор может не запуститься вовсе. Тогда сначала нужна утилита проверки физической целостности:
- Закройте все сеансы и скопируйте
1Cv8.1CDв отдельную папку. - Запустите
chdbfl.exeиз каталогаbinустановленной платформы. - Укажите путь к файлу базы, включите флажок исправления обнаруженных ошибок и запустите проверку.
- После успешной проверки выполните реиндексацию через Конфигуратор, как описано выше.
1С 7.7, DBF-версия: пересоздание .cdx
В 7.7 индексы можно перестроить двумя способами:
- через
Конфигуратор → Администрирование → Тестирование и исправление ИБс отметкой реиндексации таблиц; - вручную: при закрытой базе перенести все файлы
*.cdxиз каталога базы в отдельную папку и запустить 1С монопольно. Не найдя индексов, программа построит их заново по описанию структуры из1Cv7.dd.
Файлы .dbf и 1Cv7.md при этом не трогайте. Перенесённые .cdx удалите только после того, как база успешно откроется и проверка пройдёт без ошибок.
Индекс полнотекстового поиска
- В режиме 1С:Предприятие откройте
Все функции → Стандартные → Управление полнотекстовым поиском. - Нажмите
Очистить индекс. - Нажмите
Обновить индекси дождитесь окончания.
На крупной базе построение индекса полнотекстового поиска занимает часы, а папка индекса может весить несколько гигабайт. Запускайте вне рабочего времени.
Клиент-серверная база: средства СУБД
В клиент-серверном варианте реиндексацию делают средствами СУБД, а не Конфигуратором. Сначала посмотрите фрагментацию в 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 без копии и запустить базу не монопольно. Если перестроение оборвётся, база останется без индексов и откроется с ошибками. - ❌ Включить индексирование у десятка реквизитов «для скорости». Запись документов замедлится, а обновление конфигурации потребует долгой реструктуризации.
- ❌ Запускать перестроение индексов СУБД днём. Блокировки остановят работу пользователей сильнее, чем исходная фрагментация.
- ❌ Считать реиндексацию лекарством от всего. Если база тормозит из-за неоптимального запроса в отчёте, перестроенный индекс не поможет — нужен анализ запроса.