Имя: Пароль:
1C
1С v8
Не получается выгрузить из ТЗ в дерево
,
0 ks-815
 
31.01.14
07:38
Доброе утричко всем!
Что-то делаю, как написано везде в гугле про выгрузку данных из дерево в ТЗ и обратно, а не получается. При выгрузке из ТЗ в дерево не ищется родитель. Дерево получается без плюсиков!
А везде на всех форумах этот код хвалят..

//Выгрузка из дерева в ТЗ:

Процедура ПриЗаписи(Отказ)
       ТЗВидыМТР = Новый ТаблицаЗначений;
       Для Каждого Колонка Из ЭтаФорма.ДеревоДанные.Колонки Цикл
           ТЗВидыМТР.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
       КонецЦикла;
       ТЗВидыМТР.Колонки.Добавить("КлючСвязи",Новый ОписаниеТипов("Строка"));
       ТЗВидыМТР.Колонки.Добавить("КлючСтроки",Новый ОписаниеТипов("Строка"));
      
       Дерево = ЭтаФорма.ДеревоДанные.Скопировать();
       Дерево.Колонки.Добавить("КлючСвязи",Новый ОписаниеТипов("Строка"));
       Дерево.Колонки.Добавить("КлючСтроки",Новый ОписаниеТипов("Строка"));
      
       ОбновитьКлючиСвязиВДеревеЗначений(Дерево);
       ОбновитьКлючиСтрокВДеревеЗначений(Дерево);
       ЗаписьСтрокДереваВТаблицу(Дерево, ТЗВидыМТР);
      
       ВидыМТР.Загрузить(ТЗВидыМТР);
   КонецПроцедуры
  
   Функция ЗаписьСтрокДереваВТаблицу(Дерево, Таблица)
       Для Каждого СтрокаДерева Из Дерево.Строки Цикл
           СтрокаТаблицы = Таблица.Добавить();
           ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокаДерева);
           ЗаписьСтрокДереваВТаблицу(СтрокаДерева, Таблица);
       КонецЦикла;  
       Возврат Таблица;
   КонецФункции  



//Выгрузка из ТЗ в дерево:



Процедура ПриОткрытии()

           ТЗВидыМТР = ВидыМТР.Выгрузить();
          
           Дерево = Новый ДеревоЗначений;
           Для Каждого Колонка Из ТЗВидыМТР.Колонки Цикл
               Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
           КонецЦикла;
          
           ЗаполнитьДерево(ТЗВидыМТР, Дерево);
        
           ЭлементыФормы.ДеревоДанные.Значение = Дерево;  
           ЭлементыФормы.ДеревоДанные.СоздатьКолонки();
           ЭлементыФормы.ДеревоДанные.Колонки.Вид.Ширина = 6;
       КонецЕсли;
   КонецПроцедуры
  
   Функция ЗаполнитьДерево(Таблица, Дерево, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи")
       Для Каждого СтрокаТаблицы Из Таблица Цикл
           СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина);
           Если СтрокаГруппировки = Неопределено Тогда
               ЗаполнитьЗначенияСвойств(Дерево.Строки.Добавить(), СтрокаТаблицы);
           Иначе
               ЗаполнитьЗначенияСвойств(СтрокаГруппировки.Строки.Добавить(), СтрокаТаблицы);
           КонецЕсли;
       КонецЦикла;    
       Возврат Дерево;
   КонецФункции
1 mzelensky
 
31.01.14
07:43
(0) А ты в настройках самого дерева (элемента формы) поставил нужные галочки?
2 ks-815
 
31.01.14
07:46
(1) поставила! когда выгружается обратно, при трассировке у дерева нет родителей. а когда из дерева в тз - у дерева есть родители.
3 mzelensky
 
31.01.14
07:49
(2) Я правильно понимаю, что ты пытаешься сделать дерево в 2 уровня?
4 ks-815
 
31.01.14
07:51
(3) там уровней 3.
5 mzelensky
 
31.01.14
07:53
(4) у дерева (элемента формы) должна стоять галочка "Дерево" + у нужной колонки должна стоять галочка "Отображать иерархию". Стоят?
6 mzelensky
 
31.01.14
07:56
(5) Сама процедура "ЗаполнитьДерево(" вроде написана верно.

Если не получается, то сделай сперва настройку дерева (как элемента формы) нормально в ручную, без вот этого:

ЭлементыФормы.ДеревоДанные.Значение = Дерево;  
ЭлементыФормы.ДеревоДанные.СоздатьКолонки();
ЭлементыФормы.ДеревоДанные.Колонки.Вид.Ширина = 6;

А потом уже пробуй делать программно.
7 ks-815
 
