|   |   | 
| 
 | Заполнение ДеревоЗначений из данных ТаблицаЗначений | ☑ | ||
|---|---|---|---|---|
| 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 родителя. Если сохранять дерево в таблицу последовательно, а потом последовательно восстанавливать, то должно быстро работать за один проход. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |