Вход | Регистрация


1С:Предприятие ::

Метки:

Как вывести иерархическое дерево в отчете?

Я
   ytrewq
 
13.11.04 - 16:34
сабж
 
 
   Лошадка в пальто
 
1 - 13.11.04 - 16:35
К Осипам... они деревья свои растят...мобилы раздают...
   ytrewq
 
2 - 13.11.04 - 18:20
Задача такая создается справочник один из реквизитов которого ссылается на
другой элемент справочника .Нужно вывести отчет в котором будет представлена иерархия элементов справочника ,примерно так :
иванов
     сидоров
              казлов
      петров
            водкин
т.е. сидоров ,петров подчинены иванову ,казлов сидорову водкин петрову итд
можете подсказать как релизовать это вмодуле
   Фокусник
 
3 - 13.11.04 - 18:36
(0)Нанять специалиста.
А фамилии писать с маленькой буквы - это хамство по отношению к их владельцам.
   ytrewq
 
4 - 13.11.04 - 19:08
специалисты скажите ктонить как релизовать
очень надо
   427
 
5 - 13.11.04 - 20:04
Без проблем - но безграмотным подсказывать - вера не позволяет...
   Андрей66
6 - 14.11.04 - 00:46
казлов  - хорошая фамилия!!!
   ytrewq
 
7 - 14.11.04 - 01:09
Вот я тут сам коечто уже написал, но в функции глобального модуля неработает сравнение .Тоесть оно работает но выдает неккорктный результат
Если Пер=Спр.Род Тогда Парам=1;  иначе  Парам=0; конецесли; При сравнении
двух одинаковых реквизитов одного справочника выдает 0

//Отчет*******************************************
      Процедура Сформировать() 
                Таб = СоздатьОбъект("Таблица"); 
                   Пар=РодВыбр; 
               
                   Выв(Пар,Таб);    
                      Таб.Показать();
     КонецПроцедуры  
  

//Глобальный модуль******************************************* 

Функция ПоискПоРеквизиту(Парам) Экспорт  
    Спр= Создатьобъект("Справочник.Продавцы");
    Пер=Парам ;
       Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
            Если Пер=Спр.Род Тогда 
            Парам=1;  иначе  Парам=0;
                    конецесли;
        КонецЦикла; 
    конецфункции
    
    Процедура Выв(Пар,Таб)  Экспорт 
        Спр= Создатьобъект("Справочник.Продавцы");
            Таб.Вывестисекцию("Родитель");
        Спр.ВыбратьЭлементы();
        Пока Спр.ПолучитьЭлемент() = 1 Цикл 
            If Спр.Род=Пар then 
                Таб.Вывестисекцию("Подчинен"); 
                Парам=Спр.Наименование;
                    ПоискПоРеквизиту(Парам);
                сообщить(Парам);
               //Выв(Пар,Таб);

            конецесли;
        КонецЦикла; 
        КонецПроцедуры
   ytrewq
 
8 - 14.11.04 - 01:11
Тоесть функция должна проверять наличие подчиненных объектов 3 уровня иерархии
а потом при наличии таковых должна запускаться рекурсия
   о_о
 
9 - 14.11.04 - 02:25
Если справочник не большой, то создай ТЗ с колонками элемент и родитель. Отсортируй и выводи на печать.
   427
 
10 - 14.11.04 - 14:16
(9) не прокатит...
 
  Рекламное место пустует
   ytrewq
 
11 - 14.11.04 - 23:07
Может скажеш как сделать чтобы прокатило
   syktyk
 
12 - 14.11.04 - 23:52
(0)Тебе же в реалнете функцию привели...
   romix
 
13 - 15.11.04 - 05:20
Пример рекурсивного обхода номенклатуры, в которой есть ссылки на документы комплектации (из чего состоит сборка, и так в свою очередь может быть много раз):

////////////////////////////////////////////////////////////////

Процедура Рекурсия(Изделие)
        
        док=Изделие.МастерКомплектация;
        док.ВыбратьСтроки();
        Пока док.ПолучитьСтроку()=1 Цикл
            ИмяЭлемента=СокрЛП(""+док.Наименование.Артикул+" "+док.Наименование);
            Сообщить("Элемент: "+ИмяЭлемента);
            мк=док.Наименование.МастерКомплектация;
            Если ""+мк="" Тогда
            Иначе    
Сообщить("==================");
Рекурсия(док.Наименование);
            КонецЕсли;
        КонецЦикла;
КонецПроцедуры// Рекурсия()
   romix
 
14 - 15.11.04 - 05:25
(7) Ошибка наверное вот здесь:

Парам=Спр.Наименование;
          ПоискПоРеквизиту(Парам)

1С не проверяет типы данных, и некоторые люди (особенно новички) могут всунуть Наименование там, где следовало бы - ТекущийЭлемент().
   427
 
15 - 15.11.04 - 06:24
и нигде не приведено нормального решения проблем (0)

(12) на реалнете - просто печать по группам. Без учета иерархии
   Морозов Александр
 
21 - 15.11.04 - 08:31
Процедура Сформировать()                   
    СписокОбработанных=СоздатьОбъект("СписокЗначений");
    ЕРТаб=СоздатьОбъект("ТаблицаЗначений");
    ЕРТаб.НоваяКолонка("Главный");
    КолКолонок=1;
    СпрДляПоиска=СоздатьОбъект("Справочник.Сотрудники");
    СпрДляВыборки=СоздатьОбъект("Справочник.Сотрудники");
    СпрДляВыборки.ВыбратьЭлементы();       
    Пока СпрДляВыборки.ПолучитьЭлемент()=1 Цикл
        Если СпИскл.Принадлежит(СпрДляВыборки.ТекущийЭлемент())=1 Тогда
            Продолжить;
        КонецЕсли;
        ЕРТаб.НоваяСтрока();
        ЕРТаб.Главный=СпрДляВыборки.ТекущийЭлемент(); 
        СписокОбработанных.ДобавитьЗначение(СпрДляВыборки.ТекущийЭлемент());
        СпрСсылка=СпрДляВыборки.НужныйРеквизит
        Пока Спрссылка<>0 Цикл 
            СпрДляПоиска.НайтиЭлемент(СпрССылка);    
            КолКолонок=КолКолонок+1;
            Если ЕРТаб.КоличествоКолонок()<КолКолонок Тогда
                ЕРТаб.НоваяКолонка("Подчинен"+КолКолонок);
            КонецЕсли;
            ЕРТаб.НоваяСтрока();
            ЕРТТаб.УстановитьЗначение(,"Подчинен"+КолКолонок,СпрДляПоиска.ТекущийЭлемент());
            СписокОбработанных.ДобавитьЗначение(СпрДляПоиска.ТекущийЭлемент());
            Если ПустоеЗначение(СпрДляПоиска.НужныйРеквизит)=1 Тогда
                СпрСсылка=0;
            Иначе
                СпрСсылка=СпрДляПоиска.НужныйРеквизит;
            КонецЕсли;
        КонецЦикла;   
        КолКолонок=1;
    КонецЦикла;
КонецПроцедуры

В конце по идеи должны получить ерархическую таблицу ЕРТТаб
   GrayT
 
22 - 15.11.04 - 09:05
Что то я не понял задачи.
А что простой запрос по справочнику + присоединение секций спереди по уровню группы не прокатывает?
   Морозов Александр
 
23 - 15.11.04 - 09:16
(22)А при чем здесь группы?
   NS
 
24 - 15.11.04 - 11:10
Не понял... У тебя иерархический справочник?
Тебе нужно сделать отступ согласно уровню?
ПечСотрудник=НачальныеПробелы+Сотрудник.Наименование?
В чем вопрос-то?
   ytrewq
 
25 - 15.11.04 - 13:22
Ошибка моя в том что ясравнивал разные типы данных
тоесть первую выборку процедура выдает потомучто идет отбор по введенной
в форме отчета переменной ,чтобы продолжить  выборку нужно сравнивать два реквизита разных типов которые немогут быть равны .Я вот вообще в непонятках как же организовать выборку если невозможно сравнивать эти два реквизита, а любая выборка через запрос либо через массивы все равно упирается в необходимость сравнить  реквизиты .Понятно что типы у них разные нокак тогда быть?
   ytrewq
 
26 - 15.11.04 - 14:17
Впринце решение я нашел ,а немогли бы вы сказать как сделать чтобы значение выводимое в Отчете сдвигалось  при выводе секции
   GrayT
 
27 - 15.11.04 - 14:22
Через ПрисоеденитьСекцию()
   NS
 
28 - 15.11.04 - 15:28
(26,27)
Через ПечСотрудник=НачальныеПробелы+....
   GrayT
 
29 - 15.11.04 - 15:44
(28)Через присоеденить секцию можно дерево нарисовать красивое, но так проще конечно
   ytrewq
 
30 - 15.11.04 - 17:47
(29) скажи как это примерно выглядило бы в модуле ,а то я с "Присоединитьсекцию" несовсем еще разобрался

 //Глоб Модуль  **********************************8

Процедура Выв(Таб,Пар,Пробел)  Экспорт 
    
    Спр= Создатьобъект("Справочник.Продавцы"); 
    Пар1=Пар;  
    пробел1=пробел;
    Спр.ВыбратьЭлементы(); 
    Пока Спр.ПолучитьЭлемент() = 1 Цикл 
        Если Пар1=Спр.Род Тогда   
            Таб.Вывестисекцию("Имя1");
            Пар =Спр.ТекущийЭлемент();
            Пробел=Пробел+Пробел;
            Выв(Таб,Пар,Пробел)  ; 
        конецесли; 
        Пробел=Пробел1; 
    КонецЦикла;   
КонецПроцедуры
   GrayT
 
31 - 15.11.04 - 22:44
(30)Бр-р-р-р. Рекурсия? Нах.... Зачем?
Спр = СоздатьОбъект("Справочник.ОбъектыУчета");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
    СтрВывода = "";
    Для сч = 2 по Спр.Уровень() Цикл
        СтрВывода = СтрВывода + "    ";
    КонецЦикла; 
    СтрВывода = СтрВывода + Спр.Наименование;
    Таб.ВывестиСекцию("Строка");
КонецЦикла;

С присоеденитьСекцию немногим сложнее.
   ytrewq
 
32 - 16.11.04 - 01:01
на самом деле ни уровней ни групп здесь нет - справочник одноуровневый.
И вывести его иерархию без рекурсии мне представляется муторным делом.
Ладно слава богу все работает и выводится как надо , всем спасибо за внимание.
   GrayT
 
33 - 16.11.04 - 10:48
Ну нет, так нет. Хотя справочник ОбъектыУчета у меня 4-х уровневый и заполнение по уровням определяется программно - т.е. он забит под завязку по всем 4 уровням.
Нравиться рекурсия - чеши левой пяткой правое ухо
 
 



Список тем форума
Рекламное место пустует   Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует