Переиндексация и обслуживание индексов базы 1С: файловый режим, MS SQL, PostgreSQL
Содержание
Почистить индексы в 1С можно двумя путями. В файловой базе — через Конфигуратор: Администрирование → Тестирование и исправление, флажок «Реиндексация таблиц информационной базы». В клиент-серверной базе индексы живут в СУБД, поэтому их перестраивают средствами MS SQL Server или PostgreSQL, и часть работ там можно делать без остановки пользователей.
Типичная ситуация: в понедельник бухгалтер жалуется, что журнал документов открывается полминуты, а оборотно-сальдовая ведомость за квартал формируется дольше обычного. Данных за выходные не прибавилось, конфигурацию не обновляли. Частая причина — фрагментированные индексы и устаревшая статистика, и порядок исправления зависит от того, файловая база или клиент-серверная.
Какие индексы есть в базе 1С и как понять, что их пора чистить
Под словом «индексы» в 1С прячутся три разные вещи. Путать их не стоит: лечатся они по-разному.
| Что | Где хранится | Чем обслуживать |
|---|---|---|
| Индексы таблиц файловой базы | внутри файла 1Cv8.1CD | Конфигуратор, утилита chdbfl.exe |
| Индексы таблиц клиент-серверной базы | в базе MS SQL Server или PostgreSQL | средства СУБД: REBUILD, REORGANIZE, REINDEX, статистика |
| Индекс полнотекстового поиска | отдельные файлы в каталоге 1Cv8FTxt | обработка «Управление полнотекстовым поиском» |
Признаки, что дело в индексах таблиц:
- 🐢 замедлились списки, отбор и сортировка, хотя объём данных почти не изменился;
- 📈 отчёты, которые раньше строились быстро, стали тормозить после массовой загрузки, закрытия месяца или удаления помеченных объектов;
- 💾 файл
1Cv8.1CDзаметно вырос после удаления большого количества документов; - ⚠️ в файловой базе появляются ошибки чтения или база падает на одних и тех же документах — это уже повод для полной проверки, а не только для реиндексации.
Признак проблемы с полнотекстовым индексом другой: поиск по строке в списках не находит документы, которые точно есть, или находит удалённые.
Если тормозит у одного пользователя, а у остальных всё нормально, индексы ни при чём. Чаще виноват локальный кэш клиента: его сбрасывают запуском с параметром /ClearCache или очисткой каталога кэша в профиле пользователя.
Подготовка: резервная копия и окно для работ
Реиндексация в Конфигураторе и полный REBUILD на сервере СУБД — операции, которые переписывают структуру таблиц. Если процесс оборвётся на середине (сбой питания, переполнение диска), файловую базу придётся восстанавливать.
Перед любой процедурой сделайте резервную копию базы и проверьте, что она открывается.
Свободное место нужно не случайно. При реиндексации файловой базы и при REBUILD индексов на SQL Server временно требуется место под новую копию индексов. В SQL Server растёт ещё и журнал транзакций, если база в полной модели восстановления.
Монопольный доступ нужен только для тестирования и исправления в Конфигураторе. Обслуживание средствами СУБД монопольного режима 1С не требует, но полный REBUILD без опции ONLINE блокирует таблицу на время перестроения.
Если для получения монопольного режима приходится завершать сеансы через консоль кластера, у пользователей оборвётся работа и пропадут несохранённые документы. Делайте это вечером или в выходной, после предупреждения.
Очистка и сжатие таблиц через Конфигуратор
Для файловой базы основной инструмент — встроенное тестирование. Оно же убирает «мусор»: записи, помеченные как удалённые внутри файла, и следы прерванных операций.
- Закройте все сеансы пользователей в этой базе.
- Откройте базу в режиме Конфигуратор.
- Выберите
Администрирование → Тестирование и исправление. - Отметьте флажки:
- «Реиндексация таблиц информационной базы»;
- «Проверка логической целостности информационной базы»;
- «Сжатие таблиц информационной базы».
- В блоке режима выберите «Тестирование и исправление». Действия при ошибках оставьте предложенные по умолчанию, если не понимаете, на что их меняете.
- Нажмите «Выполнить» и дождитесь итогового сообщения в окне служебных сообщений.
Что делает каждый флажок:
| Флажок | Что происходит | Когда включать |
|---|---|---|
| Реиндексация таблиц | индексы удаляются и строятся заново | при тормозах и после сбоев |
| Проверка логической целостности | сверяются связи между таблицами | после аварийного завершения работы |
| Проверка ссылочной целостности | ищутся «битые» ссылки на удалённые объекты | после удаления помеченных объектов |
| Пересчёт итогов | заново считаются итоги регистров | при расхождениях в отчётах |
| Сжатие таблиц | физически удаляются записи, помеченные удалёнными | после массового удаления данных |
| Реструктуризация таблиц | таблицы пересоздаются полностью | только когда остальное не помогло |
Для первого запуска хватит трёх флажков из шага 4. Реструктуризация и пересчёт итогов на большой базе идут часами — включайте их, когда есть конкретная причина.
Переиндексация файловой базы: Конфигуратор и chdbfl
Если Конфигуратор не открывает базу или вылетает на тестировании, проверяют физическую целостность файла. Для этого в комплекте платформы есть утилита chdbfl.exe. Она лежит в каталоге bin установленной версии, например C:\Program Files\1cv8\8.3.24.1342\bin\chdbfl.exe — номер версии подставьте свой.
Порядок работы:
- Убедитесь, что базу никто не использует: ни пользователи, ни Конфигуратор, ни служба обмена.
- Скопируйте
1Cv8.1CDв отдельную папку. Это страховка на случай, если исправление пойдёт не так. - Запустите
chdbfl.exe, укажите путь к файлу базы. - Включите флажок «Исправлять обнаруженные ошибки» и нажмите «Выполнить».
- После проверки откройте базу в Конфигураторе и проведите тестирование с реиндексацией, как описано выше.
Утилита работает только с файловыми базами. Для клиент-серверной базы она бесполезна.
Если chdbfl нашла много ошибок в таблицах документов или регистров, после исправления часть данных может пропасть. Сравните остатки и обороты с последним бухгалтерским отчётом, прежде чем пускать пользователей.
Ещё один приём для сильно разросшейся файловой базы — выгрузка и загрузка через .dt. При загрузке все таблицы и индексы создаются заново, а файл обычно заметно уменьшается. Выгрузка делается в Конфигураторе: Администрирование → Выгрузить информационную базу, загрузка — там же. Загружайте в новую пустую базу, а не поверх рабочей: так старая остаётся запасным вариантом.
Обслуживание индексов 1С на MS SQL Server
В клиент-серверном варианте 1С создаёт индексы при реструктуризации, а дальше за их состоянием следит только СУБД. Сама она их не дефрагментирует, поэтому без плана обслуживания индексы со временем деградируют.
Как посмотреть фрагментацию
Запрос в SQL Server Management Studio, выполненный в контексте базы 1С:
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.avg_fragmentation_in_percent > 10
AND ips.page_count > 1000
ORDER BY ips.avg_fragmentation_in_percent DESC;
Маленькие индексы (меньше 1000 страниц) отбрасываются: фрагментация на них почти не влияет на скорость. Имена таблиц будут служебными — _Document123, _AccumRg456, _InfoRg789. Чтобы понять, какому объекту конфигурации соответствует таблица, используют метод встроенного языка ПолучитьСтруктуруХраненияБазыДанных().
REORGANIZE или REBUILD
| Действие | Когда | Блокировки |
|---|---|---|
REORGANIZE | фрагментация примерно 5–30% | выполняется онлайн, пользователи работают |
REBUILD | фрагментация выше 30% | в Standard блокирует таблицу; в Enterprise можно с ONLINE = ON |
| обновление статистики | регулярно, независимо от фрагментации | не блокирует работу |
Пороги 5 и 30% — рекомендация Microsoft, а не жёсткое правило. На практике для 1С важнее свежая статистика: устаревшая сильнее сбивает планы запросов, чем фрагментация.
Команды для одной таблицы:
-- мягкая дефрагментация, можно днём
ALTER INDEX ALL ON dbo._AccumRg456 REORGANIZE;
-- полное перестроение, лучше в окно работ
ALTER INDEX ALL ON dbo._AccumRg456 REBUILD;
-- обновление статистики по всей базе
EXEC sp_updatestats;
После REBUILD статистика по перестроенным индексам обновляется сама, с полным просмотром. После REORGANIZE — нет, поэтому статистику обновляют отдельно.
Многие администраторы 1С после обновления статистики выполняют DBCC FREEPROCCACHE, чтобы SQL Server построил планы запросов заново. Учтите: команда очищает кэш планов всего экземпляра, и несколько минут сервер будет нагружен сильнее обычного.
Переиндексация базы 1С на PostgreSQL
В PostgreSQL удалённые и изменённые строки остаются в таблицах и индексах, пока их не уберёт VACUUM. Для 1С, где регистры постоянно перезаписываются, это главный источник «распухания».
Базовые команды:
-- уборка мёртвых строк и обновление статистики, работа не блокируется
VACUUM (ANALYZE, VERBOSE);
-- перестроение индексов одной таблицы без блокировки записи (PostgreSQL 12 и выше)
REINDEX TABLE CONCURRENTLY _accumrg456;
-- перестроение всех индексов базы, блокирует таблицы на время работы
REINDEX DATABASE buh_base;
Имена таблиц 1С в PostgreSQL записываются строчными буквами. REINDEX ... CONCURRENTLY идёт дольше обычного и требует больше места, зато пользователи продолжают проводить документы.
Что проверить, если база тормозит:
- 🔍 включён ли autovacuum:
SHOW autovacuum;должен вернутьon; - 📊 сколько мёртвых строк в крупных таблицах — колонка
n_dead_tupв представленииpg_stat_user_tables; - 🕒 когда последний раз проходили autovacuum и autoanalyze — колонки
last_autovacuumиlast_autoanalyzeтам же.
Для сильно раздутых таблиц без окна простоя применяют расширение pg_repack. Оно пересобирает таблицу и индексы с минимальной блокировкой, но ставится отдельно и требует свободного места примерно под размер таблицы.
VACUUM FULL возвращает место на диск, но полностью блокирует таблицу. Запускать его в рабочее время на таблицах регистров нельзя: пользователи получат ошибки блокировок.
Как очистить индекс полнотекстового поиска
Этот индекс к таблицам СУБД отношения не имеет. Его строит сама платформа, и чистится он из режима 1С:Предприятие.
- Включите команду «Все функции»:
Сервис и настройки → Параметры, флажок «Отображать команду «Все функции»». - Откройте
Все функции → Стандартные → Управление полнотекстовым поиском. - Нажмите «Очистить индекс ». Поиск временно перестанет работать.
- Нажмите «Обновить индекс» и дождитесь окончания. На базе в десятки гигабайт это займёт от десятков минут до нескольких часов.
В типовых конфигурациях на БСП индекс поддерживают регламентные задания обновления и слияния индекса полнотекстового поиска. Их список — в разделе Администрирование → Обслуживание по ссылке на регламентные и фоновые задания. Если задания выключены или падают с ошибкой, индекс отстаёт от данных и поиск «не видит» новые документы.
Автоматизация обслуживания и профилактика
Разовая чистка помогает на неделю-другую. Чтобы база не деградировала снова, обслуживание ставят по расписанию.
MS SQL Server. В SQL Server Management Studio создайте план обслуживания (Maintenance Plan) с задачами:
- 🔁 Reorganize Index — ежедневно ночью;
- 🛠 Rebuild Index — раз в неделю, в выходной;
- 📊 Update Statistics — ежедневно, после реорганизации;
- 💾 Back Up Database — перед перестроением индексов.
Задачи плана выполняет SQL Server Agent. Он должен быть запущен и настроен на автоматический старт. В редакции Express агента нет, там обслуживание запускают скриптом через планировщик Windows.
PostgreSQL. Основная профилактика — правильно настроенный autovacuum. Для крупных таблиц регистров порог срабатывания часто снижают на уровне таблицы. Еженедельный VACUUM ANALYZE по крону страхует, если autovacuum не успевает.
Файловая база. Встроенного планировщика тестирования нет. Реиндексацию запускают из командной строки в пакетном режиме Конфигуратора с параметром /IBCheckAndRepair и нужными ключами, например:
"C:\Program Files\1cv8\8.3.24.1342\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "пароль" /IBCheckAndRepair -ReIndex -LogIntegrity -Out "D:\Logs\check.log"
Такой bat-файл ставят в планировщик Windows на ночь. Перед ним — копирование файла базы. Пароль в открытом виде храните только в файле, к которому есть доступ у одного администратора.
Файловая база больше 10–15 ГБ с десятком активных пользователей — сигнал задуматься о переходе на клиент-серверный вариант. Обслуживание индексов там гибче и не требует выгонять людей из программы.