Имя: Пароль:
1C
1С v8
работа с тз
0 lamme
 
09.06.16
11:52
Есть ТЗ с колонками
http://clip2net.com/s/3z0Oc9G

нахожусь я на произвольной строке Хомут пластиковый. Уровень 5.
Этот хомут входит в Коробка с крепежом. Уровень 4
в Коробка с крепежом входит в Коробка с фурнитурой. Уровень 3.
3 ур входит во 2 ...
максимальное кол-во уровней 5.

Как программно правильно определить первый уровень ниже текущего ?
Сижу и туплю ..

Для каждого Эл из ТЗ цикл // это перебор каждой строки Без этого перебора обойтись нельзя
Если Эл.Уровень<>1 тогда
ОпределитьВышестоящийУровень(Эл)
Конецесли;
конеццикла;


Функция ОпределитьВышестоящийУровень(ТекСтрокаТЗ)

?

конецфункции
1 lamme
 
09.06.16
11:53
не .. я понимаю, что надо начать перебор строки в обратном порядке , начиная с текущей ...
но туплю как
2 Ёпрст
 
гуру
09.06.16
11:54
Использовать деревоЗначений вестимо
3 lamme
 
09.06.16
11:55
(2)
это в итоге надо получить дерево.
из плоской таблицы значений
4 Ёпрст
 
гуру
09.06.16
11:56
Ну и..в качестве примитива

Для к = 1 По КоличествоУровней Цикл
   ВсСтрокиНужногоУровня = ТЗ.НайтиСтроки(Новый Структура("Уровень",к));
КонецЦикла
5 lamme
 
09.06.16
11:58
(4)
ну нашел я все строки нужного уровня
как определить - что из этого массива строк - нужна та или иная ?
6 Ёпрст
 
гуру
09.06.16
12:04
(5) кроме колонки Уровень, не видно еще какой-либо связи между элементами у тебя. Как оне хоть связаны и что надо найти в итоге ?
7 lamme
 
09.06.16
12:07
только расположением друг после друга.
все.
8 Ёпрст
 
гуру
09.06.16
12:09
(7) Это как ?
На твоей картинке, Вентилятор, к примеру, какую структуру должен иметь ?
9 bootini
 
09.06.16
12:09
ИндексСтроки = ТЗ.Индекс(ТекСтрокаТЗ);
    СтрокаПервогоУровня = Неопределено;
    
    Пока Не ИндексСтроки = 0  Цикл
        ИндексСтроки = ИндексСтроки - 1;
        
        ТекСтрока = ТЗ[ИндексСтроки];
        
        Если ТекСтрока.Уровень = 1 Тогда
            СтрокаПервогоУровня = Неопределено;
            прервать;
        КонецЕсли;
        
    КонецЦикла;     
    
    Возврат СтрокаПервогоУровня;
10 bootini
 
09.06.16
12:10
Т.е. так    

ИндексСтроки = ТЗ.Индекс(ТекСтрокаТЗ);
    СтрокаПервогоУровня = Неопределено;
    
    Пока Не ИндексСтроки = 0  Цикл
        ИндексСтроки = ИндексСтроки - 1;
        
        ТекСтрока = ТЗ[ИндексСтроки];
        
        Если ТекСтрока.Уровень = 1 Тогда
            СтрокаПервогоУровня = ТекСтрока;
            прервать;
        КонецЕсли;
        
    КонецЦикла;     
    
    Возврат СтрокаПервогоУровня;
11 lamme
 
09.06.16
12:10
Вентилятор - Панель верзхняя пластиковая - EF1010T...
12 Ёпрст
 
гуру
09.06.16
12:16
(11)

Функция ОпределитьВышестоящийУровень(ТекСтрокаТЗ)
  
Для к = -ТекСтрокаТЗ.НомерСтроки+1 по 0 Цикл
   Если ТЗ[-к].Уровень = ТекСтрокаТЗ.Уровень-1 Тогда
      Возврат -к; //или Возврат ТЗ[-к]
   КонецЕсли;
   Возврат Неопределенно;//нема уровня
КонецФункции
13 Ёпрст
 
гуру
09.06.16
12:16
ну и усё, собственна
14 Ёпрст
 
гуру
09.06.16
12:17
ну и это, КонецЦикла там перед последним Возврат Воткни
15 lamme
 
09.06.16
12:18
(10)


Для НС=-ТЗ.Индекс(Элементыформы.ТЗ.текущаяСтрока) По 0 Цикл
        Сообщить(ТЗ[-НС].Артикул);
    КонецЦикла;
16 lamme
 
09.06.16
12:19
(10)
(12)
спасибо .. мыслю сегодня медленно ... но хоть в правильном направлении ...
сейчас сделаю боевой код
17 RomanYS
 
09.06.16
12:23
СсылкиНаТекущиеУзлы = Новый Массив(6);
Для каждого Эл из ТЗ цикл
СсылкиНаТекущиеУзлы[Эл.Уровень] = Эл;//кешируем в массив все текущие "узловые строки"
.....
СтрокаПервогоУровня = СсылкиНаТекущиеУзлы[1];
СтрокаПредыдущегоУровня = СсылкиНаТекущиеУзлы[Эл.Уровень -1];



Плюсы такого подхода - всего один цикл
18 Ёпрст
 
гуру
09.06.16
12:28
(17) ну не катит же.
19 Ёпрст
 
гуру
09.06.16
12:29
у тебя для каждого уровня - 1 элемент, а их мноооооогооо должно быть.
Тут тока перебор "вверх", т.е от текущей строки до первой строки ТЗ всегда.
20 RomanYS
 
09.06.16
12:30
(19) в массиве значения для ТЕКУЩЕЙ строки, у неё по одному узлу для каждого вышестоящего уровня
21 RomanYS
 
09.06.16
12:32
+(19) это не отдельный цикл для построения кэша, это единственный цикл в котором идёт обработка
22 Ёпрст
 
гуру
09.06.16
12:37
(20) аа.. красиво.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс