К статье
Практический материал

Разработка и Конфигурация · 12 мин

Индекс в запросе 1С: что это и как он ускоряет выборку данных

Что такое индекс в запросе 1С, как работает индексация таблиц, когда она ускоряет выборку, а когда замедляет. Практические примеры, ошибки и проверка результата.

Индекс в запросе 1С — это служебная структура данных, которую платформа строит по одному или нескольким полям таблицы, чтобы быстро находить нужные строки без полного перебора. Когда в запросе используется условие отбора, соединение таблиц или группировка, система управления базой данных (СУБД) ищет подходящий индекс: если он есть, поиск идёт по дереву индекса за доли секунды, если нет — выполняется последовательное сканирование всей таблицы. На больших объёмах данных разница измеряется не в разах, а в порядках: запрос может выполняться секунды вместо минут.

В контексте 1С тема индексов затрагивает сразу два уровня. Первый — индексы, которые создаются автоматически при описании объектов конфигурации (по ссылке, дате, номеру документа и другим системным полям) и те, что разработчик добавляет через свойство «Индексировать» у реквизитов и измерений. Второй — индексация временных таблиц внутри самого запроса с помощью конструкции «ИНДЕКСИРОВАТЬ ПО». Оба механизма решают одну задачу — ускорить поиск, но работают на разных этапах и требуют разных решений от разработчика.

Как работает индекс и почему он ускоряет запрос

Без индекса СУБД вынуждена читать таблицу целиком: взять первую строку, проверить условие, перейти ко второй — и так до конца. Такой план выполнения называется полным сканированием (table scan). На таблице из нескольких миллионов записей даже простой отбор по одному полю превращается в тяжёлую операцию, которая блокирует ресурсы сервера и заставляет пользователей ждать.

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

Важно понимать, что индекс — не бесплатный ресурс. Каждая операция записи, изменения или удаления строки заставляет СУБД обновлять и саму таблицу, и все её индексы. Чем больше индексов у таблицы, тем дороже запись. Поэтому задача разработчика — не «проиндексировать всё», а найти баланс между скоростью чтения и скоростью записи.

Какие индексы платформа 1С создаёт автоматически

Часть индексов существует в базе всегда, без участия разработчика. Платформа автоматически индексирует системные поля: ссылку (уникальный идентификатор объекта), дату и номер документа, код справочника, владельца подчинённого справочника, родителя иерархического справочника. У регистров сведений и накопления автоматически строится индекс по измерениям, у регистров накопления и бухгалтерии — по регистратору и периоду.

Это означает, что типовые запросы вида «найти документ по ссылке» или «получить остатки по номенклатуре и складу» уже опираются на готовые индексы. Проблемы начинаются там, где отбор идёт по обычному реквизиту — например, по артикулу товара, ИНН контрагента или штрихкоду, которые по умолчанию не индексируются.

Отдельный механизм — полнотекстовый индекс, который платформа строит для поиска по строковым данным. Он включается в свойствах конфигурации и у реквизитов через свойство «Полнотекстовый поиск». Этот индекс не участвует в обычных запросах, а обслуживает строку поиска в формах списков и динамических списках.

Как включить индексацию реквизита в конфигураторе

Для ускорения отборов по собственным реквизитам разработчик использует свойство «Индексировать» в палитре свойств объекта метаданных. Оно доступно у реквизитов справочников и документов, у измерений и ресурсов регистров. Значение «Индексировать» создаёт одиночный индекс по полю, «Индексировать с доп. упорядочиванием» добавляет в индекс системное поле для ускорения сортировки.

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

Порядок действий
  1. 1
    Откройте конфигуратор и найдите объект метаданных (справочник, документ, регистр).
  2. 2
    Выделите реквизит, по которому часто выполняется отбор или соединение.
  3. 3
    В палитре свойств установите «Индексировать» в значение «Индексировать».
  4. 4
    Сохраните конфигурацию и выполните обновление конфигурации базы данных.
  5. 5
    Проверьте скорость проблемного запроса и при необходимости снимите план запроса в консоли СУБД.

