Одна из задач, решаемых при помощи регистров расчета - получение оборотов регистра при помощи запросов к виртуальной таблице базовых данных или метода ПолучитьБазу(). Обороты регистра получаются на основании большого числа разных исходных данных, в том числе настроек и содержимого плана видов расчета, настроек регистра расчета, параметров виртуальной таблицы базовых данных и т.п. Но одну из существенных ролей при получении базовых данных играют измерения регистра расчета.
Один из важных параметров виртуальной таблицы базовых данных - список измерений, по которым выполняется сопоставление записей регистра при суммировании данных. Для решения разных задач, возможно, придется выполнять суммирование ресурсов регистра по разным наборам измерений. Рассмотрим на примере регистра, предназначенного для расчета зарплаты и имеющего три измерения:
Представим, что необходимо решить следующие задачи:
Все перечисленные задачи решаются при помощи запросов к виртуальной таблице базовых данных. При этом параметры "Измерения основного регистра" и "Измерения базового регистра" будут для всех трех задач разными. В первом случае измерение одно - "Подразделение"; во втором - "Физлицо" и "Подразделение"; в третьем - "Организация" и "Физлицо".
Для перечисленных выше случаев при формировании запроса к виртуальной таблице базовых данных система будет, в терминах языка запросов, выполнять "левое соединение" таблицы регистра расчета с той же таблицей. При этом одно из условий соединения - равенство значений в полях, заданных как измерения основного и базового регистра. Разумеется, помимо этого условия есть сравнение периода действия или периода регистрации с началом и окончанием базового периода, сравнение видов расчета и т.п., но самым "жестким" ограничением, как правило, бывает ограничение по значениям измерений.
Таким образом, для эффективной работы результирующего запроса важно иметь индекс таблицы регистра расчета, который в качестве первых полей содержал бы поля сопоставляемых измерений.
Возможность индексирования измерений регистра расчета позволяет решить такую задачу, но только для случая, когда сопоставляется одно измерение (в нашем примере - задача получения данных по подразделению). В том случае, когда сопоставляемых измерений два и более требуется построить индекс по нескольким измерениям сразу.
Именно эту задачу и позволяет решить свойство Базовое измерения регистра расчета. Устанавливая это свойство нескольким измерениям, разработчик конфигурации тем самым создает индекс по всем отмеченным как "базовые" измерениям (более подробно - см. раздел "Индексы таблиц базы данных").
Из сказанного ясно, что для регистра расчета можно создать только один такой индекс для оптимизации получения базовых данных, выбрав те или иные измерения. Таким образом, при разработке важно правильно оценить, какие именно виртуальные таблицы будут чаще использоваться, и оптимизация работы которых наиболее важна.
Вернемся к нашему примеру. Представим себе, что начисления, которые требуют получения данных по физлицу и подразделению будут при эксплуатации конфигурации встречаться реже, чем начисления, которые требуют получения данных по физлицу и организации. Тогда следует в качестве базовых измерений отметить измерения "Организация" и "Физлицо". Нам при этом придется мириться с тем, что получение базовых данных по физлицу и подразделению будет выполняться относительно медленно.
При выборе базовых измерений следует также оценивать их "селективность", т.е. представлять насколько много значений будет в том или ином измерении при эксплуатации конфигурации. Представим себе, что в нашем примере у одного физлица может встречаться очень мало (одна-две) организаций и относительно много подразделений. Т.е. физлицу почти всегда начисляется зарплата по одной организации и при этом часто начисляется зарплата по разным подразделениям. При таких обстоятельствах разумнее в качестве базовых выбрать измерения "Физлицо" и "Подразделение".
Но при этом важно помнить о порядке измерений регистра расчета...
Дело в том, что при создании индекса, который облегчит получение базовых данных, система включает в него измерения в той последовательности, в которой они расположены в дереве конфигурации. Это значит, что просто "переставив местами" измерения "Физлицо" и "Подразделение" мы поменяем порядок полей в индексе.
В нашем примере, если в качестве базовых выбраны измерения "Физлицо" и "Подразделения", то, переставив их местами, мы не изменим скорость получения базовых данных по физлицу и подразделению, но радикально ухудшим ситуацию с получением данных по физлицу и организации. При сравнении значений в полях "Организация" и "Физлицо" система не сможет использовать индекс Подразделение+Физлицо, так как поле "Физлицо" в нем не является первым, а на подразделение условие не налагается. А в случае индекса Физлицо+Подразделение выиграют и получение базовых данных по подразделению и физлицу, и получение базовых данных по организации и физлицу, так как поле "Физлицо" будет в индексе первым, то система сможет его использовать "частично" (по одному полю). Вместе с тем поле "Физлицо" обладает гораздо большей "селективностью", чем поле "Организация" и на отработку условия по организации не потребуется много времени.
Не забудем и про задачу нашего примера, предполагающую получение базовых данных только по подразделению. Казалось бы, создание индекса Физлицо+Подразделение для решения двух остальных задач исключает эффективную работу виртуальной таблицы базовых данных по одному измерению "Подразделение". Но здесь нужно вспомнить о возможности индексирования измерений регистра (свойство Индексирование). Возможность индексировать измерение позволяет эффективно решить задачу получения базы по одному базовому измерению.
Таким образом, в рассмотренном нами примере необходимо выставить свойство Базовое измерениям "Физлицо" и "Подразделение", свойство Индексирование измерению "Подразделение", а также убедится в том, что измерение "Физлицо" "выше" измерения "Подразделение" (порядок измерения "Организация" при этом не важен).