Регистры сведений. За кулисами. Часть №1. Структура хранения

26 мая 2015

О чем речь

Сегодня мы поговорим о регистрах сведений. Но не о на настройках и их правильном использовании, а о скрытой от разработчиков стороне СУБД.

Рассмотрим как регистры сведений хранятся в базе данных, какие SQL-запросы выполняет платформа и как меняется взаимодействие платформы и СУБД с выходом платформы 8.3.

Структура хранения

Структура таблиц, используемая для хранения данных и настроек регистра сведений, меняется в зависимости от настроек объекта метаданных в конфигураторе. Следующие настройки влияют на то, как будет платформ 1С:Предприятие 8.x хранить данные в базе:

Периодичность и режим записи

Разрешение итогов

Рассмотрим влияние этих настроек с простого примера. В тестовой базе у нас есть непериодический регистр сведений "Настройки":

Простой регистр сведений

Единственное измерение "СтаутсТовара" ссылается на перечисление, все ресурсы имеют примитивные типы. Структура хранения такого регистра ограничивается только одной таблицей в базе данных:

Структура хранения простого

Как видно из рисунка, структура хранения такого регистра достаточно примитивна. Каждому полю регистра в дереве метаданных конфигурации соответствует поле таблицы на стороне СУБД.

Рассмотрим еще один простой пример.Простой периодический регистр сведений

Структура метаданных этого регистра также достаточно простая: измерение "Товар", ссылающееся на справочник "Товары", и ресурс "Статус", ссылающееся на перечисление "СтатусыТоваров". Отличие настроек этого регистра от предыдущего кроется в параметре "Периодичность", которая теперь установлена в значение "В пределах дня". Структура таблицы в базе для этого регистра будет следующей:

Простой периодический регистр сведений

Значения периодичностиКроме полей измерений и ресурсов в таблицу добавлено поле "Period", в котором хранится значение даты и времени записи. Вне зависимости от значения периодичности структура таблицы регистра не изменится. Если же обратно поменять периодичность в значение "Непериодический", то из структуры таблицы будет удалено поле "Period".

Если для регистра поставить настройку "Режим записи" в "Подчиненный регистратору", то в таблицу дополнительно добавится поле "RecorderRFef", в котором будет хранится ссылка на документ-регистратор, а также поле "LineNo" (Номер строки) и "Active" (Активность). Отдельно этот пример рассматривать не будем. Давайте лучше посмотрим на структуру периодического регистра сведений с включенной опцией хранения итогов среза последних:

Настройки регистра сведений (подчиненный регистратору + периодический по позиции регистратора + включены итоги среза последних записей

Регистр с такими настройками использует две таблицы в базе данных. Первая - это основная таблица регистра:

Структура основной таблицы регистра сведений

Как раньше и было сказано, в таблице содержатся поля измерений и ресурсов регистра. Т.к. регистр подчинен регистратору, то в состав полей добавлено поле "RecorderRRef", в котором хранится ссылка на документ-регистратор. Периодичность у регистра установлена в "По позиции регистратора", но поле "Period" в таблице все равно осталось. При такой настройке в этом поле хранится дата и время документа.

Вторая таблица - это таблица итогов среза последних записей:

Таблица итогов среза последних

В ней хранятся последние записи регистра в разрезе периодов. В структуру таблицы входят измерения и ресурсы регистра, период, регистратор (если регистр подчинен регистратору) и реквизиты регистра (в нашем примере их нет). 

Также бы выглядела и таблица итого среза первых, только хранила бы она срез первых записей в разрезе периодов. О плюсах использования таблиц итого регистров сведений мы поговорим позже.

Таблица настроек хранения итогов регистра сведенийОтдельно стоит упомянуть о таблице настроек хранения итогов регистра сведений. Для последнего примера эта таблица выглядит так (см. след. скриншот).

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

Управление итогами

Таблица настроек хранения итогов добавляется для регистра сведений, если значение периодичности регистра отличается от значения "Непериодический".

Рассмотрим пример формирования платформой таблиц итогов среза первых и среза последних.

Пример формирования таблиц итогов

Например, таблица движений регистра "Цены номенклатуры", который мы рассматривали в предыдущем примере, содержит следующие записи:

Данные регистра сведений

Тогда таблица итогов среза последних записей будет выглядеть так:

Содержимое таблицы итогов среза последних записей

То есть в таблицу попали последние по периоду записи в разрезе измерений регистра. По такому же принципу формируется таблица итогов среза первых, только берутся самые первые записи в таблице движений:

Содержимое таблицы итогов среза первых записей

Таким образом, таблицы итогов позволяют значительно ускорить выполнения запросов получения срезов последних / первых записей регистров. Подробнее об этом мы поговорим в следующей части статьи.

Вместо заключения

В статье мы рассмотрели варианты хранения регистров сведений на стороне СУБД в зависимости от их настроек, а также познакомились со служебными таблицами регистра для хранения итогов и настроек хранения итогов. Стоит отметить, что возможность хранения итогов для регистров сведений появилась только в версии 8.3.

В следующей статье мы отловим SQL Profiler'ом запросы, которые формирует платформа 1С:Предприятие к СУБД при работе с регистрами сведений.


comments powered by Disqus