Получение информации о структуре хранения базы данных в терминах 1С:Предприятие и СУБД

Часто возникает необходимость определить в какой таблице СУБД хранится тот или иной объект метаданных. Или наоборот, какой объект метаданных соответствует определенной таблице СУБД. Здесь стоит упомянуть, что имена таблиц и полей СУБД, в которых хранятся объекты метаданных 1С:Предприятия, не соответствуют именам объектов метаданных, их реквизитам, измерениям, ресурсам. Получение такой информации не представляет особой сложности, тем не менее, если Вы никогда этого не делали, данная статья будет Вам полезна.

Получение структуры хранения базы данных

В целом, эту статью можно было бы изложить в одном коротком предложении: для получения информации о структуре хранения базы данных, а также соответствие имен объектов в терминах 1С:Предприятие и СУБД необходимо воспользоваться методом ПолучитьСтруктуруХраненияБазыДанных(). Но мы пойдем дальше и попробуем разобраться с областью применимости этого метода, а также организуем удобную работу с возвращаемыми методом данными.

Давайте, для начала, посмотрим что же возвращает данный метод. Результатом вычисления данной функции будет таблица значений, в которой каждая строка таблицы определяет одну таблицу СУБД. В первых двух колонках указано имя таблицы в терминах СУБД и в терминах 1С:Предприятия. Далее идут колонки описывающие к какому метаданному относится таблица и назначение этой таблицы СУБД. Последние две колонки содержат вложенные таблицы значений полей и индексов таблицы СУБД. В таблице полей содержится соответствие имен полей в терминах СУБД и терминах 1С:Предприятие, а так же связь поля с объектом метаданного (какой реквизит/ресурс/измерение). Таблица индексов содержит набор имен индексов, а так же вложенную таблицу значений, содержащую поля таблицы СУБД, включенные в состав индекса, и соответствие их имен в терминах СУБД и 1С:Предприятие.

Структура хранения базы данных
Структура хранения базы данных

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

Обработка "Структура хранения базы данных"
Обработка «Структура хранения базы данных»

Область применимости

Давайте попробуем проанализировать ту информацию, которую нам предоставляет платформа с помощью метода ПолучитьСтруктуруХраненияБазыДанных() и сопоставим ее с реальной структурой СУБД (рассмотрим на примере MS SQL Server). Сразу оговорюсь что метод имеет 2 параметра: первый устанавливает отбор на метаданные по которым необходимо получить информацию; второй устанавливает режим вывода информации: «В терминах СУБД» или «В терминах 1С:Предприятие» (данная опция так же присутствует в обработке). Представленный ниже текст относится к режиму вывода «В терминах 1С:Предприятие» если не указано иного.

Подготовка базы

Давайте создадим пустую информационную базу в режиме совместимости с 8.2.16, основной режим запуска установим «обычное приложение». В конфигурацию добавим 2 документа (со значениями по умолчанию) и регистр сведений «АнализСтруктурыХранения» (периодичность в пределах дня). У регистра добавим реквизиты:

  1. «Число»: тип число
  2. «Строка»: тип строка
  3. «ДокументСсылка»: тип ДокументСсылка1
  4. «СоставнойЧислоСтрока»: составной тип Число и Строка
  5. «СоставнойДокументСсылка»: составной тип ДокументСсылка1 и ДокументСсылка2
  6. «СоставнойЧислоСтрокаДокументСсылки»: составной тип Число, Строка, ДокументСсылка1, ДокументСсылка2

Далее добавим общий реквизит «Разделитель» (тип Число), в состав включим наши документы и регистр сведений. Установим «Разделение данных» в «разделять» и разрешим создать параметры сеансов, «Использование разделяемых данных» установим в значение «независимо и совместно». Обновим конфигурацию.

Набор таблиц базы данных в СУБД и методе платформы

Откроем обработку в 1С:Предприятие, а также откроем список таблиц базы данных в СУБД и сравним их. Как видно, метод ПолучитьСтруктуруХраненияБазыДанных() вернул не полный список таблиц базы, который мы можем увидеть на уровне СУБД, а набор таблиц за исключением системных таблиц, таких как Config, ConfigSave, v8users и другие.

Структура базы данных на уровне СУБД и платформы
Структура базы данных на уровне СУБД и платформы

Набор полей (колонок) в таблице

Перейдем теперь к нашему регистру сведений. Получим набор полей таблицы регистра с помощью обработки, а так же получим набор колонок в СУБД и сравним их. Как видно, для не составных типов (вне зависимости от типа) в СУБД используется 1 колонка таблицы, структура хранения 1С:Предприятия отражает аналогичную информацию. Если же мы перейдем к полям составного типа, то в обработке все так же выводится информация только об 1 поле, как мы его и задавали в конфигурации, а в СУБД это поле хранится в нескольких колонках и их количество может быть различно в зависимости от состава типа поля, определенного в конфигурации. Это связано со способом хранения информации платформой и более подробно можно прочесть на сайте ИТС. Замечу, что при анализе запроса в СУБД или анализе плана запроса необходимо учитывать этот факт и правильно интерпретировать имена колонок.

Структура полей (колонок) в таблице базы данных
Структура полей (колонок) в таблице базы данных

Состав индексов

