← Назад к вопросам

Что такое индекс в 1С и какие виды индексов бывают?

2.0 Middle🔥 181 комментариев
#СУБД и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Общее определение

Индекс — это специальная структура данных в БД, которая ускоряет поиск и фильтрацию. Без индексов БД просматривает все строки (O(n)), с индексом поиск становится O(log n).

Как работает индекс

Без индекса: O(n) — просмотреть все 1000000 строк
С индексом: O(log n) — структурированный поиск (B-tree)

Виды индексов в 1С

1. Простой индекс (Single Column)

Индекс по одному полю:

Индекс "ИндексПоКонтрагенту" { Поля: Контрагент }

// Использование
Запрос = Новый Запрос("SELECT Ссылка FROM Документ.ПриходТоваров WHERE Контрагент = &К");

Когда помогает:

  • Поиск по точному значению
  • Диапазонные запросы (>=, <=)
  • Сортировка

2. Составной индекс (Composite Index)

Индекс по нескольким полям:

Индекс "ИндексПоДатеИКонтрагенту" {
    Поля: Дата, Контрагент
}

// Использование
Запрос = Новый Запрос("SELECT Ссылка FROM Документ.ПриходТоваров WHERE Дата >= &ДатаН AND Контрагент = &К");

Когда помогает:

  • Поиск по нескольким условиям
  • Снижает размер результата
  • Критичен порядок полей

3. Уникальный индекс (Unique Index)

Гарантирует уникальность значений:

Индекс "УникальныйНомер" {
    Поля: Номер
    Уникальный: Да
}

// Если попытаться вставить дубликат → ошибка БД

Особенности:

  • Автоматически проверяет уникальность
  • БД откажет вставить дубликат

4. Полнотекстовый индекс (Full-Text Index)

Поиск по содержимому текста:

Индекс "ПолнотекстовыйПоиск" {
    ПолнотекстовыйПоиск: Истина
    Поля: Содержание
}

// Использование
Запрос = Новый Запрос("SELECT Ссылка FROM Справочник.Документы WHERE Содержание СОДЕРЖИТ &Текст");

5. Индекс для сортировки

Ускоряет сортировку:

Индекс "ИндексДляСортировки" {
    Поля: Дата DESC
}

// Сортировка становится быстрой
Запрос = Новый Запрос("SELECT Ссылка FROM Документ.ПриходТоваров УПОРЯДОЧИТЬ ПО Дата УБЫВАНИЕ");

Создание индексов

В Designer'е:

  1. Правая кнопка на объекте → Индексы
  2. Создать новый индекс
  3. Задать:
    • Имя индекса
    • Поля индекса
    • Уникальный (да/нет)
    • Полнотекстовый (да/нет)

Примеры практического использования

Пример 1: Поиск по диапазону дат

// БЕЗ индекса — медленно (просмотр всех строк)
Запрос = Новый Запрос("SELECT Ссылка FROM Документ.ПриходТоваров WHERE Дата >= &ДатаН AND Дата <= &ДатаК");

// С индексом по Дате — быстро (O(log n))

Пример 2: Поиск в иерархии

Индекс "ИндексПоРодителю" { Поля: Родитель }

// Быстрый поиск дочерних элементов
Запрос = Новый Запрос("SELECT Ссылка FROM Справочник.ГруппаТоваров WHERE Родитель = &Группа");

Пример 3: Уникальный индекс

Индекс "УникальныйКод" { Поля: КодНоменклатуры, Уникальный: Да }

// При попытке вставить дубликат → ошибка
Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
Номенклатура.КодНоменклатуры = "12345";
Номенклатура.Записать();  // Если "12345" уже есть → ошибка

Влияние на производительность

Таблица: 1,000,000 строк

FULL SCAN (без индекса): ~5 секунд
С индексом: ~5 миллисекунд
Ускорение: 1000x

Когда индекс ЗАМЕДЛЯЕТ

// Индекс НЕ используется, если применена функция
WHERE НомерДокумента + 100 = &Номер  // Функция на поле!

// Переписать без функции
WHERE НомерДокумента = &Номер - 100  // Индекс сработает

Правила создания индексов

1. Индексируй поля в WHERE:

WHERE Контрагент = &Контрагент  // Индекс!

2. Индексируй поля в ORDER BY:

ORDER BY Дата DESC  // Индекс ускорит сортировку

3. Составные индексы: порядок важен

// WHERE Дата AND Статус → Индекс(Дата, Статус) - правильно
// WHERE Дата AND Статус → Индекс(Статус, Дата) - менее эффективно

4. Не переиндексируй:

// Слишком много индексов замедляет вставки
// Оптимум: 3-5 индексов на таблицу

Недостатки индексов

  • Замедляют вставку/обновление/удаление
  • Занимают место на диске (~30% от размера таблицы)
  • Требуют периодической дефрагментации

Правильное использование индексов — ключ к быстрым запросам в 1С.

Что такое индекс в 1С и какие виды индексов бывают? | PrepBro