Имя: Пароль:
1C
1C 7.7
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

Если СписокЗащитыОтЗацикливания.НайтиЗначение(РеквДок)>0 Тогда
  Если СписокЗащитыОтЗацикливания2.НайтиЗначение(РеквДок)>0 Тогда
     Продолжить;
  Иначе
     СписокЗащитыОтЗацикливания2.ДобавитьЗначение(РеквДок);
  КонецЕсли
КонецЕсли;
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): помогает понимание ключевого момента:
"ВВОД НА ОСНОВАНИИ" - МЕХАНИЗМ СОЗДАНИЯ новых ДОКУМЕНТОВ, позволяющий при создании новых документов заполнять их информацией с использованием данных из другого документа.
"ПОДЧИНЕННОСТЬ" - ОТНОШЕНИЕ МЕЖДУ ДОКУМЕНТАМИ, задаваемое наличием в одном документе (в любом его реквизите!) ссылки на другой документ.