Администрирование · 10 мин
Зачем нужны индексы в 1С и как они ускоряют работу базы
Зачем нужны индексы в 1С, как они ускоряют поиск и отчёты, какие индексы создаются автоматически, когда нужен свой индекс и как избежать типичных ошибок.
Индекс в 1С — это служебная структура данных, которая позволяет платформе и СУБД находить нужные записи без полного перебора таблицы. Без индекса поиск документа по номеру в базе с миллионом записей означает последовательное чтение всех строк, а с индексом — почти мгновенное обращение к нужной позиции. Именно поэтому от наличия и правильности индексов напрямую зависит скорость отчётов, проведения документов, подбора в формах и обменов данными.
Платформа 1С создаёт часть индексов автоматически: по уникальному идентификатору, по номеру и дате документа, по коду справочника, по регистратору и измерениям регистров. Этого достаточно для типовых операций, но как только в запросах и динамических списках появляются отборы по произвольным реквизитам — например, по контрагенту в регистре накопления или по артикулу в табличной части, — стандартных индексов может не хватить, и база начинает «тормозить».
Разработчик и администратор могут влиять на индексацию двумя способами: включать свойство «Индексировать» у реквизитов и измерений в конфигураторе, а также следить за тем, чтобы запросы использовали уже существующие индексы. Понимание того, какие индексы есть в базе и как запрос их выбирает, — базовый навык диагностики медленной работы 1С.
Что такое индекс и как он работает внутри базы
Физически индекс — это отдельная структура на диске (в MS SQL Server, PostgreSQL или файловой базе), где значения проиндексированных полей хранятся в отсортированном виде вместе со ссылками на строки основной таблицы. Когда запрос содержит условие по такому полю, СУБД сначала находит нужное значение в компактном отсортированном индексе, а затем по ссылке обращается к полной записи.
Классическая аналогия — алфавитный указатель в конце книги: вместо чтения всех страниц вы открываете указатель на нужной букве и сразу получаете номера страниц. Цена этого удобства — дополнительное место на диске и замедление операций записи: при добавлении или изменении строки СУБД обновляет не только таблицу, но и все её индексы.
Какие индексы 1С создаёт автоматически
Платформа без участия разработчика строит индексы для ключевых служебных полей. Знание этого списка избавляет от лишней работы — не нужно включать индексацию для полей, которые уже покрыты.
- Уникальный идентификатор ссылки (кластерный индекс таблиц объектов).
- Номер и дата документа, код справочника — для быстрого поиска по «человеческим» ключам.
- Регистратор в таблицах движений регистров — для получения проводок документа.
- Измерения регистров сведений и накопления — в составе индексов по итогам и по регистратору.
- Поле «Период» в периодических регистрах сведений и регистрах расчёта.
- Владелец и родитель в подчинённых и иерархических справочниках.
Кроме того, платформа автоматически индексирует реквизиты, по которым настроены критерии отбора, и поля, участвующие в типовых механизмах — например, в разделении данных. Полный актуальный состав индексов конкретной таблицы всегда можно посмотреть средствами СУБД, а не гадать по конфигуратору.
Когда нужно включать индексацию реквизита вручную
Свойство «Индексировать» у реквизита, измерения или ресурса стоит включать, когда по этому полю регулярно выполняется поиск, отбор или соединение, а стандартный индекс его не покрывает. Типичные признаки такой ситуации: отчёт с отбором по реквизиту выполняется неприемлемо долго, в плане запроса видно полное сканирование таблицы, динамический список с отбором «подвисает» при открытии.
Частые кандидаты на индексацию: реквизит «Контрагент» в регистре взаиморасчётов, если по нему строятся отчёты; «Склад» или «Номенклатура» в нестандартных регистрах; реквизиты справочников, по которым пользователи ищут через строку поиска; поля, по которым происходит соединение таблиц в запросах обмена.
Как выбрать действие
Как включить индексацию и проверить результат
Изменение индексов — это изменение структуры базы, поэтому работа ведётся в конфигураторе и требует монопольного доступа при обновлении. Последовательность действий проста, но проверка результата обязательна: включённый флажок сам по себе не гарантирует, что запрос ускорится.
- 1Найдите в конфигураторе объект и нужный реквизит, откройте палитру свойств
- 2Установите свойство «Индексировать» в значение «Индексировать» (или «Индексировать с доп. упорядочиванием» при необходимости сортировки)
- 3Сохраните конфигурацию и выполните обновление конфигурации базы данных — платформа построит индекс
- 4Запустите проблемный отчёт или запрос и замерьте время выполнения
- 5Проверьте план запроса средствами СУБД: сканирование таблицы должно смениться поиском по индексу (index seek)
Проверка плана запроса — ключевой шаг. В MS SQL Server это делается через SQL Server Management Studio (включение фактического плана выполнения), в PostgreSQL — командой EXPLAIN ANALYZE. Если после добавления индекса план не изменился, значит, запрос написан так, что индекс использовать нельзя, и оптимизировать нужно сам запрос.
Как проверить результат
Операция Index Seek или Index Scan по нужному индексу
Clustered Index Scan или Table Scan по большой таблице
Заметное снижение времени при том же объёме данных
Время не изменилось или выросло
Запись и проведение работают как раньше
Проведение замедлилось — индексов стало слишком много
Обратная сторона: цена индексов и типичные ошибки
Каждый индекс занимает место на диске и обновляется при каждой вставке, изменении и удалении строки. На регистрах с интенсивной записью — например, на регистрах накопления в торговой базе — лишние индексы ощутимо замедляют проведение документов и увеличивают время регламентных операций. Поэтому стратегия «проиндексируем всё на всякий случай» вредна.
Отдельная ловушка — запросы, которые «гасят» индекс. Если в условии запроса поле обёрнуто в функцию, приведено к другому типу или сравнивается с выражением, СУБД чаще всего не сможет использовать индекс по этому полю. В таких случаях правильнее переписать запрос, чем добавлять новые индексы.
Индексы и производительность: что ещё влияет
Индексы — не единственный фактор скорости. Даже правильно проиндексированная база будет работать медленно при нехватке оперативной памяти на сервере СУБД, фрагментации индексов, устаревшей статистике или блокировках от конкурирующих сеансов. Поэтому диагностику медленной работы стоит вести комплексно.
Регламентное обслуживание на стороне СУБД — обновление статистики и перестроение (реиндексация) индексов — помогает сохранять их эффективность по мере роста базы. Эти операции выполняются средствами СУБД по расписанию, обычно в нерабочие часы, и не требуют изменения конфигурации.
Практические рекомендации по работе с индексами
Работайте от симптома, а не превентивно: сначала зафиксируйте медленную операцию и снимите план запроса, потом решайте, нужен ли индекс. Так вы добавите только те индексы, которые реально используются, и не перегрузите базу.
Держите под контролем регламентное обслуживание СУБД: перестроение индексов и обновление статистики на больших базах — обязательная периодическая операция. После любого изменения индексов в конфигурации замеряйте не только целевой отчёт, но и скорость записи в затронутую таблицу.
Если отчёт тормозит только при отборе за большой период, а по конкретному документу работает быстро — проблема почти наверняка в отсутствии индекса по полю отбора, а не в «тяжёлом» отчёте. Начинайте диагностику с плана запроса, это экономит часы догадок.
Что важно запомнить
Индексы ускоряют чтение ценой замедления записи и роста объёма базы. Платформа 1С создаёт базовые индексы сама; ручная индексация нужна только для реквизитов, по которым реально выполняются отборы и соединения. Эффект проверяется планом запроса, а изменения структуры делаются в конфигураторе после резервного копирования.
Частые вопросы об индексах в 1С
Замедляют ли индексы запись данных?
Да. Каждый индекс обновляется при вставке, изменении и удалении строки, поэтому на таблицах с интенсивной записью большое число индексов заметно снижает скорость проведения документов. Именно поэтому индексацию включают выборочно, только под реальные сценарии чтения.
Нужно ли индексировать реквизит, по которому ищут изредка?
Обычно нет. Если отбор по реквизиту выполняется редко и таблица не очень большая, затраты на постоянную поддержку индекса превысят разовый выигрыш. Индекс оправдан при регулярных отборах и соединениях по этому полю.
Что значит «Индексировать с дополнительным упорядочиванием»?
Этот вариант свойства добавляет в индекс дополнительное поле упорядочивания, что ускоряет выборки с сортировкой, например для динамических списков. Он создаёт более «тяжёлый» индекс, поэтому применять его стоит только когда сортировка по реквизиту действительно используется постоянно.
Можно ли создать индекс прямо в SQL Server, не трогая конфигуратор?
Технически возможно, но не рекомендуется: платформа управляет структурой базы сама и при обновлении конфигурации может пересоздать таблицы, а ручные индексы будут потеряны или вызовут конфликты. Правильный путь — свойство «Индексировать» в конфигураторе.
Почему индекс есть, а запрос всё равно медленный?
Частые причины: поле в условии обёрнуто в функцию или приведение типа, отбор идёт по части составного ключа, устарела статистика СУБД или узкое место вообще не в индексе, а в блокировках и нехватке памяти. Диагностику начинайте с плана выполнения запроса средствами СУБД.
Что такое реиндексация и как часто её делать?
Это перестроение существующих индексов для устранения фрагментации, выполняется средствами СУБД (например, планом обслуживания в MS SQL Server). Периодичность зависит от интенсивности изменения данных: на активных базах её обычно включают в регулярный регламент в нерабочие часы.