31.01.14
07:56
(5) колонки создаются программно в процедуре "ПриОткрытии". Надо еще кодом что-то прописать??
8 mzelensky
 
31.01.14
07:59
(7) Попробуй программно это свойство заполнить.

А вообще - еслди не умеешь работать с каким-то компонентом, то не нужно начинать с программного создания. Сделай сперва руками, а когда поймешь как работает - переделай на программное создание. Так проще.
9 ks-815
 
31.01.14
08:01
(6) попробовала. плюсиков нет. просто таблицей выводит :(
10 ks-815
 
31.01.14
08:02
может надо еще родителя выгружать в ТЗ????? а потом прицеплять его к дереву?
11 mzelensky
 
31.01.14
08:05
(10) Ты про какого родителя? Из ТЗ?

Вообще для самого дерева он не нужен. Это чисто чтобы из ТЗ и обратно гонять.
12 ks-815
 
31.01.14
08:07
(11) Точно не нужно из дерева выгружать в ТЗ родителей, чтобы потом при загрузке из ТЗ в дерево указывать у каждой строки родителя??
13 kosts
 
31.01.14
08:07
Думаю нужно использовать ключи. Для каждой ветки дерева должна быть уникальная связь. Сейчас везде идентичная связь, по этому всё попадает на один уровень.

ЗаполнитьДерево(Таблица, Дерево, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи")
14 mzelensky
 
31.01.14
08:07
Сдается мне, что у тебя как-то коряво сам элемент формы настроен. Еще раз повторяю, сделай сперва ручную настройку.

И зачем делать вот так:

Дерево = Новый ДеревоЗначений;
           Для Каждого Колонка Из ТЗВидыМТР.Колонки Цикл
               Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
           КонецЦикла;
...
...

ЭлементыФормы.ДеревоДанные.Значение = Дерево;  


Можно сразу в "ДеревоДанные" загружать. Ты сама себе жизнь усложняешь.
15 mzelensky
 
31.01.14
08:09
(13) Ну вот...так это у тебя ТЗ тогда коряво заполнено. Я подразумевал .что ТЗ сформировано верно.

Короче проходи отладчиком и смотри.
16 ks-815
 
31.01.14
08:18
(14) мне не нужно колонки с ключами выводить из ТЗ. я на форму не всё буду выгружать
17 kosts
 
31.01.14
08:20
(16) Как этот алгоритм должен понять, что именно эта строка должна попасть вон в ту ветку дерева, а не в другую?
Напиши свой собственный алгоритм преобразования ТЗ в Дерево, что бы понять принцип.
18 mzelensky
 
31.01.14
08:22
(17) Вот по этому принципу она понимает:

СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина);

Просто для этого "Ключи" должны быть верно заполнены. А я так понимаю у ее они корявые.
19 mzelensky
 
31.01.14
08:24
Вот мой код. Он 100% рабочий и практически идентичен в (0).

Здесь "ДеревоТСД" - дерево, которое заполняется
"ТабличнаяТСД" - табличная часть (твоя ТЗ)

Процедура ЗаполнитьДеревоИзТЧ(ДеревоТСД=неопределено) ЭКСПОРТ
    Запрос=новый запрос;
    Запрос.Текст="ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |    &ТЧ КАК ТЧ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    *
    |ИЗ
    |    ВТ КАК ВТ
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерСтроки
    |";
    ЗАпрос.УстановитьПараметр("ТЧ",ТабличнаяТСД);
    Выборка=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Выборка.Следующий() цикл
        Если ЗначениеЗаполнено(Выборка.КлючРодителя) тогда
            Отбор=новый Структура;
            Отбор.Вставить("КлючСтроки", Выборка.КлючРодителя );             
            НайденныеСтроки=ДеревоТСД.Строки.НайтиСтроки(Отбор, истина);
            Если НайденныеСтроки.Количество()=1 тогда                     
                НстрокаДЗ=НайденныеСтроки[0].Строки.Добавить();
                ЗаполнитьЗначенияСвойств(НстрокаДЗ,Выборка);
            КонецЕсли;
        Иначе
            НстрокаДЗ=ДеревоТСД.Строки.Добавить();
            ЗаполнитьЗначенияСвойств(НстрокаДЗ,Выборка);
        КонецЕсли;
    КонецЦикла;
    Выборка=NULL;
    Запрос=NULL;
КонецПроцедуры
20 ks-815
 
31.01.14
09:03
Я вгляделась в свой код!! вот она, ошибка:

   ОбновитьКлючиСвязиВДеревеЗначений(Дерево);
   ОбновитьКлючиСтрокВДеревеЗначений(Дерево);


Надо местами строки поменять - и, о чудо, плюсики появились!!