Проведем аналогичное сравнение индексов и их состава, полученных обработкой и реально существующих в СУБД. Первое что бросается в глаза, это 12 индексов в таблице СУБД, в то время как обработка выводит только 2. По своей сути все верно, если индексы разделить по «назначению» («ByDims» — по измерениям, и «ByPeriod» — по периоду). Размножение произошло по причине того что в составных типах включено более 1 примитивного типа или примитивный тип включен вместе с ссылочным — в этом случае платформа создает для каждой комбинации свой индекс. Так, в нашем примере реквизит «СоставнойЧислоСтрока» включает 2 примитивных типа, а «СоставнойЧислоСтрокаДокументСсылки» включает 2 примитивных типа и ссылочные (их количество не важно, важно наличие хотя бы одного). Таким образом, платформа создала комбинации индексов: ЧислоЧисло, ЧислоСтрока, ЧислоСсылка, СтрокаЧисло, СтрокаСтрока, СтрокаСсылка.

Откроем состав одного из индексов и сопоставим поля. Как видно, в СУБД первым полем индекса стоит «Fld12», (по таблице полей можно определить что это «Разделитель«) и оно отсутствует составе индекса, выведенного в обработке.

Структура и состав индексов на уровне СУБД и платформы
Структура и состав индексов на уровне СУБД и платформы

Продолжаем эксперименты

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

Сделаем следующие вещи:

  1. Откроем в СУБД индекс «ByDocNum» объекта Документ1 и поменяем порядок следования полей Number и IDRRef
  2. Удалим в СУБД индекс «ByDocDate» объекта Документ1
  3. Добавим в СУБД колонку, например, «MyColumn» с числовым типом в таблицу регистра сведений
  4. Добавим в СУБД в нашу базу данных новую таблицу, например, «MyTable»

Откроем нашу обработку и проверим что получилось:

  1. Платформа не знает о том что порядок полей в индексе был изменен
  2. Платформа не знает о том что индекс удален
  3. Платформа не видит добавленную колонку
  4. Платформа не видит добавленную таблицу

Задание для самостоятельной работы

Как ранее было сказано, вышеприведенное исследование выполнено для режима «В терминах 1С:Предприятие». Предлагаю проделать всю вышеприведенную работу для режима «В терминах СУБД» самостоятельно и сделать соответствующие выводы. Оговорюсь лишь о том, что большая часть расхождений между реальной структурой в СУБД и структурой возвращенной методом платформы — исчезают.

Выводы

Метод ПолучитьСтруктуруХраненияБазыДанных() предоставляет достаточно полную и корректную информацию о структуре хранения базы данных, а так же выводит соответствия имен таблиц, их колонок, и индексов в терминах СУБД и 1С:Предприятие. Но, при этом есть некоторые ограничения при работе с этим методом:

  1. Нет информации о системных таблицах (но она особо и не нужна)
  2. Состав полей отражается с точки зрения 1С, а не с точки зрения хранения в СУБД (только в терминах 1С:Предприятие)
  3. Набор индексов так же отражается с точки хранения 1С, а не с точки зрения СУБД (только в терминах 1С:Предприятие)
  4. Некоторые существующие поля индекса могут быть не отражены в составе индекса на уровне платформы (только в терминах 1С:Предприятие)
  5. Информация, видимо, строится не по структуре базы данных, а по некому представлению платформы о структуре базы на основании метаданных конфигурации и их свойств
  6. Необходимо иметь ввиду что механизм работы метода может быть изменен в другой версии платформы

Таким образом, если необходимо получить точную информацию о структуре базы данных, необходимо получать эту информацию с помощью СУБД, а при получении данных методом ПолучитьСтруктуруХраненияБазыДанных() лучше использовать режим «В терминах СУБД»

Вложения

Всего комментариев: 11

  1. У меня она почему-то не работает — пустое окно 1С:Предприятие 8.3 (8.3.10.2505) Управление торговлей, редакция 11 (11.3.2.207)

    1. Обработка во вложении сделана под «обычные» формы, а в УТ 11 они управляемые, потому и не работает. Целью статьи было не сделать обработку, а показать как мы можем получить информацию о структуре БД, а также понять что есть что и как этим пользоваться. Сама же обработка пишется буквально минут за 5-10 и, в случае необходимости, вы можете открыть данную обработку в конфигураторе и переписать под управляемые формы.

  2. Отличная обработка ! Из пожеланий — добавить размер , который занимают таблицы.
    Сейчас пользуюсь 1CTool для выяснения размера поля, и обработкой для понятия что это в базе.
    Обычно возникают вопрос — почему база такая большая — что занимает больше места и т.д.

  3. Удобно, спасибо за работу!
    1С:Предприятие 8.3 (8.3.10.2753)
    1С:ERP Управление предприятием 2 (2.2.4.227)

    1. В этой версии обработки не нашёл возможность отбора по «имени поля хранения»…
      Ранее встречал следующую ошибку (суть): _FldNN ошибка установки типа при попытке обновить БД.
      Т.е. здесь надо знать таблицу, тогда найдешь поле.

  4. Здравствуйте. Увидел вашу статью и обработку, очень мне помогла понять где проблема.
    Но к сожалению немножко не понял решения для себя.
    Проблема в том что у меня при обновлений 1с слетели таблицы в СУБД ( Postgre)
    https://ibb.co/YfrY9mL
    На данной сриншоте выделена таблица _Document427_VT12288
    Но такой таблице в СУБД нету.
    Нашел решение, что для нормальной работы базы мне надо привести СУБД к 1C.
    Моя задача сейчас создать в СУБД данную таблицу.
    Понял что имя поле хранения это и есть колонки, но какие параметры колонок савить :int SERIAL и т.д. и т.п

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

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