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