Дерево метаданных документа с подчиненными узлами

В форме пользователь может выбирать любой документ, имеющийся в системе.
Обработка строит развернутую структуру метаданных. Например, если выбран документ "Поступление товаров и услуг", то отображаются все его
реквизиты, табличные части, их реквизиты, формы и макеты. Для каждого реквизита ссылочного типа тоже разворачивается его структура (например, для реквизита "Контрагент") и так далее. Результат обработки представлен в виде дерева значений, размещенного на форме

В обработке представляется структура метаданных выбранного документа не в конфигураторе, а в пользовательском режиме. Программным способом обработка обращается к метаданным и считывает соответствующие свойства. Корневым узлом будет выбранный документ. Подчиненными элементами дерева будут реквизиты этого документа, стандартные реквизиты, табличные части и их реквизиты. Если реквизит ссылочного типа, например, номенклатура, то у него выбираются все реквизиты. Реквизиты бывают составного типа данных. Это значит, что некоторые реквизиты, например, получатель, может иметь тип, ссылка на справочник физ. лица и ссылка на справочник контрагенты. В этом случае структура данного реквизита будет следующая: следующим подчиненным узлом указывается его тип. Для реквизита получатель существует два ответвления физ. лица и контрагенты, дальше их реквизиты. Если тип реквизита не является составным, то его тип выводится в одной строке с именем реквизита. Так выглядит дерево. При построении дерева используется рекурсия. Обрабатывается каждый реквизит и если он ссылочного типа данных, для него строится поддерево и так далее, до тех пор, пока не дойдёт до окончания этого дерева, т.е. до простых примитивных типов данных, для которых нельзя сделать разузлование. Возможно зацикливание. Например, в номенклатуре есть реквизит последней продажи, тип ДокументСсылка.РеализацияТоваров. Система поймет, что перед ней ссылочный тип и будет пытаться строить поддерево, которое уже начала строить в начале, затем процесс дойдет до номенклатуры, и опять по циклу. Проблема решена так, необходимо запомнить, при каждом рекурсивном вызове, какие реквизиты были обработаны ранее и если реквизит с таким типом данных уже обрабатывался прекращать построение поддерева. 

12 Comments

  1. Иной

    А вот вопрос, если в реквизите Сотрудник (ссилка на справочник Сотрудники) документа есть поле, которое содержит ссылку на справочник Сотрудники (вроде как указывается непосредственный начальник). Как тогда при такой рекурсивной структуре будут отображены реквизиты?

    Reply ↓
  2. TMV

    (0) где эта вещь может пригодиться?

    Reply ↓
  3. Иной

    Может пригодится для динамического формирования параметров отчетов (отборов, сортировок и т.д.), перечень которых не известен на момент проектирования запроса. Типа универсальных отчётов.

    Но это уже «дебри». Как правило 98% отчётов, в той или иной степени специализированны. Ну и в 8-ке итак хороший движок построения запросов =)

    Reply ↓
  4. TMV

    (3) механизм СКД все это умеет, а он уже везде..

    Reply ↓
  5. Иной

    Это из разряда очумелих ручек или сделай сам. На ценителей в общем говоря =).

    Меня просто интересовало структура создавалась сразу, или же прорисовывалась при разворачивании. Тоесть учитывался ли фактор возможной рекурсии, или нет =).

    Reply ↓
  6. TMV

    (5) а по поводу вашего вопроса в (1) нужно текст дочитать до конца)

    Reply ↓
  7. Иной

    Упс… Действительно. Но это не суть важно. Структуру можно «рисовать» при возникновении нужды, то есть при разворачивании. Это и меньше ресурсов займёт.

    А подход по решению не совсем правилен. В приведённом мною примере, я бы вот хотел бы сделать, например, отбор по начальнику сотрудника, или даже по управлению начальника отдела сотрудника. таким образом — это не панацея.

    Reply ↓
  8. TMV

    (7) про начальника не понял.. здесь же дерево МЕТАданных..

    Reply ↓
  9. Иной

    Это я отвлёкся немного. Фантазия на тему применения…

    Reply ↓
  10. Артано

    Вопрос автору: чем не нравится построитель отчета?

    Reply ↓
  11. andpyxa

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

    Reply ↓
  12. ZhokhovM

    Ни хрена не работает ваша обработка, выбираю документ Авансовый отчет и нажимаю Заполнить, заполнение длилось более 2х часов и результата не было, а точнее закрыл нафиг режим предприятия. Проверял на УТ.

    Reply ↓

Leave a Comment

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