Имя: Пароль:
1C
1С v8
Заполнение ДеревоЗначений из данных ТаблицаЗначений
0 shock3r
 
09.09.14
12:38
Добрый день, сделал заполнение ТаблицыЗначений документа, данными из Дерева значений, использовал рекурсию.

Теперь необходимо реализовать обратный алгоритм. Строка ТЗ содержит UIN и UIN родителя, у Корня есть UIN, UIN родителя не заполнен. Не могу найти пример как правильно обходить данные ТЗ, нужно ли делать группировки по UIN или UIN родителя, нужно ли в страке хранить уровень в дереве?

p.s. кол-во уровней в дереве не ограничено
1 shock3r
 
09.09.14
12:39
страке = строке, сорри
2 1Сергей
 
09.09.14
12:41
Это надо запросом чтоли?
3 shock3r
 
09.09.14
12:50
Вот так выглядит дерево: http://c2n.me/iSv22u

вот так выглядят данные дерева, сохраненные в ТЗ: http://c2n.me/iSv34M

Может у кого-то есть пример, как из ТЗ построить дерево
4 Borteg
 
09.09.14
12:53
(3) бухгалтерия 3.0 обработка клиент банк  модуль менеджера, там строится из тз дерево.
5 shock3r
 
09.09.14
12:55
(4) Живу в Беларуси, у нас бухгалтерия 1.6, не могли бы вы скинуть код процедуры?
6 Borteg
 
09.09.14
12:56
(3)     СтруктураПоиска = Новый Структура("Представление, Значение", ПолеПоиска, ЗначениеПоиска);
    НайденныеЗаписиОКонтрагенте = ДеревоКонтрагентов.Строки.НайтиСтроки(СтруктураПоиска, Истина);
    
    // Контрагент
    Если НайденныеЗаписиОКонтрагенте.Количество() = 0 Тогда
        
        НовыйКонтрагент = ДеревоКонтрагентов.Строки.Добавить();
        Окончание = ?(СтрокаДокумента[ТипКонтрагента + "1"] = "", "", "1");
        НовыйКонтрагент.Представление = СтрокаДокумента[ТипКонтрагента + Окончание];
        НовыйКонтрагент.НомСтроки     = СтрокаДокумента.НомерСтроки;
        
        ДобавитьОписаниеНовогоРеквизита("Наименование", Окончание, ТипКонтрагента, НовыйКонтрагент.Строки, СтрокаДокумента);
        ДобавитьОписаниеНовогоРеквизита("ИНН",          "ИНН",     ТипКонтрагента, НовыйКонтрагент.Строки, СтрокаДокумента);
        ДобавитьОписаниеНовогоРеквизита("КПП",          "КПП",     ТипКонтрагента, НовыйКонтрагент.Строки, СтрокаДокумента);
        
        Если НайденКонтрагент Тогда
            НовыйКонтрагент.Реквизит = СтрокаДокумента.Контрагент;
        КонецЕсли;
        
    Иначе
        
        НайденнаяЗаписьОКонтрагенте = НайденныеЗаписиОКонтрагенте[0];
        НовыйКонтрагент = НайденнаяЗаписьОКонтрагенте.Родитель;
        НовыйКонтрагент.УчаствуетВНесколькихСтроках = Истина;
        НовыйКонтрагент.ДопСтрокиВКоторыхУчаствуетКонтрагент.Добавить(СтрокаДокумента.НомерСтроки);
        
        Если НовыйКонтрагент = Неопределено Тогда
            НовыйКонтрагент = НайденнаяЗаписьОКонтрагенте;
        КонецЕсли;
        
    КонецЕсли;
    
    //СчетКонтрагента
    НайденныеСтроки = НовыйКонтрагент.Строки.Найти(СтрокаДокумента[ТипКонтрагента + "СЧЕТ"], "Значение");
    Если НЕ НайденСчет И НайденныеСтроки = Неопределено Тогда
        
        РеквизитыНовогоКонтрагента = ДобавитьОписаниеНовогоРеквизита("Р/счет", "СЧЕТ", ТипКонтрагента, НовыйКонтрагент.Строки, СтрокаДокумента);
        ПрямыеРасчеты = ПустаяСтрока(СтрокаДокумента[ТипКонтрагента + "2"]);
        
        Если ПрямыеРасчеты Тогда
            ДобавитьОписаниеНовогоРеквизита("Банк",            "БАНК1",   ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Город банка",     "БАНК2",   ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Код банка",       "БИК",     ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Кор. счет банка", "КОРСЧЕТ", ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
        Иначе
            ДобавитьОписаниеНовогоРеквизита("Банк",                     "3",        ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Город банка",              "4",        ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Кор. счет банка",          "РАСЧСЧЕТ", ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("РЦ банка",                 "БАНК1",    ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Местонахождение РЦ банка", "БАНК2",    ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Код РЦ банка",             "БИК",      ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
            ДобавитьОписаниеНовогоРеквизита("Кор. счет РЦ банка",       "КОРСЧЕТ",  ТипКонтрагента, РеквизитыНовогоКонтрагента.Строки, СтрокаДокумента);
        КонецЕсли;
        
    КонецЕсли;
7 Borteg
 
09.09.14
12:56
(5) // Функция добавляет и возвращает описание нового реквизита.
//
Функция ДобавитьОписаниеНовогоРеквизита(Представление, Реквизит, ТипКонтрагента, НовыйКонтрагент, СтрокаДокумента)
    
    РеквизитыНовогоКонтрагента = НовыйКонтрагент.Добавить();
    
    РеквизитыНовогоКонтрагента.Представление = Представление;
    РеквизитыНовогоКонтрагента.Значение      = СтрокаДокумента[ТипКонтрагента + Реквизит];
    РеквизитыНовогоКонтрагента.Реквизит      = ТипКонтрагента + Реквизит;
    
    Возврат РеквизитыНовогоКонтрагента;
    
КонецФункции
8 shock3r
 
09.09.14
12:56
Borteg спасибо, буду разбираться
9 13_Mult
 
09.09.14
12:57
см (2)
Например ТЗ в запрос, а из запроса сразу в деревяшку
10 kosts
 
09.09.14
13:00
(0) По существу дела.
Достаточно ID строки и ID родителя.
Если сохранять дерево в таблицу последовательно, а потом последовательно восстанавливать, то должно быстро работать за один проход.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший