← Назад к вопросам
Что такое индекс в 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: Поиск по диапазону дат
// БЕЗ индекса — медленно (просмотр всех строк)
Запрос = Новый Запрос("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С.