Универсальная структура подчиненности документов


Отчет "Универсальная структура подчиненности документов" позволяет увидеть иерархию документов (с возможностью использования произвольных отборов и вывода произвольных полей). Реализовано для обоих режимов запуска (обычная и управляемая формы).

Вашему вниманию предлагается отчет для анализа документов с точки зрения подчиненности одного документа другому. Ну, "для анализа" - это, наверное, громко сказано... Но "чисто поглазеть" точно можно Smile.

В верхней части отчета расположены различные настройки, а в нижней - само дерево документов.

Пробежимся по настройкам:

  1. Страница "Корневой документ" - в поле "Типы корневого документа" выбираются типы корневого документа. Возможно выбрать больше одного типа (и даже все - контекстное меню к полю), но это скажется соответствующим образом на производительности. Под полем выбора корневых документов расположено дерево отборов (СКД). Как работать с отбором СКД, подозреваю, рассказывать не надо...
  2. Страница "Отборы"- так называемые "произвольные отборы", позволяющие накладывать условия на любые уровни документов. Знание языка запросов приветствуется (но для простых условий отбора - необязательно). Для обращения к документам различных поколений введены вспомогательные конструкции:
    1. [Документ5] - представляет собой документ пятого поколения (вместо пятерки используйте нужное поколение)
    2. [ДокументX] - подразумевает под собой документ каждого уровня, т.е. отбор с данной конструкцией будет использоваться в каждом поколении
    3. [ДокументA] и [ДокументB] - два соседних документа

    Первую конструкцию я бы назвал статической, а остальные - динамическими. Под конструкциями следует понимать ссылки на документы. Реквизиты "вытаскиваются", через точку: НачалоПериода([ДокументX].Дата, ДЕНЬ) = ДатаВремя(2011, 1, 1). Запрещено использование различных конструкций в одном условии. Также есть аналогичные конструкции, но вместо слова "Документ" используется слово "Состояние" ([СостояниеX] и т.д.) - это число, где 0 - документ помечен на удаление, 1 - не проведен, 2 - проведен. Извиняюсь за англ. раскладку Embarassed 

    У каждого условия есть три флажка:

    1. Использование - Включение/выключение отбора 2. ИЛИ - если флажок установлен, то условие будет работать по принципу "хотя бы один" (если условие выполнится для ветки хотя бы один раз); если флажка нет, то подразумевается условие "все" (как бы "И"). Условия ИЛИ накладываются на самой последней стадии, в связи с чем, слабо сказываются на увеличении скорости работы. Несколько условий ИЛИ объединяются по принципу "ИЛИ", остальные - по принципу "И". Laughing 3. Обязательное - если флажок установлен, то отбор обязательно отработает; если не установлен - то отбор не будет применяться для веток, у которых количество поколений меньше максимального номера поколения в условии. К примеру: [Документ3].Проведен с установленным флажком отберет все ветки в которых документ в третьем поколении проведен, а без флажка - будут отобраны еще и ветки, состоящие только из двух (или одного) документов.

  3. Страница "Поля" - в поле "Выражение" указывается путь к реквизитам (в общем говоря, выражение на языке запросов). До реквизитов добираемся с помощью слова Документ. К примеру: Документ.Дата. Ну, или другой пример: ЕСТЬNULL(Документ.Склад, "NULL").
  4. Страница "Параметры" - если на страницах "Отборы" и/или "Поля" использовались какие-то параметры (те, что с символом &), то здесь их следует прописать, и указать значение.
  5. Страница "Настройки" - здесь собраны некоторые общие настройки:
    1. Типы детей - назначение, думаю, понятно из названия... Один из наиболее эффективных способов ускорить работу отчета, это указать в этом поле как можно меньше документов Smile. В контекстном меню к полю есть пункт "Выбрать все".
    2. Расширительные типы - самый туманный параметр... Нужен ли он вообще - точно не знаю. В общем, когда-нибудь, наверное, может сложиться ситуация, что в отборе или в полях мы обратились к какому-то реквизиту, который есть только у, скажем, одного документа, и если по каким-то причинам в каком-то поколении этого документа не оказалось (т.е. даже не было связи с этой таблицей), то возникнет ошибка. Если вы считаете, что все прописали правильно, то, может быть, имеет смысл добавить сюда этот тип документа. Но думаю, потребности его трогать у вас не возникнет...
    3. Мин. количество поколений - ветки короче указанного числа отображаться не будут
    4. Макс. количество поколений - после достижения указанного количества поколений анализ документов заканчивается. Если включить этот параметр со значением один, то, понятное дело, никакого дерева мы не получим (фактически получится простой список), но зато отчет выполнится довольно быстро Wink

Как использовать отчет придумывайте сами. Можно, к примеру, просто вывести список всех документов одного ответственного. Или отобрать те документы где различаются склады у документа-родителя и документа-ребенка... Или еще чего-нибудь...

Теперь немного о грустном: на демо-базах работает на ура. А вот на реальных, тяжелых базах... На реальных базах работает со скрипом. Выбрав в качестве корневого документа один тип документа, установив некоторый отбор по дате, в третьем поколении я получаю соединение с ~140 таблицами и не дождавшись отклика убил одинэску через энное количество часов... В общем, если отчет используется для дела, то рекомендую в каждом конкретном случае указывать какие типы детей-документов вас интересуют и сохранять настройки.

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

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

На управляемых формах до этого практически не писал, так что один-другой лишний байтик-мегабайтик может побегать по проводам ;)

На платформах младше 8.2.11.235 даже не запускал. 

Буду рад дельным советам и конструктивной критике Wink 

Файлы обработки:

-