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

Имеет ли значение порядок измерений в регистрах 1С?

2.2 Middle🔥 151 комментариев
#Регистры

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

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

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

Ответ

Да, порядок измерений в регистрах 1С имеет значение. Это критически важный аспект, влияющий на производительность запросов и логику работы регистров.

Основное определение

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

Порядок измерений влияет на:

  1. Индексирование в БД — создаются индексы по порядку измерений
  2. Производительность запросов — оптимизация плана выполнения
  3. Скорость поиска — быстрее находить записи
  4. Объём памяти — эффективность кэширования

Как создаются индексы

В 1С по измерениям автоматически создаётся составной индекс в порядке их следования:

-- Если регистр имеет измерения в порядке:
-- 1. Период
-- 2. Счёт
-- 3. Контрагент

CREATE INDEX idx_registr ON registr (Period, Account, Counterparty);

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

Сценарий 1: Оптимальный порядок

Порядок измерений:

  1. Товар (часто используется в WHERE)
  2. Склад (часто используется в WHERE)
  3. Период (менее часто)
// Быстрый запрос (использует индекс полностью)
Запрос = Новый Запрос(
    "ВЫБРАТЬ Сальдо
     ИЗ РегистрСведений.ОстаткиТоваров
     ГДЕ Товар = &Товар
       И Склад = &Склад
       И Период <= &Дата"
);
// Индекс (Товар, Склад, Период) позволяет быстро найти запись

Сценарий 2: Неоптимальный порядок

Порядок измерений:

  1. Период (в начале)
  2. Склад
  3. Товар
// Медленный запрос (индекс используется только по Период)
Запрос = Новый Запрос(
    "ВЫБРАТЬ Сальдо
     ИЗ РегистрСведений.ОстаткиТоваров
     ГДЕ Товар = &Товар
       И Склад = &Склад
       И Период <= &Дата"
);
// Индекс (Период, Склад, Товар) используется только по Период
// БД должна просканировать много строк с одинаковым Период

Правило левого префикса (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. Период   (может быть последним)

Изменение порядка (важно!)

Осторожно! Если вам нужно изменить порядок измерений:

  1. Это требует перестроения структуры таблицы в БД
  2. На большом объёме данных это может занять время
  3. Нужна миграция данных (перезапись)
// При добавлении нового регистра из старой конфигурации
НовыйРегистр = РегистрыСведений.ОстаткиТоваров_Новый;
СтарыйРегистр = РегистрыСведений.ОстаткиТоваров_Старый;

Выборка = СтарыйРегистр.Выбрать();
Пока Выборка.Следующий() Цикл
    НоваяЗапись = НовыйРегистр.СоздатьМенеджер();
    НоваяЗапись.Товар = Выборка.Товар;
    НоваяЗапись.Склад = Выборка.Склад;
    НоваяЗапись.Период = Выборка.Период;
    НоваяЗапись.Сальдо = Выборка.Сальдо;
    НоваяЗапись.Записать();
КонецЦикла;

Заключение

Вывод: Порядок измерений — это ключевой аспект проектирования регистров, прямо влияющий на производительность системы. Неправильный порядок может привести к:

  • Медленным запросам
  • Излишним операциям ввода-вывода
  • Повышенному потреблению памяти

Перед созданием регистра проанализируйте типичные запросы и расставьте измерения в порядке убывания частоты их использования в условиях WHERE.

Имеет ли значение порядок измерений в регистрах 1С? | PrepBro