Имя: Пароль:
1C
1С v8
Туплю и не вижу ошибки
0 shlyahtich
 
25.03.12
10:00
Загоняю запросом в ДеревоЗначений и не понимаю - почему пусто


   ЗапросТЗ=Новый Запрос;
   ЗапросТЗ.Текст ="ВЫБРАТЬ
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Описание КАК Описание,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Контрагент КАК Контрагент,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ДоговорКонтрагента КАК ДоговорКонтрагента,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ДатаПринятияКУчету,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Валюта КАК Валюта,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СчетУчета КАК СчетУчета,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Остаток,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ДатаПоследнейОперации,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ТипЗайма,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СчетУчетаЗайма,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СчетУчетаПроцентов,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ПроцентГодовой,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Процент,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ПредставлениеПроцента,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.НачалоПериода,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.КонецПериода,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.КоличествоДней,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СуммаПроцентов,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ПроцентЦБРФ,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Коэффициент,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СуммаПроцентовПринмаемая,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СуммаПроцентовНеПринмаемая
                   |ИЗ
                   |    Документ.НачислениеПроцентовПоКредитамИЗаймам.ЗаймыПолученные КАК НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные
                   |ГДЕ
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Ссылка = &Документ
                   |ИТОГИ ПО
                   |    Валюта,
                   |    СчетУчета,
                   |    Контрагент,
                   |    ДоговорКонтрагента,
                   |    Описание";
   ЗапросТЗ.УстановитьПараметр("Документ",ЭтотОбъект.Ссылка);
   
   л_РезультатЗапроса = ЗапросТЗ.Выполнить();
   

   ВыборкаВалют = л_РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока ВыборкаВалют.Следующий() Цикл
       л_СтрокаДЗВалюта = ДеревоЗаймовПолученных.Строки.Добавить();
       л_СтрокаДЗВалюта.Валюта = ВыборкаВалют.Валюта;
       л_СтрокаДЗВалюта.Описание = ВыборкаВалют.Описание;
       ВыборкаСчетов = ВыборкаВалют.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       Пока ВыборкаСчетов.Следующий() Цикл
           л_СтрокаДЗСчет = л_СтрокаДЗВалюта.Строки.Добавить();
           л_СтрокаДЗСчет.Валюта = л_СтрокаДЗВалюта.Валюта;
           л_СтрокаДЗСчет.СчетУчета = ВыборкаСчетов.СчетУчета;
           ВыборкаКонтрагентов = ВыборкаСчетов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           Пока ВыборкаКонтрагентов.Следующий() Цикл
               л_СтрокаДЗКонтрагент = л_СтрокаДЗСчет.Строки.Добавить();
               л_СтрокаДЗКонтрагент.Валюта = л_СтрокаДЗВалюта.Валюта;
               л_СтрокаДЗКонтрагент.СчетУчета = л_СтрокаДЗСчет.СчетУчета;
               л_СтрокаДЗКонтрагент.Контрагент = ВыборкаКонтрагентов.Контрагент;
               ВыборкаДоговоров = ВыборкаКонтрагентов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               Пока ВыборкаДоговоров.Следующий() Цикл
                   л_СтрокаДЗДоговор = л_СтрокаДЗКонтрагент.Строки.Добавить();
                   л_СтрокаДЗДоговор.Валюта = л_СтрокаДЗВалюта.Валюта;
               КонецЦикла;    
           КонецЦикла;    
       КонецЦикла;    
   КонецЦикла;    
   
Для каждого л_СтрокаДЗ из ДеревоЗаймовПолученных.Строки Цикл
   ЭлементыФормы.ДеревоЗаймовПолученных.Развернуть(л_СтрокаДЗ, Истина);
КонецЦикла;
1 shlyahtich
 
25.03.12
10:02
колонки деревьев созданы ранее


       л_ТипДата = Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.Дата));
       л_ТипСумма = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2));
   //
   ДеревоЗаймовПолученных.Колонки.Добавить("Описание",Новый ОписаниеТипов("Строка"),"Объект",40);
   ДеревоЗаймовПолученных.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"),"Контрагент",20);
   ДеревоЗаймовПолученных.Колонки.Добавить("ДоговорКонтрагента",Новый ОписаниеТипов("СправочникСсылка.ДоговорыКонтрагентов"),"Договор",20);
   ДеревоЗаймовПолученных.Колонки.Добавить("ДатаПринятияКУчету",л_ТипДата,"Принято к учету",10);
   ДеревоЗаймовПолученных.Колонки.Добавить("Валюта",Новый ОписаниеТипов("СправочникСсылка.Валюты"),"Валюта",5);
   ДеревоЗаймовПолученных.Колонки.Добавить("СчетУчета",Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"),"Счет движения",7);
   ДеревоЗаймовПолученных.Колонки.Добавить("Остаток",л_ТипСумма,"Остаток",15);
   ДеревоЗаймовПолученных.Колонки.Добавить("ДатаПоследнейОперации",л_ТипДата,"Последняя операция",10);
   ДеревоЗаймовПолученных.Колонки.Добавить("ТипЗайма",Новый ОписаниеТипов("Строка"),"Тип займа",10);
   ДеревоЗаймовПолученных.Колонки.Добавить("СчетУчетаЗайма",Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"),"Счет учета займа в договоре",7);
   ДеревоЗаймовПолученных.Колонки.Добавить("СчетУчетаПроцентов",Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"),"Счет учета %",7);
   ДеревоЗаймовПолученных.Колонки.Добавить("ПроцентГодовой",Новый ОписаниеТипов("Число"),"% годовой",5);
   ДеревоЗаймовПолученных.Колонки.Добавить("Процент",Новый ОписаниеТипов("Число"),"%",5);
   ДеревоЗаймовПолученных.Колонки.Добавить("ПредставлениеПроцента",Новый ОписаниеТипов("Строка"),"Представление %",6);
   ДеревоЗаймовПолученных.Колонки.Добавить("НачалоПериода",л_ТипДата,"Начало периода",10);
   ДеревоЗаймовПолученных.Колонки.Добавить("КонецПериода",л_ТипДата,"Конец периода",10);
   ДеревоЗаймовПолученных.Колонки.Добавить("КоличествоДней",Новый ОписаниеТипов("Число"),"Дней",5);
   ДеревоЗаймовПолученных.Колонки.Добавить("СуммаПроцентов",л_ТипСумма,"Сумма %",15);
   ДеревоЗаймовПолученных.Колонки.Добавить("ПроцентЦБРФ",Новый ОписаниеТипов("Число"),"%ЦБРФ",5);
   ДеревоЗаймовПолученных.Колонки.Добавить("Коэффициент",Новый ОписаниеТипов("Число"),"К. нормирования ",5);
   ДеревоЗаймовПолученных.Колонки.Добавить("СуммаПроцентовПринмаемая",л_ТипСумма,"Сумма % прин.",15);
   ДеревоЗаймовПолученных.Колонки.Добавить("СуммаПроцентовНеПринмаемая",л_ТипСумма,"Сумма % не прин.",15);
2 Шапокляк
 
25.03.12
10:07
А почему вы не хотите результат просто выгрузить в дерево?
3 МихаилМ
 
25.03.12
10:18
а где в запросе группировки
4 patapum
 
25.03.12
10:23
может быть в табличной части пусто?
5 shlyahtich
 
25.03.12
10:25
(2) ИТОГИ ПО и есть группировки


(3) Дерево рассчитывается, сохраняется в ТабЧасть документа, потом восстанавливается из неё

Выгрузить результат запроса в дерево, у которого уже определены колонки - это ккак?
6 shlyahtich
 
25.03.12
10:26
(4) не пусто - запрос в консоли проверен
7 patapum
 
25.03.12
10:28
а как ты проверил что в дереве пусто?
8 shlyahtich
 
25.03.12
10:30
ЭлементыФормы.ДеревоЗаймовПолученных -> данных нетути
9 shlyahtich
 
25.03.12
10:30
(7)ДеревоЗаймовПолученных это реквизит формы обычной, не управляемой
10 patapum
 
25.03.12
10:32
а в отладчике что после выполнения кода? я не верю, что дерево пустое
11 shlyahtich
 
25.03.12
10:35
(10) в отладчике вижу как строки добавляются - а на форме не вижу результата.
а Табличное поле с данными ДеревоЗаймовПолученных и типом ДеревоЗначение
12 Шапокляк
 
25.03.12
10:36
Дерево=Результат.выгрузить(ОбходРезультатаЗапроса.Погруппировкам);
Дерево.ВыбратьСтроку();//просто поглядеть, что там получается
ЭлементыФормы.ТабличноеПолеСДеревом.Значение=Дерево; //по идее, если колонки совпадают, все должно подхватиться
13 patapum
 
25.03.12
10:38
так получается у тебя с отображением проблема, а ты нам запрос и выборку показываешь, которые прекрасно работают
14 shlyahtich
 
25.03.12
10:39
(12) а я вообще очищаю и заполняю - совпадают вроде... ну не все заполнял как видно для теста
(13) Вот именно - не понимаю где в отображении то плюха может быть - там вроде и негде
15 Web00001
 
25.03.12
10:39
(12) Ну как бы еще и СоздатьКолонки() не мешало бы
16 shlyahtich
 
25.03.12
10:40
Ладно - видно где то что то в воскресение... надо наверно пойти пивка попить и все пройдет
17 patapum
 
25.03.12
10:40
чтобы понять, почему не работает надо противно до тошноты объяснить почему оно должно работать
18 patapum
 
25.03.12
10:41
пивка попить - одобряю!
19 shlyahtich
 
25.03.12
10:41
(15) - а (1)?
20 Web00001
 
25.03.12
10:42
(14) Вычислить выражение в отладчике, надо по дереву сделать, чтоб понять натупил с отображением или с заполнением
21 Web00001
 
25.03.12
10:42
(19) создать когда дерево уже заполнено?
22 shlyahtich
 
25.03.12
10:47
(19) не понял - что создать?
23 shlyahtich
 
25.03.12
10:56
(21)
На форме есть Табличное поле (Элемент формы)с данными  ДеревоЗаймовПолученных (реквизит формы такой появляется от Табличного поля) и типом ДеревоЗначений


Процедура КоманднаяПанель2ВыгрузитьТаблицуЗначенийВДеревоЗначений(Кнопка)
   ДеревоЗаймовПолученных.Строки.Очистить();
   ДеревоЗаймовПолученных=ВыгрузитьТаблицуЗначенийВДеревоЗначенийЗапросом(ЭтотОбъект,)
КонецПроцедуры


//выгружает данные из таблицы значений в дерево значений
//
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначенийЗапросом(ЭтотОбъект,Дерево=Неопределено) Экспорт
   Если Дерево = Неопределено Тогда
       Дерево = Новый ДеревоЗначений;
       л_ТипДата = Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.Дата));
       л_ТипСумма = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15,2));
   //
       Дерево.Колонки.Добавить("Описание",Новый ОписаниеТипов("Строка"),"Объект",40);
       Дерево.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"),"Контрагент",20);
       Дерево.Колонки.Добавить("ДоговорКонтрагента",Новый ОписаниеТипов("СправочникСсылка.ДоговорыКонтрагентов"),"Договор",20);
       Дерево.Колонки.Добавить("ДатаПринятияКУчету",л_ТипДата,"Принято к учету",10);
       Дерево.Колонки.Добавить("Валюта",Новый ОписаниеТипов("СправочникСсылка.Валюты"),"Валюта",5);
       Дерево.Колонки.Добавить("СчетУчета",Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"),"Счет движения",7);
       Дерево.Колонки.Добавить("Остаток",л_ТипСумма,"Остаток",15);
       Дерево.Колонки.Добавить("ДатаПоследнейОперации",л_ТипДата,"Последняя операция",10);
       Дерево.Колонки.Добавить("ТипЗайма",Новый ОписаниеТипов("Строка"),"Тип займа",10);
       Дерево.Колонки.Добавить("СчетУчетаЗайма",Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"),"Счет учета займа в договоре",7);
       Дерево.Колонки.Добавить("СчетУчетаПроцентов",Новый ОписаниеТипов("ПланСчетовСсылка.Хозрасчетный"),"Счет учета %",7);
       Дерево.Колонки.Добавить("ПроцентГодовой",Новый ОписаниеТипов("Число"),"% годовой",5);
       Дерево.Колонки.Добавить("Процент",Новый ОписаниеТипов("Число"),"%",5);
       Дерево.Колонки.Добавить("ПредставлениеПроцента",Новый ОписаниеТипов("Строка"),"Представление %",6);
       Дерево.Колонки.Добавить("НачалоПериода",л_ТипДата,"Начало периода",10);
       Дерево.Колонки.Добавить("КонецПериода",л_ТипДата,"Конец периода",10);
       Дерево.Колонки.Добавить("КоличествоДней",Новый ОписаниеТипов("Число"),"Дней",5);
       Дерево.Колонки.Добавить("СуммаПроцентов",л_ТипСумма,"Сумма %",15);
       Дерево.Колонки.Добавить("ПроцентЦБРФ",Новый ОписаниеТипов("Число"),"%ЦБРФ",5);
       Дерево.Колонки.Добавить("Коэффициент",Новый ОписаниеТипов("Число"),"К. нормирования ",5);
       Дерево.Колонки.Добавить("СуммаПроцентовПринмаемая",л_ТипСумма,"Сумма % прин.",15);
       Дерево.Колонки.Добавить("СуммаПроцентовНеПринмаемая",л_ТипСумма,"Сумма % не прин.",15);
       
   КонецЕсли;
   ЗапросТЗ=Новый Запрос;
   ЗапросТЗ.Текст ="ВЫБРАТЬ
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Описание КАК Описание,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Контрагент КАК Контрагент,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ДоговорКонтрагента КАК ДоговорКонтрагента,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ДатаПринятияКУчету,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Валюта КАК Валюта,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СчетУчета КАК СчетУчета,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Остаток,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ДатаПоследнейОперации,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ТипЗайма,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СчетУчетаЗайма,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СчетУчетаПроцентов,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ПроцентГодовой,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Процент,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ПредставлениеПроцента,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.НачалоПериода,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.КонецПериода,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.КоличествоДней,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СуммаПроцентов,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.ПроцентЦБРФ,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Коэффициент,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СуммаПроцентовПринмаемая,
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.СуммаПроцентовНеПринмаемая
                   |ИЗ
                   |    Документ.НачислениеПроцентовПоКредитамИЗаймам.ЗаймыПолученные КАК НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные
                   |ГДЕ
                   |    НачислениеПроцентовПоКредитамИЗаймамЗаймыПолученные.Ссылка = &Документ
                   |ИТОГИ ПО
                   |    Валюта,
                   |    СчетУчета,
                   |    Контрагент,
                   |    ДоговорКонтрагента,
                   |    Описание";
   ЗапросТЗ.УстановитьПараметр("Документ",ЭтотОбъект.Ссылка);
   
   л_РезультатЗапроса = ЗапросТЗ.Выполнить();
   

   ВыборкаВалют = л_РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока ВыборкаВалют.Следующий() Цикл
       л_СтрокаДЗВалюта = Дерево.Строки.Добавить();
       л_СтрокаДЗВалюта.Валюта = ВыборкаВалют.Валюта;
       л_СтрокаДЗВалюта.Описание = ВыборкаВалют.Описание;
       ВыборкаСчетов = ВыборкаВалют.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       Пока ВыборкаСчетов.Следующий() Цикл
           л_СтрокаДЗСчет = л_СтрокаДЗВалюта.Строки.Добавить();
           л_СтрокаДЗСчет.Валюта = л_СтрокаДЗВалюта.Валюта;
           л_СтрокаДЗСчет.СчетУчета = ВыборкаСчетов.СчетУчета;
           ВыборкаКонтрагентов = ВыборкаСчетов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           Пока ВыборкаКонтрагентов.Следующий() Цикл
               л_СтрокаДЗКонтрагент = л_СтрокаДЗСчет.Строки.Добавить();
               л_СтрокаДЗКонтрагент.Валюта = л_СтрокаДЗВалюта.Валюта;
               л_СтрокаДЗКонтрагент.СчетУчета = л_СтрокаДЗСчет.СчетУчета;
               л_СтрокаДЗКонтрагент.Контрагент = ВыборкаКонтрагентов.Контрагент;
               ВыборкаДоговоров = ВыборкаКонтрагентов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               Пока ВыборкаДоговоров.Следующий() Цикл
                   л_СтрокаДЗДоговор = л_СтрокаДЗКонтрагент.Строки.Добавить();
                   л_СтрокаДЗДоговор.Валюта = л_СтрокаДЗВалюта.Валюта;
               КонецЦикла;    
           КонецЦикла;    
       КонецЦикла;    
   КонецЦикла;    
   Возврат Дерево;
       
КонецФункции //ВыгрузитьТаблицуЗначенийВДеревоЗначений()



Процедура КоманднаяПанель2ВыгрузитьТаблицуЗначенийВ
24 Web00001
 
25.03.12
11:05
ДеревоИзФункции=ВыгрузитьТаблицуЗначенийВДеревоЗначенийЗапросом(ЭтотОбъект,)
ЭлементыФормы.ДеревоЗаймовПолученных.Значение = ДеревоИзФункции;
ЭлементыФормы.ДеревоЗаймовПолученных.СоздатьКолонки();

Пишу по памяти куда применять СоздатьКолонки() точно не помню, но как бы просто присвоить ТП на форме другое ТП вроде как совсем никак
25 Шапокляк
 
25.03.12
11:09
(15) Вот если просто табличное поле с типом Дерево, после этого (24), тогда надо СоздатьКолонки(). А если он уже в табличном поле колонки вручную создал, зачем их еще раз создавать-то?
26 shlyahtich
 
25.03.12
12:04
(24) (25)

надо было сделать это однако - недоглядел
ЭлементыФормы.ДеревоЗаймовПолученных.СоздатьКолонки();
хотя я перед этим в процедуре расчета создаю их, заполняю, но
когда потом сохраняю в табчасти данные и из них вытаксиваю
запросом в то же дерево, однако я же не расчитываю их и забыл что колонки то опять создать надо

спасибо. нашлось
27 shlyahtich
 
25.03.12
12:11
Рекомендую для работы с деревом процедуры эти


// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ДЕРЕВОМ ЗНАЧЕНИЙ

// Функция формирует значение нового ключа строки табличной части.
//
// Параметры:
// Дерево - дерево значений
//
Функция ПолучитьНовыйКлючСтрокиДерева(Дерево, СписокКлючей = Неопределено) Экспорт

   Если СписокКлючей = Неопределено Тогда
       СписокКлючей = Новый СписокЗначений;
       СписокКлючей.Добавить(0);
   КонецЕсли;
   Для Каждого СтрокаДерева Из Дерево.Строки Цикл
       СписокКлючей.Добавить(СтрокаДерева.КлючСтроки);
       ПолучитьНовыйКлючСтрокиДерева(СтрокаДерева, СписокКлючей);
       СписокКлючей.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
       МаксКлюч = СписокКлючей[0].Значение + 1;
   КонецЦикла;
   Возврат МаксКлюч;

КонецФункции // ПолучитьНовыйКлючСтрокиДерева()

// Процедура обновляет ключи связи в дереве значений
//
Процедура ОбновитьКлючиСвязиВДеревеЗначений(Дерево) Экспорт

   Для Каждого СтрокаДерева Из Дерево.Строки Цикл
   
       // ВМЕСТО

       //Попытка
       //    СтрокаДерева.КлючСвязи = СтрокаДерева.Родитель.КлючСтроки;
       //Исключение
       //    СтрокаДерева.КлючСвязи = 0;
       //КонецПопытки;
       
       // НАПИШЕМ

       Если СтрокаДерева.Родитель = Неопределено Тогда
           СтрокаДерева.КлючСвязи = 0;
       Иначе
           СтрокаДерева.КлючСвязи = СтрокаДерева.Родитель.КлючСтроки;
       КонецЕсли;

       // ТОГДА ВСЕ РАБОТАЕТ
       
       ОбновитьКлючиСвязиВДеревеЗначений(СтрокаДерева);
   КонецЦикла;

КонецПроцедуры // ОбновитьКлючиСвязиВДеревеЗначений()  

// Процедура обновляет ключи связи в дереве значений
//
Процедура ОбновитьКлючиСтрокВДеревеЗначений(Дерево, КлючСтроки = 1) Экспорт

   Для Каждого СтрокаДерева Из Дерево.Строки Цикл
       СтрокаДерева.КлючСтроки = КлючСтроки;
       КлючСтроки = КлючСтроки + 1;
       ОбновитьКлючиСтрокВДеревеЗначений(СтрокаДерева, КлючСтроки);
   КонецЦикла;

КонецПроцедуры // ОбновитьКлючиСвязиВДеревеЗначений()

// Процедура выгружает данные из дерева значений в таблицу значений
// данные выгружаются только в таблицу со сходным набором реквизитов
//
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт

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

КонецФункции //ВыгрузитьДеревоЗначенийВТаблицуЗначений()

// Процедура выгружает данные из таблицы значений в дерево значений
// данные выгружаются только в таблицу со сходным набором реквизитов
//
// Параметры:
//
// КлючСтроки - имя колонки ТаблицыЗначений - уникальный идентификатор
// КлючСвязи - имя колонки ТаблицыЗначений - указатель привязки к строке Дерева,
// своего рода указатель на "Родителя"
//
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи") Экспорт

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

КонецФункции //ВыгрузитьТаблицуЗначенийВДеревоЗначений()


// Процедура устанавливает значение во всем дереве значений
//
Процедура УстановитьЗначениеКолонкиДерева(Дерево, Колонка, Значение) Экспорт

   Для каждого СтрокаДерева Из Дерево.Строки Цикл
       СтрокаДерева[Колонка] = Значение;
       УстановитьЗначениеКолонкиДерева(СтрокаДерева, Колонка, Значение);
   КонецЦикла;

КонецПроцедуры //УстановитьЗначениеКолонкиДерева()

// Процедура копирует подчиненные строки дерева значений
//
Процедура СкопироватьПодчиненныеСтроки(СтрокаПриемник, СтрокаИсточник)

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

КонецПроцедуры // СкопироватьПодчиненныеСтроки()

// Процедура переносит выделенные строки дерева значений в указанную ветку
//
Процедура ПеренестиСтрокиДереваЗначений(СтрокаПриемник, ВыделенныеСтроки) Экспорт

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

КонецПроцедуры //ПеренестиСтрокиДереваЗначений()
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.