Имя: Пароль:
1C
1С v8
Изменить ТЗ в Дерево значений
0 bUbA
 
01.07.13
13:44
Есть таблица значений, мне её нужно заменить на дерево значений. Узлы должны создаваться по значениям колонки Код, если длина кода 4 символа - это первый узел, если 6 символов - второй. Как это реализовать можно?
1 ДенисЧ
 
01.07.13
13:46
ЗАпросом, разумеется
2 Поросенок Петр
 
01.07.13
13:46
Что пытался сделать, что не получилось...
3 Maxus43
 
01.07.13
13:48
я за запрос
4 bUbA
 
01.07.13
13:48
(1) эта таблица получилась путём выгрузки из xls, никаких запросов не было...
5 Славен
 
01.07.13
13:49
(4)залей твое тз в запрос и уже оттуда сделай дерево
6 ptiz
 
01.07.13
13:50
Чем простой перебор не устраивает?
7 bUbA
 
01.07.13
13:52
(5) через временные таблицы?
8 Поросенок Петр
 
01.07.13
13:59
(6) +1.

А нащщет адептов запросов, отметившихся в этой ветке, хотелось бы услышать каким образом будет построена произвольная иерархия без использования СКД.
9 Поросенок Петр
 
01.07.13
14:01
Плюс, наверняка, отношение элементов к узлам явно не задано в ТЗ, а следует из текущего порядка строк.
10 Professor83
 
01.07.13
14:09
(9)
Выбрать
   Выбор когда Код ПОДОБНО "____" тогда //4 символа
   1
   Когда Код Подобно "______" тогда //6 символов
   2
   Когда код подобно "________" тогда //8 символов
   3
   Конец КАК Уровень    
из &МояТаблица

Как-то так наверное? :)
11 Nexux
 
01.07.13
14:10
скд
12 hhhh
 
01.07.13
14:14
(8) ИТОГИ в запросе вроде без использования СКД делают дерево
13 pessok
 
01.07.13
14:16
в упыпырище есть метод, познает рекурсию, чтобы познать рекурсию. а вообще, да, запросом с итогами
14 pessok
 
01.07.13
14:16
(8) идет курить матчасть, да
15 AaNnDdRrEeYy
 
01.07.13
14:17
и еще
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
вот тогда точно дерево получишь.
16 Поросенок Петр
 
01.07.13
14:18
(12) ИТОГИ добавляют новые строки, сортировка по иерархии требует иерархический объект (справочник, например)...
Что из этого может помочь?
17 Поросенок Петр
 
01.07.13
14:21
(14) Если за матчасть считаешь своё поверхностное знание работы запросов, то да, таких у меня нет. И не нужно.
18 AaNnDdRrEeYy
 
01.07.13
14:22
(16)>>Что из этого может помочь?
матчасть поможет
19 Поросенок Петр
 
01.07.13
14:23
(18) Присоединяюсь к ТС, жду гени(т)ального решения на запросах.
20 AaNnDdRrEeYy
 
01.07.13
14:25
пример таблицы в студию.
21 pessok
 
01.07.13
14:29
ВЫБРАТЬ Ном, ВЫБОР КОГДА Код > ПОДСТРОКА(Код, 1, 4) ТОГДА 1 ИНАЧЕ 2 КАК Уровень Из &Таблица КАК Таблица
;
ВЫБРАТЬ * ИЗ Таблица ИТОГИ ПО Уровень
22 pessok
 
01.07.13
14:29
">" заменить на "="
23 pessok
 
01.07.13
14:30
ну и поместить там не забыть, есессна
24 bUbA
 
01.07.13
14:31
Если ЛистЭксель = Неопределено Тогда
       ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
   КонецЕсли;
   
   Если ВсегоСтрок = 0 Тогда
       ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
   КонецЕсли;
   
   //Если ВсегоКолонок = 0 Тогда
   //    ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
   //КонецЕсли;
   
   Если ИмпортируемыеКоды = Неопределено Тогда
       ИмпортируемыеКоды =  Новый ТаблицаЗначений;
       Для Счетчик = 1 По ВсегоКолонок Цикл
           ИмпортируемыеКоды.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
       КонецЦикла;
   КонецЕсли;
   
   Счетчик1 = 0;
   Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
       Попытка
           Код                     = ЛистЭксель.Cells(Счетчик, 1).Value;
           Код                         = СтрЗаменить(Код, Символы.НПП, "");
           Если СокрЛП(Код) = "" Тогда
               Продолжить;
           КонецЕсли;    
           Счетчик1 = Счетчик1 + 1;
           НоваяСтрока = ИмпортируемыеКоды.Добавить();
           НоваяСтрока.Номер        = Счетчик1;
           НоваяСтрока.Код             = Код;
           НоваяСтрока.Наименование = ЛистЭксель.Cells(Счетчик, 2).Value;
           НоваяСтрока.Ставка       = ЛистЭксель.Cells(Счетчик, 3).Value;
       Исключение
           Сообщить("Ошибка чтения строки файла Microsoft Excel." + Счетчик + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
       КонецПопытки;
       Состояние("Обработка файла Microsoft Excel : "
       + "строка " + Счетчик + " из " + ВсегоСтрок);
   КонецЦикла;
     
   
   ЛистЭксель = Неопределено;
   
   Возврат ИмпортируемыеКоды;
25 pessok
 
01.07.13
14:31
хотя не, чепуху написал :) пойду обедать
26 pessok
 
