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




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

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

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

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

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

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

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

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

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

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

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

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

UPD-2026-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 не будет опубликован. Обязательные поля помечены *