Имеет ли значение порядок измерений в регистрах 1С?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ
Да, порядок измерений в регистрах 1С имеет значение. Это критически важный аспект, влияющий на производительность запросов и логику работы регистров.
Основное определение
Измерения — это поля регистра, которые однозначно идентифицируют запись. Комбинация значений измерений должна быть уникальной в регистре.
Порядок измерений влияет на:
- Индексирование в БД — создаются индексы по порядку измерений
- Производительность запросов — оптимизация плана выполнения
- Скорость поиска — быстрее находить записи
- Объём памяти — эффективность кэширования
Как создаются индексы
В 1С по измерениям автоматически создаётся составной индекс в порядке их следования:
-- Если регистр имеет измерения в порядке:
-- 1. Период
-- 2. Счёт
-- 3. Контрагент
CREATE INDEX idx_registr ON registr (Period, Account, Counterparty);
Влияние порядка на производительность запросов
Сценарий 1: Оптимальный порядок
Порядок измерений:
- Товар (часто используется в WHERE)
- Склад (часто используется в WHERE)
- Период (менее часто)
// Быстрый запрос (использует индекс полностью)
Запрос = Новый Запрос(
"ВЫБРАТЬ Сальдо
ИЗ РегистрСведений.ОстаткиТоваров
ГДЕ Товар = &Товар
И Склад = &Склад
И Период <= &Дата"
);
// Индекс (Товар, Склад, Период) позволяет быстро найти запись
Сценарий 2: Неоптимальный порядок
Порядок измерений:
- Период (в начале)
- Склад
- Товар
// Медленный запрос (индекс используется только по Период)
Запрос = Новый Запрос(
"ВЫБРАТЬ Сальдо
ИЗ РегистрСведений.ОстаткиТоваров
ГДЕ Товар = &Товар
И Склад = &Склад
И Период <= &Дата"
);
// Индекс (Период, Склад, Товар) используется только по Период
// БД должна просканировать много строк с одинаковым Период
Правило левого префикса (Leading Column Rule)
Индекс работает эффективно только если WHERE-условия начинаются с его левого префикса.
Индекс (Товар, Склад, Период):
// ✓ БЫСТРО — используется весь индекс
ГДЕ Товар = &Товар И Склад = &Склад И Период = &Период
// ✓ БЫСТРО — используется префикс (Товар, Склад)
ГДЕ Товар = &Товар И Склад = &Склад
// ✓ БЫСТРО — используется префикс (Товар)
ГДЕ Товар = &Товар
// ✗ МЕДЛЕННО — прыгаем через Товар, индекс не используется
ГДЕ Склад = &Склад И Период = &Период
// ✗ МЕДЛЕННО — начинаем не с первого элемента индекса
ГДЕ Период = &Период
Практический пример: регистр сведений "Остатки товара"
Неправильный порядок:
Измерения:
1. Период (может быть разным)
2. Дата (может быть разной)
3. Номенклатура (часто используется в запросах)
4. Склад (часто используется в запросах)
// Типичный запрос:
Запрос = Новый Запрос(
"ВЫБРАТЬ Сальдо
ИЗ РегистрСведений.ОстаткиТоваров
ГДЕ Номенклатура = &Номенклатура // 3-е измерение
И Склад = &Склад // 4-е измерение
И Период = &Период" // 1-е измерение
);
// Индекс (Период, Дата, Номенклатура, Склад) плохой
// БД сканирует много ненужных строк
Правильный порядок:
Измерения:
1. Номенклатура (самое часто используемое)
2. Склад (второе по популярности)
3. Период (третье)
4. Дата (редко как фильтр)
// Типичный запрос (теперь быстрый):
Запрос = Новый Запрос(
"ВЫБРАТЬ Сальдо
ИЗ РегистрСведений.ОстаткиТоваров
ГДЕ Номенклатура = &Номенклатура // 1-е измерение ✓
И Склад = &Склад // 2-е измерение ✓
И Период = &Период" // 3-е измерение ✓
);
// Индекс (Номенклатура, Склад, Период, Дата) идеален
Как выбрать правильный порядок
Правило 1: Частота использования в WHERE
Постройте список условий WHERE по частоте использования и в этом порядке расставьте измерения.
// Анализ запросов:
// 1. Товар используется в 95% запросов
// 2. Склад в 80% запросов
// 3. Период в 60% запросов
// 4. Контрагент в 30% запросов
// Оптимальный порядок измерений:
// 1. Товар
// 2. Склад
// 3. Период
// 4. Контрагент
Правило 2: Кардинальность (uniqueness)
Если одно измерение имеет малое число уникальных значений (низкая кардинальность), его лучше поставить позже.
Было ошибочно в начале:
1. Активность (2 значения: Истина/Ложь) ← низкая кардинальность
2. Товар (10000 значений) ← высокая кардинальность
Правильно:
1. Товар (высокая кардинальность) ← сужает поиск сильнее
2. Активность (низкая кардинальность)
Правило 3: Диапазоны vs точные условия
Если используются диапазоны (>=, <=, BETWEEN), это измерение лучше поставить последним в группе фильтров.
// Хороший порядок:
// 1. Товар (= Товар1)
// 2. Склад (= Склад1)
// 3. Период (Период >= &ДатаНач И Период <= &ДатаКон)
Измерения в этом порядке
Практический совет для бухучёта
Регистр "ОборотыПоСчетам":
Меньше оптимально:
1. Период (изменяется часто)
2. Счёт (используется всегда)
3. СубСчёт (иногда)
Оптимально:
1. Счёт (первично в любом запросе о счёте)
2. СубСчёт (часто дополняет Счёт)
3. Период (может быть последним)
Изменение порядка (важно!)
Осторожно! Если вам нужно изменить порядок измерений:
- Это требует перестроения структуры таблицы в БД
- На большом объёме данных это может занять время
- Нужна миграция данных (перезапись)
// При добавлении нового регистра из старой конфигурации
НовыйРегистр = РегистрыСведений.ОстаткиТоваров_Новый;
СтарыйРегистр = РегистрыСведений.ОстаткиТоваров_Старый;
Выборка = СтарыйРегистр.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяЗапись = НовыйРегистр.СоздатьМенеджер();
НоваяЗапись.Товар = Выборка.Товар;
НоваяЗапись.Склад = Выборка.Склад;
НоваяЗапись.Период = Выборка.Период;
НоваяЗапись.Сальдо = Выборка.Сальдо;
НоваяЗапись.Записать();
КонецЦикла;
Заключение
Вывод: Порядок измерений — это ключевой аспект проектирования регистров, прямо влияющий на производительность системы. Неправильный порядок может привести к:
- Медленным запросам
- Излишним операциям ввода-вывода
- Повышенному потреблению памяти
Перед созданием регистра проанализируйте типичные запросы и расставьте измерения в порядке убывания частоты их использования в условиях WHERE.