|
v7: Дерево документов | ☑ | ||
---|---|---|---|---|
0
trozz
07.10.11
✎
08:51
|
Есть обработка, строящая дерево документов, вида:
Док1 |_ Док2 т.е. только родитель и подчиненный(ые) А мне нужно чтобы простраивалось дерево от первого до последнего документа(из всего 2 вида, и оба вводятся на основании друг друга) Док1 |_ Док2 |_ Док1 |_ Док2 и т.п. Текст самой обработки: Перем Расшифровка; Перем Обновить; Перем Таб; Перем СписокЗащитыОтЗацикливания; Функция ОткрытьДокВЖурнале() Сообщить("123"); КонецФункции //-------------- Функция УстановитьРасшифровку(Докум) Расшифровка=СоздатьОбъект("СписокЗначений"); Расшифровка.ДобавитьЗначение(Докум,"ДокументЖурнала"); Возврат Расшифровка; КонецФункции //-------------- Функция ПредставлениеДокумента(Док,ДокОснования) ВидДок=Док.Вид(); ПечДок=""+Док.ПредставлениеВида()+" № "+Док.НомерДок+" от "+Док.ДатаДок; Если Док.ПредставлениеВида()<>"Доверенность" Тогда ПечСумма = Док.Итог("Сумма"); КонецЕсли; Если ПустоеЗначение(ПечСумма) = 0 Тогда //Если глЕстьРеквизитШапки("Валюта",ВидДок)=1 Тогда // ПечСумма = "" + ПечСумма + " "+Док.Валюта.Наименование; //КонецЕсли; ПечДок= ПечДок + РазделительСтрок+" Сумма: " + ПечСумма + " руб." ; КонецЕсли; Если Док.Проведен()=0 Тогда ПечДок=ПечДок+" (Не проведен!)"; КонецЕсли; Возврат ПечДок; КонецФункции //-------------- Функция НайтиКорень(Док) // Эта Функция помогает формировать Дерево подчиненных документов СписокЗащитыОтЗацикливания.ДобавитьЗначение(Док); ВД=Док.Вид(); КореньДок=0; Для Н=1 По Метаданные.Документ(ВД).РеквизитШапки() Цикл РеквДок=Док.ПолучитьАтрибут(Метаданные.Документ(ВД).РеквизитШапки(Н)); Если ТипЗначенияСтр(РеквДок)="Документ" Тогда Если ПустоеЗначение(РеквДок)=0 Тогда Если СписокЗащитыОтЗацикливания.НайтиЗначение(РеквДок)>0 Тогда Продолжить; КонецЕсли; КореньДок=РеквДок; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Если ПустоеЗначение(КореньДок)=1 Тогда Возврат Док; Иначе Возврат НайтиКорень(КореньДок); КонецЕсли; КонецФункции //-------------- Процедура ВывестиПодчиненные(Докум,ДокОснования,Док,Последний,Уровень,Уровни) // Эта процедура помогает формировать Дерево подчиненных документов // подчиненные документы: ДокПодч = СоздатьОбъект("Документ"); // для проверки наличия следующего элемента в выборке // создадим еще один объект! ПровДокПодч = СоздатьОбъект("Документ"); Таб.ВывестиСекцию("GrEmpty|Empty"); // если это первый уровень... Если Уровень=1 Тогда //...выведем Г-образную линию... Если Последний=1 Тогда Таб.ПрисоединитьСекцию("GrHook|Lines"); // ...или Т-образную линию Иначе Таб.ПрисоединитьСекцию("GrTSect|Lines"); КонецЕсли; Иначе // для первого уровня выведем линию или пустоту Если Уровни.ПолучитьЗначение(1)=1 Тогда Таб.ПрисоединитьСекцию("GrLine|Lines"); Иначе Таб.ПрисоединитьСекцию("GrEmpty|Lines"); КонецЕсли; // для остальных уровней присоединим линию или пустоту Для Сч=2 По Уровень-1 Цикл Если Уровни.ПолучитьЗначение(Сч)=1 Тогда Таб.ПрисоединитьСекцию("GrLine|Lines"); Иначе Таб.ПрисоединитьСекцию("GrEmpty|Lines"); КонецЕсли; КонецЦикла; Если Последний=1 Тогда Таб.ПрисоединитьСекцию("GrHook|Lines"); Иначе Таб.ПрисоединитьСекцию("GrTSect|Lines"); КонецЕсли; КонецЕсли; // только теперь - присоединим секцию документа ПечДок=ПредставлениеДокумента(Док,ДокОснования); Если Докум=Док Тогда Таб.ПрисоединитьСекцию("ТекДок|Body"); Иначе Таб.ПрисоединитьСекцию("Group|Body"); КонецЕсли; Уровень=Уровень+1; ДокПодч.ВыбратьПодчиненныеДокументы(,,Док); ПровДокПодч.ВыбратьПодчиненныеДокументы(,,Док); Начало=1; Пока ДокПодч.ПолучитьДокумент()=1 Цикл Если СписокЗащитыОтЗацикливания.НайтиЗначение(ДокПодч.ТекущийДокумент())>0 Тогда Продолжить; КонецЕсли; СписокЗащитыОтЗацикливания.ДобавитьЗначение(ДокПодч.ТекущийДокумент()); Если Начало=1 Тогда А=ПровДокПодч.ПолучитьДокумент(); Начало=0; КонецЕсли; Если Док=ДокПодч.ТекущийДокумент() Тогда А=ПровДокПодч.ПолучитьДокумент(); Продолжить; КонецЕсли; Если ПровДокПодч.ПолучитьДокумент()=1 Тогда Если Док=ПровДокПодч.ТекущийДокумент() Тогда Уровни.УстановитьЗначение(Уровень,0); Последний=1; Иначе Уровни.УстановитьЗначение(Уровень,1); Последний=0; КонецЕсли; Иначе Уровни.УстановитьЗначение(Уровень,0); Последний=1; КонецЕсли; ВывестиПодчиненные(Докум,Док,ДокПодч.ТекущийДокумент(),Последний,Уровень,Уровни); КонецЦикла; Уровень=Уровень-1; КонецПроцедуры //-------------- Процедура СформироватьДерево() СписокЗащитыОтЗацикливания=СоздатьОбъект("СписокЗначений"); // Эта процедура формирует Дерево подчиненных документов Докум=ВыбДокумент; Если ПустоеЗначение(Докум)=1 Тогда Предупреждение("Не указан документ для построения структуры подчиненности!", 60); Возврат; КонецЕсли; Если Обновить = 2 Тогда СтрокаДействийФормы = "#Закрыть"; КонецЕсли; Расшифровка = СоздатьОбъект("СписокЗначений"); Расшифровка.Установить("Отчет", "ДеревоДокументов"); Расшифровка.Установить("Док", ВыбДокумент); Расшифровка.Установить("Обновить", 1); // сначала поднимемся по подчиненности вверх и найдем корень КореньДок=НайтиКорень(Докум); // теперь от корня спускаемся вниз, показывая все на своем пути // сначала заполним массив уровней нулями Уровень=0; Уровни=СоздатьОбъект("СписокЗначений"); Для Сч=1 По 20 Цикл Уровни.ДобавитьЗначение(0); КонецЦикла; // И почистим список защиты, чтобы ничего не пропустить СписокЗащитыОтЗацикливания.УдалитьВсе(); Если (ТипЗначенияСтр(Таб) <> "Таблица") или (Обновить = 0) Тогда Таб=СоздатьОбъект("Таблица"); Иначе Таб.Очистить(); КонецЕсли; Таб.ИсходнаяТаблица("ДеревоДокументов"); Таб.ВывестиСекцию("Кнопки"); // подчиненные документы ДокПодч=СоздатьОбъект("Документ"); // для проверки наличия следующего элемента в выборке // создадим еще один объект! ПровДокПодч=СоздатьОбъект("Документ"); ДокПодч.ВыбратьПодчиненныеДокументы(,,КореньДок); ПровДокПодч.ВыбратьПодчиненныеДокументы(,,КореньДок); Уровень=1; ПечДок=ПредставлениеДокумента(КореньДок,КореньДок); Если Докум=КореньДок Тогда Таб.ВывестиСекцию("КореньТекДок"); Иначе Таб.ВывестиСекцию("Header"); КонецЕсли; Начало=1; Пока ДокПодч.ПолучитьДокумент()=1 Цикл Если Начало=1 Тогда А=ПровДокПодч.ПолучитьДокумент(); Начало=0; КонецЕсли; Если КореньДок=ДокПодч.ТекущийДокумент() Тогда А=ПровДокПодч.ПолучитьДокумент(); Продолжить; КонецЕсли; Если ПровДокПодч.ПолучитьДокумент()=1 Тогда Если КореньДок=ПровДокПодч.ТекущийДокумент() Тогда Уровни.УстановитьЗначение(1,0); Последний=1; Иначе Уровни.УстановитьЗначение(1,1); Последний=0; КонецЕсли; Иначе Уровни.УстановитьЗначение(1,0); Последний=1; КонецЕсли; ВывестиПодчиненные(Докум,КореньДок,ДокПодч.ТекущийДокумент(),Последний,Уровень,Уровни); КонецЦикла; // Вывод заполненной формы Таб.Опции(0, 0, 3, 0,"ДеревоДокументов", "ДеревоДокументов"); Таб.ТолькоПросмотр(1); Таб.Показать("Дерево подчиненности документов",); КонецПроцедуры //------------------------------- Процедура ПриОткрытии() Если ТипЗначенияСтр(Форма.Параметр)="Документ" Тогда ВыбДокумент=Форма.Параметр; СформироватьДерево(); СтатусВозврата(0); Возврат; КонецЕсли; Обновить = 0; Если глФлагРасшифровки = 1 Тогда Обновить = Число(глРасшифровка.Получить("Обновить")); ВыбДокумент = глРасшифровка.Получить("Док"); Если Обновить <> 0 Тогда Таб = глТаблица; КонецЕсли; Если Обновить <> 2 Тогда СформироватьДерево(); СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; КонецПроцедуры //------------------------------- Помогите тупому)) |
|||
1
trozz
07.10.11
✎
08:52
|
Помогите кто чем может, понимаю что там легко, но не пойму где)) заранее спасибо
|
|||
2
lamme
07.10.11
✎
08:53
|
возьми типовую обработку
которая строит структуру подчиненности документов там эти дереьвя документов - строятся на любой уровень вниз |
|||
3
andrewks
07.10.11
✎
08:55
|
(2)+1
|
|||
4
trozz
07.10.11
✎
08:57
|
(2) из торговли?
|
|||
5
trozz
07.10.11
✎
10:19
|
В типовом дереве все точно также. не в этом дело
|
|||
6
trozz
07.10.11
✎
10:24
|
никто не знает?
|
|||
7
Ёпрст
07.10.11
✎
10:26
|
||||
8
filh
07.10.11
✎
10:27
|
от formex есть класное дерево доков.
|
|||
9
filh
07.10.11
✎
10:27
|
(7) во, точно))
|
|||
10
trozz
07.10.11
✎
10:28
|
(8) и где его искать?
|
|||
11
filh
07.10.11
✎
10:29
|
(10) см (7)
|
|||
12
filh
07.10.11
✎
10:30
|
(7) Во, а ты в курсе, АльФ будет продлять доменное имя DOREX.RU?
paid-till: 2011.09.08 free-date: 2011.10.12 |
|||
13
trozz
07.10.11
✎
10:31
|
(7)
базаДанных = СоздатьОбъект("SQLiteBase"); \ДЕРЕВОДОКОВ\СТРУКТУРАПОДЧ.ERT(459)}: Неудачная попытка создания объекта (SQLiteBase) Нужна какая то компонента? |
|||
14
filh
07.10.11
✎
10:37
|
1sqlite.dll
|
|||
15
trozz
07.10.11
✎
10:41
|
(14) уже понял))
Все равно строится по такой же схеме как и в (0) Может зависимость м\у документами какую то другую надо выставить? |
|||
16
trozz
07.10.11
✎
10:41
|
Они оба вводятся на основании друг друга
|
|||
17
Ёпрст
07.10.11
✎
10:45
|
(15) не верю.
Дерево Орефкова строит полный граф, в отличие от типовой |
|||
18
trozz
07.10.11
✎
10:51
|
(17) дело конечно твое, но строится точно также. Возможно что то неверно у менея в конфиге. Документы строятся на основании друг друга
|
|||
19
trozz
07.10.11
✎
10:54
|
строятся=вводятся
|
|||
20
dk
07.10.11
✎
10:56
|
(0) просто поменяй в типовом дереве защиту от зацикливания - там стоит 1 вхождение документа в дерево - поставь 2 вхождения и готово
|
|||
21
trozz
07.10.11
✎
10:57
|
(20) не понял - это где?
|
|||
22
dk
07.10.11
✎
11:01
|
ну там где-то прописана проверка, что если док. уже выводился в дерево, то по нему не ищутся подчиненные документы. убери эту защиту, точнее поставь проверку на двойное вхождение
|
|||
23
trozz
07.10.11
✎
11:02
|
(22) можешь в моем коде это найти? в упор не вижу
|
|||
24
dk
07.10.11
✎
11:03
|
Если СписокЗащитыОтЗацикливания.НайтиЗначение(РеквДок)>0 Тогда
|
|||
25
trozz
07.10.11
✎
11:04
|
(24) спасибо
|
|||
26
trozz
07.10.11
✎
11:07
|
(24)
комментирую "Если СписокЗащитыОтЗацикливания.НайтиЗначение(ДокПодч.ТекущийДокумент())>0 Тогда // Продолжить; //КонецЕсли;" все тоже самое, видимо еще с уровнями чтото поменять надо |
|||
27
trozz
07.10.11
✎
11:11
|
(26) всмысле
//Если СписокЗащитыОтЗацикливания.НайтиЗначение(РеквДок)>0 //Тогда // Продолжить; //КонецЕсли; |
|||
28
Ёпрст
07.10.11
✎
11:17
|
(18) не путай ввод на основании и подчиненность документов, это две разные разницы!
|
|||
29
dk
07.10.11
✎
11:19
|
(27) он тогда в бесконечный цикл уйдет, но попробуй ))
|
|||
30
trozz
07.10.11
✎
11:21
|
(28) а както можно сделать так, чтобы история вся прослеживалась?
|
|||
31
trozz
07.10.11
✎
11:21
|
(29) не уходит, тоже самое
|
|||
32
Ёпрст
07.10.11
✎
11:22
|
(30) иметь реквизит с типом документ в каждом документе - именно он обеспечивает подчиненность документов.
|
|||
33
dk
07.10.11
✎
11:24
|
|
|||
34
dk
07.10.11
✎
11:27
|
либо тут проверяется
Если СписокЗащитыОтЗацикливания.НайтиЗначение(ДокПодч.ТекущийДокумент())>0 Тогда |
|||
35
trozz
07.10.11
✎
11:29
|
(32) Спасибо огромное, в этом месте я и тупил!
Вопрос решился |
|||
36
trozz
07.10.11
✎
11:30
|
всем спасибо за участие))
|
|||
37
Cthulhu
07.10.11
✎
12:05
|
(35): помогает понимание ключевого момента:
"ВВОД НА ОСНОВАНИИ" - МЕХАНИЗМ СОЗДАНИЯ новых ДОКУМЕНТОВ, позволяющий при создании новых документов заполнять их информацией с использованием данных из другого документа. "ПОДЧИНЕННОСТЬ" - ОТНОШЕНИЕ МЕЖДУ ДОКУМЕНТАМИ, задаваемое наличием в одном документе (в любом его реквизите!) ссылки на другой документ. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |