Имя: Пароль:
1C
1С v8
построение дерева
0 djekting
 
17.06.13
08:48
Начал разбираться с построением дерева, непонимаю в чем затык, происходит зацикливание и конфа закрывается... может кто подскажит в чем трабла...

&НаКлиенте
Процедура СписокСборокПриАктивизацииСтроки(Элемент)
   ТекСтрока = Элементы.СписокСборок.ТекущаяСтрока;    
   ДеревоВПодбореНаСервере(ТекСтрока);
КонецПроцедуры

&НаСервере
Процедура ДеревоВПодбореНаСервере(Ссылка)
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    СборкаТабличнаяЧасть.Ссылка,
       |    СборкаТабличнаяЧасть.НомерСтроки,
       |    СборкаТабличнаяЧасть.Наименование,
       |    СборкаТабличнаяЧасть.Родитель,
       |    СборкаТабличнаяЧасть.IDСтроки
       |ИЗ
       |    Документ.Сборка.ТабличнаяЧасть КАК СборкаТабличнаяЧасть
       |ГДЕ
       |    СборкаТабличнаяЧасть.Ссылка В(&Ссылка)";
   Запрос.Параметры.Вставить("Ссылка", Ссылка);
   Результат = Запрос.Выполнить();
   ВыборкаДетальныеЗаписи = Результат.Выбрать();
   
   Дерево = ДеревоЗПодбор.ПолучитьЭлементы();
   Дерево.Очистить();
   
   ТаблицаСвязей = Новый ТаблицаЗначений;
   ТаблицаСвязей.Колонки.Добавить("IDСтроки");
   ТаблицаСвязей.Колонки.Добавить("ИдентификаторСтрокиДерева");
   
   Для НомерСт=0 По ВыборкаДетальныеЗаписи.Количество()-1 Цикл
       Ст = ВыборкаДетальныеЗаписи.Получить(НомерСт);
       НайдУзел = ТаблицаСвязей.Найти(Ст.Родитель, "IDСтроки");
       
       Если НайдУзел = Неопределено Тогда
           СтрокаДерева = Дерево.Добавить();
       Иначе
           Родитель = ДеревоЗПодбор.НайтиПоИдентификатору(НайдУзел.ИдентификаторСтрокиДерева);
           ЭлементыРодителя = Родитель.ПолучитьЭлементы();
           СтрокаДерева = ЭлементыРодителя.Добавить();
       Конецесли;
       
       СтрокаДерева.Узел = Ст.Наименование;
       СтрокаДерева.IDСтроки = Ст.IDСтроки;
       
       НоваяСтрокаСвязи = ТаблицаСвязей.Добавить();
       НоваяСтрокаСвязи.IDСтроки = Ст.IDСтроки;
       НоваяСтрокаСвязи.ИдентификаторСтрокиДерева = СтрокаДерева.ПолучитьИдентификатор();
   КонецЦикла;
КонецПроцедуры
1 mikecool
 
17.06.13
08:49
происходит зацикливание и конфа закрывается...- дохера памяти использует и процесс падает
2 Wobland
 
17.06.13
08:50
а мы не хотим итоги заюзать для строительства дерева?
3 vmv
 
17.06.13
08:50
тут проблема

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


дальше сам
4 djekting
 
17.06.13
08:54
падает на этой строке
Ст = ВыборкаДетальныеЗаписи.Получить(НомерСт);
5 djekting
 
17.06.13
08:55
все что ниже вообще закоментил
6 kosts
 
17.06.13
08:58

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

   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    Номенклатура.Ссылка КАК Ссылка,
...
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    Ссылка ИЕРАРХИЯ
                  |АВТОУПОРЯДОЧИВАНИЕ"
   ;
   
   Результат = Запрос.Выполнить();
   
   ТабличноеПоле1.Строки.Очистить();
   ВывестиВДерево(Результат, ТабличноеПоле1.Строки);
   
КонецПроцедуры

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

Переделай на УФ
7 Бледно Золотистый
 
17.06.13
09:00
Зуб даю -1 строку получить пытаешься
8 djekting
 
17.06.13
09:05
(7) НомерСт -- 0
ВыборкаДетальныеЗаписи.Количество()-1 -- 8
щас в отладчике посмотрел


пробовал так
Ст = ВыборкаДетальныеЗаписи.Получить(НомерСт+1);
Ст = ВыборкаДетальныеЗаписи.Получить(НомерСт-1);
безразницы. всеравно вылетает
9 djekting
 
17.06.13
09:09
Ст - индекс не присваивается - в отладчике пишет (Неопределено)
10 kosts
 
17.06.13
09:21
(9) Читай в СП про <Индекс>. По факту получаешь значение реквизита (например Ссылки), а не конкретную строку.
Строки выборки получают через Следующий()

[СП]
ВыборкаИзРезультатаЗапроса (QueryResultSelection)
Получить (Get)
Синтаксис:

Получить(<Индекс>)
Параметры:

<Индекс> (обязательный)

Тип: Число.
Индекс поля выборки.
Возвращаемое значение:

Тип: Произвольный.

Описание:

Получает значение по индексу. Работает аналогично оператору [].

[/СП]
11 ScreamSaw
 
17.06.13
09:29
Если надо обращаться к строкам по индексу, лучше сделать так:


тзДетальныеЗаписи = Запрос.Выполнить().Выгрузить();

Для НомерСт=0 По тзДетальныеЗаписи.Количество() - 1 Цикл
   Ст = тзДетальныеЗаписи[НомерСт];
/////
КонецЦикла;
12 djekting
 
17.06.13
09:55
(10)   kosts спс, затупил с утра
решение

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
           
       НайдУзел = ТаблицаСвязей.Найти(ВыборкаДетальныеЗаписи.Родитель, "IDСтроки");
       

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

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