ИНДЕКСИРОВАТЬ ПО: индексация временных таблиц в тексте запроса

Сложные запросы в 1С часто строятся через временные таблицы: сначала выбирается промежуточный результат во временную таблицу, затем она соединяется с другими данными. По умолчанию временная таблица не имеет индексов, и каждое соединение с ней выполняется перебором. Для этого случая в языке запросов предусмотрена конструкция «ИНДЕКСИРОВАТЬ ПО», которая указывается в конце пакета выборки.

Правило применения простое: индексировать нужно те поля временной таблицы, по которым она будет соединяться с другими таблицами или фильтроваться в последующих запросах пакета. Если временная таблица маленькая (десятки строк), индекс не даст эффекта, но и не навредит. Если в ней сотни тысяч записей и она соединяется с большим регистром — отсутствие индекса почти гарантированно приведёт к медленному выполнению.

// Пример: временная таблица с индексом

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

СУММА(Продажи.Количество) КАК Количество

ПОМЕСТИТЬ ВТ_Продажи

ИЗ

РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Номенклатура

ИНДЕКСИРОВАТЬ ПО

Номенклатура

;

Частая ошибка — указывать в «ИНДЕКСИРОВАТЬ ПО» поля, которые потом нигде не используются в соединениях, или наоборот, забывать проиндексировать ключевое поле связи. Проверяйте соответствие: поле из «ИНДЕКСИРОВАТЬ ПО» должно встречаться в условии соединения или отбора ниже по пакету запроса.

Типичные ошибки
01
Индексировать все реквизиты подряд — запись документов и проведение замедляются из-за обновления лишних индексов.
02
Забыть ИНДЕКСИРОВАТЬ ПО у большой временной таблицы — соединение с регистром выполняется полным перебором.
03
Указать в ИНДЕКСИРОВАТЬ ПО поле, которое не участвует в соединениях — индекс строится, но никогда не используется.
04
Включить индексацию реквизита, но не обновить конфигурацию базы данных — индекс физически не создан, запрос работает по-старому.

Как понять, что запросу не хватает индекса

Главный симптом — резкий рост времени выполнения запроса при росте объёма данных. Отчёт, который на тестовой базе с тысячей документов работал мгновенно, в рабочей базе с миллионами записей выполняется минутами. Это классический признак полного сканирования таблицы там, где должен работать поиск по индексу.

Для точной диагностики используют план запроса на стороне СУБД. В MS SQL Server план снимается через SQL Server Management Studio, в PostgreSQL — командой EXPLAIN. Ищите в плане операции Table Scan или Seq Scan на больших таблицах: они показывают, что индекс не используется. Нормальная ситуация для отбора по индексированному полю — Index Seek или Index Scan.

Контрольные точки

Как проверить результат

Время выполнения запроса
Норма

Запрос выполняется за секунды и время почти не растёт при увеличении объёма данных

Тревожный признак

Время растёт пропорционально количеству записей в таблице

План запроса в СУБД
Норма

Для отборов и соединений используются операции поиска по индексу (Index Seek)

Тревожный признак

Присутствуют полные сканирования (Table Scan, Seq Scan) больших таблиц

Скорость записи данных
Норма

Проведение документов и запись элементов выполняются в привычном темпе

Тревожный признак

После добавления индексов запись заметно замедлилась — индексов слишком много

Когда индекс не поможет и что делать вместо него

Индекс бесполезен, если в условии запроса поле обёрнуто в функцию — например, ПОДСТРОКА(Наименование, 1, 5) = "Сталь" или ГОД(Дата) = 2026. СУБД не может применить индекс по полю, потому что сравнивается не само значение, а результат его преобразования. То же относится к условиям с ПОДОБНО "%строка" — поиск по вхождению в середине строки индексом не поддерживается.

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

Маршрут решения

Как выбрать действие

Отбор идёт по обычному реквизиту справочника или документа, запрос медленныйВключите свойство «Индексировать» у реквизита и обновите конфигурацию базы данных
Временная таблица соединяется с большим регистром, запрос тормозитДобавьте ИНДЕКСИРОВАТЬ ПО по полям соединения в пакете запроса
В условии используется функция над полем (ПОДСТРОКА, ГОД, НАЧАЛОПЕРИОДА)Перепишите условие так, чтобы поле сравнивалось напрямую с параметром или диапазоном
Запись документов замедлилась после добавления индексовПроверьте количество индексов по таблице и отключите индексацию редко используемых реквизитов

Практические рекомендации по работе с индексами

Опирайтесь на реальную статистику использования, а не на предположения. Перед добавлением индекса выясните, какие запросы действительно медленные: включите технологический журнал, соберите длительные запросы, проанализируйте их планы в СУБД. Индекс, созданный для запроса, который выполняется раз в месяц, принесёт больше вреда, чем пользы, потому что платить за него придётся при каждой записи.

При проектировании новых объектов сразу продумывайте типовые сценарии отбора. Если по справочнику регулярно ищут по артикулу — индексируйте артикул на этапе разработки, а не после жалоб пользователей. Для регистров сведений правильный порядок измерений в индексе тоже имеет значение: первыми ставят измерения, по которым чаще всего накладывается отбор равенством.

Полезная привычка — после написания сложного запроса с временными таблицами пройтись по каждому соединению и проверить: поле слева и справа от знака равенства индексировано? Для полей регистров и ссылок индекс есть автоматически, для полей временных таблиц — только если вы сами указали ИНДЕКСИРОВАТЬ ПО.
ПЗ
Практическое замечание
Итог

Что важно запомнить

Индекс ускоряет поиск строк за счёт упорядоченной структуры, но замедляет запись. Платформа индексирует системные поля и измерения автоматически, реквизиты — через свойство «Индексировать», временные таблицы — через ИНДЕКСИРОВАТЬ ПО. Диагностируйте проблемы по плану запроса и добавляйте индексы точечно, под реальные медленные отборы.

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

Чем индекс отличается от полнотекстового поиска в 1С?

Обычный индекс ускоряет точные сравнения и диапазоны в запросах и динамических списках. Полнотекстовый индекс — отдельный механизм для поиска слов и фраз внутри строковых данных, он работает в строке поиска форм и не используется в конструкциях запроса напрямую.

Можно ли создать составной индекс по нескольким реквизитам справочника?

Штатного свойства для произвольного составного индекса по нескольким реквизитам справочника в конфигураторе нет. Платформа сама строит составные индексы для измерений регистров и некоторых системных комбинаций. Если нужен отбор по паре полей, часто задачу решают переносом данных в регистр сведений с нужными измерениями.

Почему запрос с ИНДЕКСИРОВАТЬ ПО всё равно выполняется медленно?

Проверьте, совпадают ли проиндексированные поля с полями соединения, нет ли в условиях функций над полями и не соединяется ли временная таблица с виртуальной таблицей без параметров отбора. Также убедитесь, что отбор накладывается как можно раньше — до помещения данных во временную таблицу.

Нужно ли перестраивать индексы в файловой базе 1С?

В файловом варианте индексы поддерживаются платформой автоматически, отдельного обслуживания они не требуют. Полное перестроение индексов файловой базы происходит при тестировании и исправлении с соответствующей настройкой, но в штатной эксплуатации эта процедура не нужна.

Сколько индексов допустимо для одной таблицы?

Жёсткого технического лимита, который ударил бы по типовой конфигурации, нет, но практическое правило — только необходимый минимум. Каждый дополнительный индекс замедляет вставку и обновление записей и занимает место. Ориентируйтесь на реальные запросы: один индекс на каждый частый сценарий отбора.

Влияет ли индексация реквизита на обмен данными и синхронизацию?

Напрямую нет: индекс — внутренняя структура СУБД, в выгрузку данных он не попадает. Косвенное влияние есть — большое число индексов увеличивает время записи объектов при загрузке данных в базу, что может быть заметно при массовых обменах.