Подход к получению сведений об индексах может быть таким же, как тот, что мы использовали в предыдущей главе: не имея справочников, с помощью кода получить в отладчике структуру хранения данных:
ТаблицаСоСтруктурой = ПолучитьСтруктуруХраненияБазыДанных();
ТаблицаСоСтруктурой.Сортировать("Метаданные, ИмяТаблицыХранения");
Далее, спускаясь по структуре (расшифровываемые поля на рис. 3.13.1 подсвечены), узнать, какие есть индексы:





Рис. 3.13.1. Получение сведений об индексе непосредственно из базы
В примере на рисунках выше выяснено, что у таблицы документов один из индексов идет по номеру и ссылке.
Также из рисунков этого примера видно, как вообще добраться до информации об индексах. Нужно из первоначальной таблицы значений, в которую была получена структура базы, пройти по вложенной в нее таблице «Индексы», а из «Индексов» – пройти по таблице значений «Поля». Написание обработки, проходящей два уровня вложенных таблиц, затруднений вызвать не должно. Запустив ее, получим реально существующий состав индексов для нашей базы (в таблице 3.13.1 приведен его фрагмент). В колонке «Имя поля» курсивом дописаны описания на русском языке, не формирующиеся автоматически.
Таблица 3.13.1. Индексы, созданные в базе (фрагмент)
| Имя таблицы хранения | Метаданные + назначение | Имя индекса | Имя поля хранения | Имя поля | 
|---|---|---|---|---|
| "Const8" | "Константа.Константа1Константа" | |||
| "" | "" | "ByKey" | "RecordKey" | "" | 
| "Const10" | "Константа.Константа2Константа" | |||
| "" | "" | "ByKey" | "RecordKey" | "" | 
| "ConstChngR15" | "Константа.Константа2РегистрацияИзмененийКонстанты" | |||
| "" | "" | "ByNodeMsg" | "Node, MessageNo, ConstID" | ", , " (Узел + Номер сообщения + Ключ данных) | 
| "" | "" | "ByDataKey" | "ConstID, Node" | ", " (Ключ данных + Узел) | 
| "Document16" | "Документ.Документ1Основная" | |||
| "" | "" | "ByDocNum" | "Number, ID" | "Номер, Ссылка" | 
| "" | "" | "ByDocDate" | "Date_Time, ID" | "Дата, Ссылка" | 
| "DocumentJournal37" | "ЖурналДокументов.ЖурналДокументов1Основная" | |||
| "" | "" | "ByDocDate" | "Date_Time, Document" | "Дата, Ссылка" | 
| "" | "" | "ByDoc" | "Document" | "Ссылка" | 
| "Enum26" | "Перечисление.Перечисление1Основная" | |||
| "" | "" | "ByOrder" | "EnumOrder, ID" | "Порядок, Ссылка" | 
| "Seq41" | "Последовательность.Последовательность1Основная" | |||
| "" | "" | "ByRecorder" | "Recorder" | "Регистратор" | 
| "" | "" | "ByDims" | "Period, Recorder" | "Период, Регистратор" | 
| "AccumRg17" | "РегистрНакопления.РегистрНакопления1Основная" | |||
| "" | "" | "ByPeriod" | "Period, Recorder, LineNo" | "Период, Регистратор, НомерСтроки" | 
| "" | "" | "ByRecorder" | "Recorder, LineNo" | "Регистратор, НомерСтроки" | 
| "AccumRgAggGrid92" | "РегистрНакопления.РегистрНакопления1СписокАгрегатовРегистровНакопления" | |||
| "" | "" | "ByID" | "RegID, DefaultPeriodic, ID, Updated" | ", , , " | 
| "AccumRgAggOpt94" | "РегистрНакопления.РегистрНакопления1НастройкиРежимаАгрегатовРегистровНакопления" | |||
| "" | "" | "ByID" | "RegID" | "" | 
| "AccumRgOpt20" | "РегистрНакопления.РегистрНакопления1НастройкиХраненияИтоговРегистраНакопления" | |||
| "" | "" | "ByRegID" | "RegID" | "" | 
| "AccumRgT19" | "РегистрНакопления.РегистрНакопления1Итоги" | |||
| "" | "" | "ByDims" | "Period, Fld96, Splitter" | ", Измерение1, " | 
| "InfoRg38" | "РегистрСведений.РегистрСведений1Основная" | |||
| "" | "" | "ByDims" | "Fld39" | "Измерение1" | 
| "Reference7" | "Справочник.Справочник1Основная" | |||
| "" | "" | "Code" | "Code, ID" | "Код, Ссылка" | 
| "" | "" | "Descr" | "Description, ID" | "Наименование, Ссылка" | 
| "ReferenceChngR14" | "Справочник.Справочник1РегистрацияИзменений" | |||
| "" | "" | "ByNodeMsg" | "Node, MessageNo, ID" | ", , " (Узел + Номер сообщения + Ключ данных) | 
| "" | "" | "ByDataKey" | "ID, Node" | ", " (Ключ данных + Узел)  |       
Описанный способ получения существующих индексов не выводит, однако, есть несколько важных вещей:
Кластерным называется индекс, по значению которого отсортирована таблица в базе.
Остальные индексы называются некластерными. Таблица может иметь только один кластерный индекс или не иметь ни одного. Некластерных индексов может быть несколько, или может не быть совсем.
Кластерный индекс для необъектных типов данных, в отличие от объектных, в таблицу, получаемую через ПолучитьСтруктуруХраненияБазыДанных(), попадает. В таблице выше кластерные индексы выделены жирным шрифтом.
Данные по тому, какие индексы являются кластерными, получены как из литературы, так и через просмотр свойств базы средствами SQL Server Management Studio. Этот альтернативный предложенному ранее способ получения информации о структуре базы более точен (видны все таблицы, все индексы, все реквизиты, по которым индекс строится), но значительно менее удобен в том, что нет привязки к именам таблиц в терминах метаданных, а также в том, что годится только для SQL Server. К слову, создание индексов не через конфигуратор, а средствами сервера СУБД строго не рекомендуется и, кроме прочего, нарушает лицензионное соглашение.
Далее, хотя мы описали методику получения фактического состава индексов в базе, нелишним будет привести сведения по текущим правилам построения индексов хотя бы для справочников, документов, регистров сведений, накопления и бухгалтерии, т. е. для того, с чем чаще всего приходится иметь дело. Использованы фрагменты статьи с сайта ИТС, статья находится в открытом доступе.
<...> Индексы таблиц создаются неявным образом при создании объектов конфигурации, а также при тех или иных настройках объектов конфигурации. Для тех случаев, когда создание индексов зависит от настроек объектов конфигурации, приведены условия создания индексов.
В приведенных ниже таблицах имена индексных полей приведены так, как они описаны в разделе документации «Таблицы запросов».
Для измерений, реквизитов и т. д. применяются условные имена Измерение1, Реквизит1 и т. д.
Для общих реквизитов, являющихся разделителями в режиме «независимо», будем использовать имена ОРНР (ОРНР1, ОРНР2, и т. д.).
Для общих реквизитов, являющихся разделителями в режиме «независимо и совместно», будем использовать имена ОРСР.
Если режим разделения не имеет значения, то для общих реквизитов, являющихся разделителями, будем использовать имена ОРР.
Если в конфигурации определены разделители, то в индексы может входить поле, которое содержит значение хеш-функции набора значений разделителей. Такое поле будем обозначать именем ОРРХ.
Те индексные поля, которые не являются обязательными, приведены в квадратных скобках, а если в индексе присутствует набор однотипных полей, это описывается многоточием, например: Реквизит + Измерение1 + [Измерение2 +...].
Данным материалом следует руководствоваться при написании текстов запросов с целью оптимизации времени их исполнения.
Справочник
Основные индексы
| Индекс | Условие | 
|---|---|
| [ОРНР1 + ... +] Ссылка (Кластерный) | Всегда. В индекс входят поля независимых разделителей, которые разделяют этот справочник | 
| [ОРРХ | ОРНР1 +] Код + Ссылка | Свойство «Длина кода» не равно 0. Если справочник разделяется одним независимым разделителем, тип которого не Строка, то индекс содержит поле этого разделителя. Если тип разделителя – Строка, или разделитель независимый и совместный, или разделителей больше одного, то индекс содержит поле значения хеш-функции значений разделителей. Это правило справедливо для всех индексов, в составе которых указано [ОРРХ | ОРНР1 +]  |       
| [ОРРХ | ОРНР1 +] Наименование + Ссылка | Свойство «Длина наименования» не равно 0 | 
| [ОРРХ | ОРНР1 +] Реквизит + Ссылка | Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать» | 
| [ОРРХ | ОРНР1 +] Реквизит + Код + Ссылка | Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. Упорядочиванием», и при этом свойство «Длина кода» не равно 0, а свойство «Основное представление» равно «В виде кода» | 
| [ОРРХ | ОРНР1 +] Реквизит + Наименование + Ссылка | Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием», и при этом свойство «Длина наименования» не равно 0, а свойство «основное представление» равно «В виде наименования» | 
| [ОРРХ | ОРНР1 +] Реквизит | Справочник включен в критерий отбора через реквизит «Реквизит» | 
<...>
Документ
| Индекс | Условие | 
|---|---|
| [ОРНР1 + ... +] Ссылка (Кластерный) | Всегда. В индекс входят поля независимых разделителей, которые разделяют этот документ | 
| [ОРРХ | ОРНР1 +] Дата + Ссылка | Всегда | 
| [ОРРХ | ОРНР1 +] Номер + Ссылка | Свойство «Длина номера» не равно 0 | 
| [ОРРХ | ОРНР1 +] Реквизит + Ссылка | Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать» | 
| [ОРРХ | ОРНР1 +] Реквизит + Дата + Ссылка | Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» | 
| [ОРРХ | ОРНР1 +] Реквизит | Документ включен в критерий отбора через реквизит «Реквизит» | 
| [ОРРХ | ОРНР1 +] ПрефиксНомера + Номер + Ссылка | Свойство «Длина номера» не равно 0 | 
<...>
Табличная часть
| Индекс | Условие | 
|---|---|
| [ОРНР1 + ... +] Ссылка + Ключ (Кластерный) | Всегда. В индекс входят поля независимых разделителей, разделяющих объект, которому принадлежит табличная часть | 
| [ОРНР1 + ... +] Реквизит + Ссылка | Объект конфигурации включен в критерий отбора через реквизит «Реквизит» табличной части, или для реквизита табличной части установлено свойство «Индексировать». В индекс входят поля независимых разделителей, разделяющих объект, которому принадлежит табличная часть | 
Для всех таблиц, которые предоставляют доступ к табличным частям объектов.
Регистр сведений
Непериодический регистр сведений
| Индекс | Условие и описание | 
|---|---|
| [ОРРХ | ОРНР1 +] Измерение1 + [Измерение2 +...] (Кластерный) | Есть хоть одно измерение регистра. Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании. Индекс кластерный, если регистр независимый  |       
| [ОРРХ | ОРНР1 +] ИзмерениеN + Измерение1 + [Измерение2 +...] | Измерению «ИзмерениеN» задано свойство «Индексировать» или свойство «Ведущее», и при этом это не первое и не единственное измерение. Индекс, включающий все измерения. Первое поле – «ИзмерениеN», затем все остальные измерения в том порядке, в котором они заданы при конфигурировании | 
| [ОРРХ | ОРНР1 +] Реквизит + Измерение1 + [Измерение2 +...] | Реквизиту «Реквизит» задано свойство «Индексировать». Индекс, в котором первое поле – «Реквизит», затем все измерения в том порядке, в котором они заданы при конфигурировании | 
| [ОРРХ | ОРНР1 +] SimpleKey | Количество измерений больше одного. Используется для обхода регистра при реструктуризации, а также для выборки записей с использованием оптимального порядка обхода | 
| [ОРРХ | ОРНР1 +] Ресурс + Измерение1 + [Измерение2 +...] | Ресурсу «Ресурс» задано свойство «Индексировать». Индекс, в котором первое поле – «Ресурс», затем все измерения в том порядке, в котором они заданы при конфигурировании  |       
Периодический регистр сведений
| Индекс | Условие и описание | 
|---|---|
| [ОРРХ | ОРНР1 +] Период + [Измерение1 + ...] (Кластерный) (для 8.2) [ОРРХ | ОРНР1 +] [Измерение1 + ...] + Период (Кластерный) (для 8.3) | Всегда | 
| [ОРРХ | ОРНР1 +] Измерение1 + [Измерение2 +...] + Период (для 8.2) [ОРРХ | ОРНР1 +] Период + Измерение1 + [Измерение2 +...] (для 8.3)  |           Есть хоть одно измерение регистра. Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании и поле «Период» | 
| [ОРРХ | ОРНР1 +] ИзмерениеN + Период + Измерение1 + [Измерение2 +...] | Измерению «ИзмерениеN» задано свойство «Индексировать» или свойство «Ведущее», и при этом это не единственное измерение. Индекс, включающий поле «Период» и все измерения. Первое поле – «ИзмерениеN», затем поле «Период», затем все остальные измерения в том порядке, в котором они заданы при конфигурировании | 
| [ОРРХ | ОРНР1 +] Реквизит + Период + [Измерение1 + ...] | Реквизиту «Реквизит» задано свойство «Индексировать». Индекс, в котором первое поле – «Реквизит», затем поле «Период», затем все измерения в том порядке, в котором они заданы при конфигурировании | 
| [ОРРХ | ОРНР1 +] Ресурс + Период + [Измерение1 + ...] | Ресурсу «Ресурс» задано свойство «Индексировать». Индекс, в котором первое поле – «Ресурс», затем поле «Период», затем все измерения в том порядке, в котором они заданы при конфигурировании  |       
Дополнительный индекс для регистра сведений, подчиненного регистратору
| Индекс | Условие и описание | 
|---|---|
| [ОРНР1 + ... +] Регистратор + НомерСтроки (Кластерный) | Всегда. В индекс входят поля независимых разделителей, которые разделяют этот регистр. Индекс кластерный, если регистр непериодический  |       
Регистр сведений с периодичностью «По позиции регистратора»
| Индекс | Условие и описание | 
|---|---|
| [ОРРХ | ОРНР1 +] Период + Регистратор + НомерСтроки (Кластерный) | Всегда | 
| [ОРНР1 + ... +] Регистратор + НомерСтроки | Всегда. В индекс входят поля независимых разделителей, которые разделяют этот регистр | 
| [ОРРХ | ОРНР1 +] Измерение1 + [Измерение2 + ...] + Период + Регистратор + НомерСтроки | Есть хоть одно измерение регистра. Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, поле «Период» и поле «Регистратор» | 
| [ОРРХ | ОРНР1 +] Измерение + Период + Регистратор + НомерСтроки | Измерению «Измерение» задано свойство «Индексировать» | 
| [ОРРХ | ОРНР1 +] Реквизит + Период + Регистратор + НомерСтроки | Реквизиту «Реквизит» задано свойство «Индексировать» | 
| [ОРРХ | ОРНР1 +] Ресурс + Период + Регистратор + НомерСтроки | Ресурсу «Ресурс» задано свойство «Индексировать» | 
Регистр накопления
Основная таблица регистра
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] Период + Регистратор + НомерСтроки (Кластерный) | Всегда | 
| [ОРНР1 + ... +] Регистратор + НомерСтроки | Всегда. В индекс входят поля независимых разделителей, которые разделяют этот регистр | 
| [ОРРХ | ОРНР1 +] Измерение + Период + Регистратор + НомерСтроки | Измерению «Измерение» задано свойство «Индексировать» | 
| [ОРРХ | ОРНР1 +] Реквизит + Период + Регистратор + НомерСтроки | Реквизиту «Реквизит» задано свойство «Индексировать» | 
Таблица остатков
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] Период + Измерение1 + ... + ИзмерениеN (Кластерный) ) + Splitter | Для регистров вида «Остатки» | 
| [ОРРХ | ОРНР1 +] Измерение + Период | Измерению «Измерение» задано свойство «Индексировать» | 
Таблица оборотов
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] Период + Измерение1 + ... + ИзмерениеN (Кластерный) + Splitter | Для регистров вида «Обороты» | 
| [ОРРХ | ОРНР1 +] Измерение + Период | Измерению «Измерение» задано свойство «Индексировать» | 
<...>
Регистр бухгалтерии
Основная таблица регистра без корреспонденции
| Индекс | Условие и описание | 
|---|---|
| [ОРРХ | ОРНР1 +] Период + Регистратор + НомерСтроки (Кластерный) | Всегда | 
| [ОРНР1 + ... +] Регистратор + НомерСтроки | Всегда. В индекс входят поля независимых разделителей, которые разделяют этот регистр | 
| [ОРРХ | ОРНР1 +] Счет + Период + Регистратор | Регистру назначен план счетов | 
| [ОРРХ | ОРНР1 +] Измерение + Период + Регистратор + НомерСтроки | Измерению «Измерение» задано свойство «Индексировать» | 
| [ОРРХ | ОРНР1 +] Реквизит + Период + Регистратор + НомерСтроки | Реквизиту «Реквизит» задано свойство «Индексировать» | 
Основная таблица регистра с корреспонденцией
От вышеприведенного состава индексов отличается лишь тем, что вместо индекса по счету создаются два индекса по счету дебета и счету кредита.
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] СчетДт + Период + Регистратор | Регистру назначен план счетов | 
| [ОРРХ | ОРНР1 +] СчетКт + Период + Регистратор | Регистру назначен план счетов | 
Таблица итогов по счету
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] Период [+ Счет] + ИзмерениеБезПризнакаУчета1 + ... + ДополнительноеИзмерение1 + ... + ИзмерениеСПризнакомУчета1 + ... [+ ХэшИзмерений] [+ РазделительИтогов] | Поле «Счет» добавляется в случае, если регистру определен план счетов. Поле «ХэшИзмерений» добавляется, количество других полей больше 15. Поле «РазделительИтогов» добавляется, если включено разделение итогов  |       
Таблица итогов между счетами
Только для регистров, поддерживающих корреспонденцию.
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] ИзмерениеДт1 + ИзмерениеКт1 + ... Измерение1 + ... [+ ХэшИзмерений] [+ РазделительИтогов]  |           Для небалансовых измерений. Для балансовых измерений. Поле «ХэшИзмерений» добавляется, количество других полей больше 15. Поле «РазделительИтогов» добавляется, если включено разделение итогов  |       
Таблица со значениями субконто
| Индекс | Условие | 
|---|---|
| [ОРРХ | ОРНР1 +] Регистратор + НомерСтроки + Корреспонденция | Всегда | 
| [ОРРХ | ОРНР1 +] Период + Регистратор + НомерСтроки + ВидСубконто + Корреспонденция (Кластерный) | Всегда | 
| [ОРРХ | ОРНР1 +] ВидСубконто + Значение | Всегда | 
<...>