Физическая структура базы 1С

Физическая структура базы 1СДля понимания информации следующих разделов необходимо разобраться как данные 1С физически хранятся в базе данных СУБД MS SQL
1С применяет понятное название таблиц в базе:
_Reference — справочники;
_Document — документы;
_Seq – последовательности;
_InfoRg – регистры сведений;
_AccumRg – регистры накопления.
http://help1c.com/faq/view/673.htm — названия таблиц 1С (какой-то старый вариант).
Функция платформы «ПолучитьСтруктуруХраненияБазыДанных()» используется для получение соответствия названий объектов 1С и названий физических таблиц СУБД для хранения этих объектов (http://v8.1c.ru/metod/faq2/answer.jsp?id=493).

Для гарантии уникальности имен таблиц, платформа 1С применяет глобальную сквозную нумерацию всех таблиц (следующий числовой номер «<n>» добавляется в название каждой новой таблицы). Например «_InfoRg31».

Для просмотра соответствия объектов конфигурации физической структуре базы полезна обработка «СтруктураТаблиц».

Рассмотрим хранение разных типов объектов:

Константы
До версии 8.2.14 все константы хранились в одной таблице «_Consts» (без номера «<n>»).
С версии 8.2.14 каждая константа хранится в своей отдельной таблице «_Const<n>» из одной строки.

Понятие ссылки
В соответствии с теорией реляционных БД каждая строка таблицы должна быть уникальна.
Можно применять автотинкремент, но 1С применяет GUID.
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность. Уникальность не гарантируется, но вероятность повторения крайне мала (3,402 * 10 в 38 степени вариантов).

 

 

Физическая структура базы 1С

 

Ссылка (RRef) это идентификатор типа и GUID.

 

 

 

Объект не найден (48:b3e2001617ec3f2a11e1912c787ec129) –  это строка с RRef = b3e2001617ec3f2a11e1912c787ec129 в таблице с <n> = 48.

Другое представление ссылки: 787ec129-912c-11e1-b3e2-001617ec3f2a (http://help1c.com/faq/view/483.html).
В GUID где-то зашифрованы дата и время его генерации, но разработчики платформы строго не советуют строить свои решения на попытке анализировать «что находится в ГУИДе». Фактически, ничего, кроме уникальности, не гарантировано.

Смещение дат
MS SQL имеет проблемы с хранением дат менее 1753 года (год синхронизации Юлианского и Григорианского календарей). Для того что бы не зависеть от проблем с датами для базы 1С (например при записи пустой даты «01.01.0001») при ее создании можно включить «Смещение дат». При включенном смещении дат все даты хранятся в базе со смещение в 2000 лет («01.01.2014» будет хранится как «01.01.4014»).

Физическая структура базы 1С

 

Справочники
Таблица справочников «_Reference<n>» — основная таблица, имеющая обязательные поля:
Физическая структура базы 1ССсылка (_IDRRef «0x883A0013E8D1C89D11E42862746C6788»);
Версия (_Version) – используется в механизме оптимистических объектных блокировок;
Признак предопределенного (_IsMetadata);
Пометка удаления (_Marked);
Поля шапки (_Fld<n>);
Код (_Code);
Наименование (_Description);
Поля (_Fld<n>).
В 8.3 вместо признака «Предопределенный» (_IsMetadata) используется идентификатор предопределенного (_PredefinedID).

Физическая структура базы 1С

Документы
Физическая структура базы 1СТаблица «шапок» документов «_Document<n>» — основная таблица, имеющая обязательные поля:
Ссылка (_IDRRef);
Версия (_Version);
Дата (_Date_Time);
Номер (_Number);
Пометка удаления (_Marked);
Признак проведения (_Posted);
Поля шапки (_Fld<n>)

 

Физическая структура базы 1СТаблицы табличных частей «_Document<n>_VT<k>». Для каждой табличной части используется отдельная физическая таблица.
Связь таблицы «шапок» с табличными частями осуществляется по ссылке: В таблицах табличных частей присутствует поле «_Document<n>_IDRRef» — ссылка на строку документа-владельца в таблице «шапок».

 

Физическая структура базы 1С

 

Составные типы данных
Составной тип данных физически храниться в базе, используя несколько полей:

Физическая структура базы 1С

Физическая структура базы 1С

 

 

 

 

 

 

 

 

 

«_TYPE» – простой тип или ссылочный (0x8);
«_RTRef» – Для ссылочных типов, номер таблицы (), в которой находится ссылка;
«_RRRef» – Для ссылочных типов, значение ссылки (b3e2001617ec3f2a11e1912c787ec129) – идентифицирует строку в таблице ().
Поля для хранения простых типов (если они используются): «_L» – булево, «_N» — число, «_T» — дата, «_S» — строка.

Физическая структура базы 1С

 

Регистры сведений

Физическая структура базы 1С

 

Физическая структура базы 1С

 

 

 

 

 

 

Одна таблица движений «_InfoRg<n>» содержит поля измерений, ресурсов, реквизитов (_Fld <n>). Если регистр периодический, то добавляется поле «Период» (_Period). Если регистр подчинен регистратору, то добавляются поля для хранения данных регистратора: тип, ссылка, номер строки, активность (_RecorderTRef, _RecorderRRef, _LineNo, _Active).

Физическая структура базы 1С

 

Регистры накопления

Физическая структура базы 1СКаждый регистр накопления состоит из двух физических таблиц: таблица движений и таблица итогов.
Таблица движений: «_AccumRg<n>» — основная таблица регистра. Используется для хранения всех движений регистра в привязке к регистратору (документу). Поля таблицы движений следующие: Период, регистратор, номер строки, признак активности, вид движения (только для остаточных регистров), поля измерений, ресурсов и реквизитов (_Period , _RecorderTRef, _RecorderRRef, _LineNo, _Active, _RecordKind). Поля измерений, ресурсов и реквизитов (_Fld<n>).

 

Физическая структура базы 1С

 

Физическая структура базы 1С

Таблица итогов: «_AccumRgT<n>» — с суффиксом «T» для остаточных регистров и «_AccumRgTn<n>» — с суффиксом «Tn» для оборотных). Таблицы итогов регистров используются для хранения промежуточных итогов ресурсов в разрезе периодов (месяцев) и измерений (но не реквизитов). Поля таблицы итогов следующие: Период(_Period), поля измерений, поля ресурсов (_Fld<n>).

Физическая структура базы 1С

Таблица итогов необходима для оптимального получения итогов на определенный период. Таблица итогов содержит вторичную (вспомогательную) информацию, которая рассчитана, сгруппирована (агрегирована) на основании данных таблицы движений (основной таблицы). В расчете итогов участвуют только АКТИВНЫЕ записи таблицы движений (признак активности «_Active»).

Как итоги оптимизируют получение данных из регистра: представим ситуацию получения итогов регистра на определенную дату. Используя только таблицу движений нам бы пришлось рассчитывать итоги, перебирая каждую запись таблицы с «начала времен». За несколько лет в таблице движений может накопиться более миллиона записей и перебор записей в ней является не оптимальным. Используя таблицу итогов Мы определим промежуточные итоги за период(месяц), в котором находится наша дата получения итогов и уже от промежуточных итогов рассчитаем итоги на конкретную дату используя таблицу движений. Применение таблиц итогов существенно оптимизирует расчет итогов регистров на определенную дату, так как нам больше не надо перебирать таблицу движений с «начала времен».

Физическая структура базы 1С
Кроме промежуточных итогов по периодам в таблице итогов хранятся так называемые «Текущие итоги». Текущие итоги – это самые последние итоги регистра. Использование текущих итогов позволяет оптимизировать получение итогов в оперативном режиме (самых последних итогов без указания конкретного периода). Тогда получение таких итогов сводится к использованию только таблицы итогов (таблица движений в этом случае вообще не применяется).
Текущие итоги хранятся в таблице итогов с периодом «01.11.3999» (если используется смещение дат, то «01.11.5999»).
Управление итогами (пересчет, включение, выключение) осуществляется в форме управления итогами (Все функции – Стандартные – Управление итогами).

Также управлять итогами регистров можно программно:
Регистр.УстановитьИспользованиеИтогов()
Регистр.УстановитьИспользованиеТекущихИтогов()
Регистр.ПересчитатьИтоги()
ПересчитатьТекущиеИтоги()

При пересчете таблица итогов очищается и заполняется (рассчитываются) заново на основании таблицы движений.

Последовательности, понятие момента времени

Физическая структура базы 1С

image039

 

 

 

 

Таблица движений: «_Seq<n>» — основная таблица со следующими полями: Период, регистратор, измерения регистратор. Таблица границ: «_SeqB<n>» — с суффиксом «B». Таблица границ имеет следующие поля: Период, измерения,

Период и регистратор образуют так называемый «Момент времени». Понятие «момент времени» используется платформой для идентификации времени с точностью до документа (ссылки, регистратора). Момент времени состоит из периода (дата + время) и ссылки «b3e2001617ec3f2a11e1912c787ec129». Сравнение моментов времени происходит следующим образом: сначала сравниваются на больше/меньше периоды, если периоды одинаковые на больше/меньше сравниваются ССЫЛКИ (b3e2001617ec3f2a11e1912c787ec129)!!!
Возможно упорядочивание данных запроса по моменту времени:
УПОРЯДОЧИТЬ ПО
ДокументОприходованияДата,
ДокументОприходования

Оперативное проведение
Проведение документа РЕАЛЬНЫМ ВРЕМЕНЕМ (http://v8.1c.ru/overview/Term_000000639.htm)
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
РежимПроведения – оперативный/неоперативный

Оперативное проведение гарантирует что документ проводится самый последний (по моменту времени). При оперативном проведении нельзя проводить документ будущей датой!
В конфигурациях на платформе 1С8 фирма 1С реализует принцип что ОСТАТКИ проверяются (влияют на отмену проведения) только при ОПЕРАТИВНОМ ПРОВЕДЕНИИ.
При оперативном проведении в типовых конфигурациях:
1. Не сдвигаются границы последовательностей:
// В неоперативном режиме границы последовательностей сдвигаются назад, если они позже документа.
Если РежимПроведения = РежимПроведенияДокумента.Неоперативный Тогда
УправлениеЗапасамиПартионныйУчет.СдвигГраницыПоследовательностиПартионногоУчетаНазад(Дата, Ссылка, Организация);

2. Остатки проверяются по текущим итогам (без отбора по периоду):
// Проверка остатков при оперативном проведении.
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Движения.ТоварыКПередачеСоСкладов.КонтрольОстатков(ЭтотОбъект, "Товары", СтруктураШапкиДокумента, Отказ, Заголовок);

А там:
|ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(, Номенклатура В (%ВыборкаПоНоменклатуре%)

3. Обновляются тоже только текущие итоги

Регистры бухгалтерии
Физическая структура базы 1С
Таблица движений: «_AccRg<n>» — основная таблица (журнал проводок) со следующими полями:
Период (_Period»);
Регистратор (_RecorderTRef и _RecorderRRef);
Номер строки (_LineNo);
Признак активности записи (_Active);
Счет учета (_AccountRRef) — только для регистров без поддержки корреспонденций;
Счет учета дебета (_AccountDtRRef) — только для регистров с поддержкой корреспонденций;
Счет учета кредита (_AccountCtRRef) — только для регистров с поддержкой корреспонденций;

 

поля измерений (_Fld<n>RRef) – если измерение балансовое, иначе (_Fld<n>DtRRef и _Fld<n>CtRRef);
поля ресурсов (_Fld<n>) – если ресурс балансовый, иначе (_Fld<n>Dt и _Fld<n>Ct);
поля реквизитов (_Fld<n>).

Из структуры таблицы понятно, что значения субконто (в отличии от измерений) отсутствуют в таблице движений!

Значения субконто движений хранятся отдельно в специальной таблице:
Физическая структура базы 1С«_AccRgED<n>» — таблица значений субконто состоит из следующих полей:
Период (_Period»);
Регистратор (_RecorderTRef и _RecorderRRef);
Номер строки (_LineNo);
Признак корреспонденции (_Correspond): Определяет часть проводки 0 — для дебета, 1 — для кредита (только для РБ с поддержкой корреспонденций);
Вид субконто (_KindRRef): через план счетов определяет место (номер) субконто в части проводки;
Значение субконто (_Value_TYPE, _Value_RTRef, _Value_RRRef).

 

В отличии от регистров накопления, регистры бухгалтерии имеют несколько таблиц итогов:

Физическая структура базы 1С «_AccRgAT0<n>» — таблица итогов (остатки и обороты) по счету в целом. Эта таблице хранит итоги по всем счетам (которые имеют субконто и которые не имеют) и состоит из следующих полей:
состоит из следующих полей:
Счет учета (_AccountRRef);
Период (_Period»);
Поля измерений (_Fld<n>RRef);
Остаток (_Fld<n>);
Оборот по дебету (_TurnoverDt<n>);
Оборот по кредиту (_TurnoverCt<n>);
Оборот (_Turnover<n>).
Поля Остаток, Оборот по дебету, Оборот по кредиту, Оборот – повторяются для каждого ресурса.

 

Еще несколько таблиц итогов предназначены для хранения итогов в разрезе счетов и аналитики (субконто). Количество таких таблиц итогов зависит от максимального количества субконто в плане счетов, связанным с регистром бухгалтерии:
Физическая структура базы 1С«_AccRgAT1<n>» — таблица содержит информацию об итогах счетов, имеющих только одно субконто и состоит из следующих полей:
Счет учета (_AccountRRef);
Период (_Period»);
Поля измерений (_Fld<n>RRef)
Значение субконто (_Value1_TYPE, _Value1_RTRef, _Value1_RRRef)
Остаток (_Fld<n>);
Оборот по дебету (_TurnoverDt<n>);
Оборот по кредиту (_TurnoverCt<n>);
Оборот (_Turnover<n>).
Поля Остаток, Оборот по дебету, Оборот по кредиту, Оборот – повторяются для каждого ресурса.

«_AccRgAT2<n>» — таблица содержит информацию об итогах счетов, имеющих только два субконто и в отличии от таблицы итогов с одним субконто, содержит поля значения второго субконто:
Значение второго субконто (_Value2_TYPE, _Value2_RTRef, _Value2_RRRef)

 

Если регистр бухгалтерии поддерживает корреспонденции, то еще присутствует таблица итогов оборотов между счетами (обороты по корреспонденциям):
Физическая структура базы 1С«_AccRgCT<n>» — состоит из следующих полей:
Период (_Period»);
Счет учета (_AccountRRef) — только для регистров без поддержки корреспонденций;
Счет учета дебета (_AccountDtRRef) — только для регистров с поддержкой корреспонденций;
Счет учета кредита (_AccountCtRRef) — только для регистров с поддержкой корреспонденций;
Поля измерений (_Fld<n>RRef);
Оборот (_Fld <n>);
Оборот по дебету (_Fld Dt<n>);
Оборот по кредиту (_Fld Ct<n>);

Признаки учета
Физическая структура базы 1СДля плана счетов, связанного с регистром бухгалтерии можно задать признаки учета (например количественный, валютный). Признаки учета имеют тип «Булево». Для каждого счета учета можно установить значение признаков учета разделив счета по признакам учета. Также с признаками учета можно связать измерения и ресурсы регистра бухгалтерии. Если в движении указан счет учета для которого не установлен признак учета, то в измерения и ресурсы, связанный с этим признаком, будет записано значение «NULL». Значения измерений и ресурсов, связанных с признаком учета, будут заполняться только в том случае, если в движении (проводке) используется счет, в котором этот признак учета установлен.

Надо отметить что 1С не гарантирует неизменность физической структуры базы в будущих версиях платформы! Более того изменение физической структуры происходит постоянно с развитием платформы!

Posted in Блог Оптимизации 1С.

2 Comments

  1. Добрый день ! Вопрос. А как из базы вытянуть значение _Value2_RTRef , т.е 16чный код типа субконто, кроме как например брать порядковый номер справочника и переводить из 10 в 16 формат?
    пример : _Reference127 >> 0x0000007F

  2. Эта информация хранится в системных таблицах config и Params (FileName = «DBNames»). Поле «binarydata» упакован (deflate)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *