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




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

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

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

Как раз для такого случая предназначена встроенная функция ПолучитьСтруктуруХраненияБазыДанных(), возвращающая все необходимые данные в виде таблицы значений. Причем некоторые реквизиты (Поля и Индексы) этой таблицы сами представляют собой таблицы значений.

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

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

Функционал обработки

При активизации элемента дерева метаданных проихсодит заполнение списка таблиц, полей и индексов. При двойном клике по корню дерева отображаются все таблицы, включая служебные (не рекомендуется, так как возрастают объемы данных, по которым идет поиск).

В табличных частях работают стандартные команды поиска и вывода списка.

Отличия от существующих реализаций

Существует несколько схожик публикаций, например, //infostart.ru/public/90486/ и //infostart.ru/public/91004/. Однако их неудобство заключается в отсутствии дерева метаданных, что затрудняет навигацию. Поиск осуществляется также по называнию таблиц и полей в базе, а не наоборот.

Наиболее близка по функционалу к публикация автора le_(//infostart.ru/public/128235/). В отличие от нее, данная обработка  содержит наиболее полное дерево метаданных (планы обмена, константы, журналы документов и пр.). Кроме того структура данных представлена более наглядно: список таблиц объекта метаданных, список полей и список индексов выводятся в отдельных табличных частях.  

UPD-2024-01-06 (v1.3). Исправлена ошибка, возникающая в режиме совместимости 8.3.7 и выше (изменилось поведение платформы).

UPD-2012-08-17 (v1.2). Сделан патч для корректной обработки регламентных заданий, исправлен пункт отображения планов видов расчета, исправлено поведение при переключении типа структуры в корне конфигурации.

P.S. Некоторые работодатели при приеме на работу задают вопрос о количестве физических и виртуальных таблиц для регистров. Неплохо бы знать ответы на эти вопросы, тем более, что это уровень 1С:Профессионал. Если вы хотите не только выучить этот ответ, но и "пощупать" эти таблицы, тогда эта обработка для вас!

13 Comments

  1. child1983

    а в обработке предусмотрен вывод в документ(например, сохранение mxl) структуры или только просмотреть можно?

    Reply
  2. bforce

    (1) child1983, специально выгрузка не предусматривалась.

    Доступна только стандартная возможность вывода табличной части в табличный документ, откуда его можно экспортировать.

    Reply
  3. Andreynikus

    Есть ли возможность поиска объекта 1С по имени таблицы СУБД?

    Было бы просто отлично.

    Reply
  4. bforce

    Я использую следующий метод: по двойному клику на корне получаю все таблицы, а дальше по Ctrl + F на столбце Имя таблицы хранения (или Найти из контекстного меню) получаю ту единственную строку.

    Если делать это отдельной командой, то все равно так или иначе придется получать полную таблицу.

    Reply
  5. yaxinr

    это обработки с управляемыми формами, на моей конфигурации не открываются

    Reply
  6. MasterSVS

    За работу +

    Reply
  7. RocKeR_13

    По корню не получает полную структуру: необходимо внести изменения вот сюда:

    &НаСервере
    Процедура ЗаполнитьТаблицыПоОбъектуНаСервере(знач МетаОбъект, ВидимостьКолонкиМетаданных)
    
    ОбъектыМетаданных = Новый Массив;
    // Патч для некорректно работающих регламентных заданий
    Если Найти(МетаОбъект, «РегламентноеЗадание.») > 0 Тогда
    МетаОбъект = Метаданные.НайтиПоПолномуИмени(МетаОбъект);
    КонецЕсли;
    // Конец патча
    
    СтруктураДанных = ПолучитьСтруктуруХраненияБазыДанных(ОбъектыМетаданных, ТипСтруктуры = 1);
    

    Показать

    перед получением структуры добавить проверку на пустую строку:

     Если Не ПустаяСтрока(МетаОбъект) Тогда
    ОбъектыМетаданных.Добавить(МетаОбъект);
    КонецЕсли;
    Reply
  8. bforce

    (7)

    По корню не получает полную структуру…

    Получает, но по двойному клику на корневом элементе дерева (на имени конфигурации). Я давно порываюсь сделать там контекстное меню или кнопку, чтобы как-то обозначить такую возможность, но пока не собрался.

    перед получением структуры добавить проверку на пустую строку:

    В описании изменений платформы я не нашел информации об изменении поведения в работе этой функции. То есть, передавая пустую строку в массиве можно получить полную структуру хранения. Предлагаемое изменение кажется необязательным. Расскажите подробнее об условиях использования обработки (платформа, конфигурация), если это не так.

    Reply
  9. AndyR

    Платформа 8.3.10.2561, по двойному клику на корне ругалось

    {ВнешняяОбработка.СтруктураХраненияБазыДанных.Форма.Форма.Форма(104)}: Ошибка при вызове метода контекста (ПолучитьСтруктуруХраненияБазыДанных)

    СтруктураДанных = ПолучитьСтруктуруХраненияБазыДанных(ОбъектыМетаданных, ТипСтруктуры = 1);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)

    .

    Поправил начало заполнения так

    &НаСервере
    Процедура ЗаполнитьТаблицыПоОбъектуНаСервере(знач МетаОбъект, ВидимостьКолонкиМетаданных)
    
    Если МетаОбъект=»» Тогда
    СтруктураДанных = ПолучитьСтруктуруХраненияБазыДанных(, ТипСтруктуры = 1);
    Иначе
    Если Найти(МетаОбъект, «РегламентноеЗадание.») > 0 Тогда
    МетаОбъект = Метаданные.НайтиПоПолномуИмени(МетаОбъект);
    КонецЕсли;
    
    ОбъектыМетаданных = Новый Массив;
    ОбъектыМетаданных.Добавить(МетаОбъект);
    СтруктураДанных = ПолучитьСтруктуруХраненияБазыДанных(ОбъектыМетаданных, ТипСтруктуры = 1);
    КонецЕсли;
    …
    

    Показать

    В СП про 1й параметр сказано только что он необязательный. Про пустую строку не нашел:

    <ОбъектыМетаданных> (необязательный)

    Тип: Массив.

    Массив имен объектов метаданных или массив объектов метаданных, для которых требуется получить структуру таблиц базы данных.

    ЗЫ:

    Пробовал на 2х конфигурациях. В одной с режимом совместимости «Версия 8.3.6» пустую строку принимает без ошибок. В другой, где режим совместимости «Не использовать», пустая строка уже не прокатывает.

    Reply
  10. bforce

    (7) (9), спасибо вам, ребята!

    Сделал новую версию.

    Reply
  11. rokhin

    Нет возможности найти метаданные по названию таблицы в базе.

    Reply
  12. bforce

    (11), нужно по двойному клику на корне вывести весь список метаданных, а дальше воспользоваться стандартными возможностями платформы по поиску в таблице формы.

    Reply
  13. sapervodichka

    дополнительно можно размеры поюзать и таблицы отчетом https://infostart.ru/public/1093355/

    Reply

Leave a Comment

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