01.07.13
14:32
(24) эммм. а почему нельзя СРАЗУ делать ДЗ в твоем случае?
27 bUbA
 
01.07.13
14:41
(26) потому что в документе экселя всё построчно идёт, а в 1с мне нужно сгруппировать инфу и запихнуть в справочник
28 pessok
 
01.07.13
14:44
НоваяСтрока = ИмпортируемыеКоды.Добавить();
           НоваяСтрока.Номер        = Счетчик1;
           НоваяСтрока.Код             = Код;
           НоваяСтрока.Наименование = ЛистЭксель.Cells(Счетчик, 2).Value;
           НоваяСтрока.Ставка       = ЛистЭксель.Cells(Счетчик, 3).Value;


ИмпортируемыеКоды сделай ДЗ, а не ТЗ, и по своему условию делай
ИмпортируемыеКоды.Строки.Добавить() Иили
ИмпортируемыеКоды.Строки.Строки.Добавить()
29 bUbA
 
01.07.13
14:45
(28) но получается, что это будет обход в цикле, без запроса
30 Trainee
 
01.07.13
14:48
(0) Если док. записываешь, можно и перебором(хотя, там будет поиск в колонке, говорят, это затратно по времени  работает)
Если не записываешь, запросом, тогда ТЗ придется Выгрузить() предварительно.

Только дерево - это скорее красиво, чем хорошо. По итогу у тебя будет 2 таблицы, если в дереве будет какой-нибудь расчет-пересчет, то запаришься, потом править.
31 bUbA
 
01.07.13
14:49
пока у меня что то такое получилось


Для Каждого Строка Из ИмпортируемыеКоды Цикл
       Если СтрДлина(Строка.Код) = 4 Тогда
           СтрокаВерхнегоУровня = ДеревоКодов.Строки.Добавить();
           СтрокаВерхнегоУровня.Код          = Строка.Код;
           СтрокаВерхнегоУровня.Наименование = Строка.Наименование;
           СтрокаВерхнегоУровня.Ставка      = Строка.Ставка;
           СтрокаВерхнегоУровня.Номер          = Строка.Номер;
       КонецЕсли;
       Если СтрДлина(Строка.Код) = 10 Тогда
           СтрокаНижнегоУровня = ДеревоКодов.Строки.Добавить();
           СтрокаНижнегоУровня.Код         = Строка.Код;
           СтрокаНижнегоУровня.Наименование = Строка.Наименование;
           СтрокаНижнегоУровня.Ставка           = Строка.Ставка;
           СтрокаНижнегоУровня.Номер         = Строка.Номер;
       КонецЕсли;
       Если СтрДлина(Строка.Код) = 6 Тогда
           ПодчиненнаяСтрока = ДеревоКодов.Строки.Добавить();
           ПодчиненнаяСтрока.Код           = Строка.Код;
           ПодчиненнаяСтрока.Наименование = Строка.Наименование;
           ПодчиненнаяСтрока.Ставка       = Строка.Ставка;
           ПодчиненнаяСтрока.Номер       = Строка.Номер;
       КонецЕсли;
       //Если СтрДлина(Строка.Код) = 10 Тогда
       //    СтрокаНижнегоУровня = ДеревоКодов.Строки.Добавить();
       //    СтрокаНижнегоУровня = Строка.Код;
       //КонецЕсли;
   КонецЦикла;
32 bUbA
 
01.07.13
14:53
(30) потом всё это будет записываться в справочник, ну и пересчетов там быть не должно
33 zladenuw
 
01.07.13
15:14
(31) прочитай про ЗаполнитьЗначенияСвойств

Если СтрДлина(Строка.Код) = 4 Тогда
 СтрокаВерхнегоУровня = ДеревоКодов.Строки.Добавить();
 ЗаполнитьЗначенияСвойств(СтрокаВерхнегоУровня,Строка);    
КонецЕсли;
34 bUbA
 
01.07.13
15:42
если мне теперь необходимо записать всё это в справочник, лучше использовать метод СоздатьГруппу() или СоздатьЭлемент()?
35 bUbA
 
01.07.13
16:23
ещё вопрос, как можно сравнить шестизначное число с первыми шестью цифрами десятизначного числа? возможно ли такое вообще?
36 bUbA
 
01.07.13
16:38
никто не знает, или так нельзя сравнивать?
Ошибка? Это не ошибка, это системная функция.