Имя: Пароль:
1C
1С v8
Дерево значений верхний узел
0 Vasilisk
 
13.05.14
01:36
Возможно ли реализовать дерево значений с несколькими верхними уровнями/верхними строками/главными узлами). Идея сводиться к тому, что необходимо во внешней обработке производить заполнение таб. частей нескольких документов(дети) и создание новых документов(верхний узел).
1 Tateossian
 
13.05.14
01:38
(0)  Да.
2 Vasilisk
 
13.05.14
01:39
Как произвести программное создание второго верхнего узла?
3 Vasilisk
 
13.05.14
01:40
8.2 управляемые формы. Дерево значений реквизит формы.
4 Vasilisk
 
13.05.14
01:41
Если НЕ Результат = Неопределено Тогда
        Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
            Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.ПолучитьРодителя();
        Иначе
            Родитель=Родитель;    
        КонецЕсли;
        Родитель=Неопределено;
        Элементы.ПереченьРаботУслугДерево.ДобавитьСтроку();
        Элементы.ПереченьРаботУслугДерево.ТекущийРодитель=Родитель;

        
        Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.РаботаУслуга=Результат;
        Элементы.ПереченьРаботУслугДерево.ЗакончитьРедактированиеСтроки(Ложь);
        
            
Иначе    
    Возврат;
КонецЕсли;
5 Vasilisk
 
13.05.14
01:41
Вот что у меня не работает где я туплю по черному, пожалуйста?
6 Vasilisk
 
13.05.14
02:05
Так если да, то каким образом вся инфа в гугле оперирует только с одним верхним узлом.
7 hhhh
 
13.05.14
02:17
что означает магическая фраза   Родитель = Родитель; ???

и загадочное      Родитель=Неопределено;
   ???
8 Vasilisk
 
13.05.14
02:19
Пардон эксперементы)

&НаКлиенте
Процедура СоздатьРаздел(Команда)
    СтруктураПараметров = Новый Структура;    
    Результат = ОткрытьФормуМодально("Справочник.РаботыУслуги.ФормаВыбора", СтруктураПараметров);
    Если НЕ Результат = Неопределено Тогда
        Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
            Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.ПолучитьРодителя();
        Иначе
            Родитель=Неопределено;
        КонецЕсли;
        
        Элементы.ПереченьРаботУслугДерево.ДобавитьСтроку();
        Элементы.ПереченьРаботУслугДерево.ТекущийРодитель=Родитель;
        Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.РаботаУслуга=Результат;
        Элементы.ПереченьРаботУслугДерево.ЗакончитьРедактированиеСтроки(Ложь);    
    Иначе    
        Возврат;
    КонецЕсли;  
КонецПроцедуры
9 Vasilisk
 
13.05.14
02:19
Вот так в оригинале
10 Wobland
 
13.05.14
03:16
два дерева - это уже лес. три дерева - вообще лес
11 rphosts
 
13.05.14
03:49
(0) на клюшках забавные связанные между собой ТЗ реализовывал (сложная структура подчинённости) а тут такие возможности для творчества... в типовом ДЗ 1 элемент верхнего уровня, или смиритесь с необходимостью иметь этот всего 1 элемент на самом верхнем уровне или рисуйте сами
12 Defender aka LINN
 
13.05.14
06:11
(11) "в типовом ДЗ 1 элемент верхнего уровня"
ШТА?!
13 skunk
 
13.05.14
06:15
объясните тупому, что значит "несколькими верхними уровнями/верхними строками/главными узлами"?
14 Defender aka LINN
 
13.05.14
06:16
(13) Строки 1 уровня в дереве, что тут непонятного?
15 Wobland
 
13.05.14
06:17
(13) (14) автор (или 1С?) не знает, что дерево имеет один корень по определению
16 skunk
 
13.05.14
06:18
(14)тогда не понятно какие проблемы с добавлением нескольких строк
17 Defender aka LINN
 
13.05.14
06:19
(15) Ну хоть ты меня не пугай, а?
18 Wobland
 
13.05.14
06:22
(17) шо? я таки заблуждаюсь?
19 Defender aka LINN
 
13.05.14
06:29
(18) Ну, в данном конкретном случае, в 1С - да.
Если рассуждать про сферические деревья в вакууме (или про те, что в саду) - то оно-то может быть, но мы же какбе одинэснеги тут :)
20 skunk
 
13.05.14
06:30
если имелось ввиду вот эти
http://i020.radikal.ru/1405/84/4f3c73e0760e.png

то тупо

ТвоеДерево.Строки.Добавить(); повторять нужное количество раз
21 Wobland
 
13.05.14
06:51
добейте моё гармоничное восприятие вселенной. скажите, что мир  неприятно пахнет, все женщины легки на поведение, а солнце - просто газовый фонарь
22 skunk
 
13.05.14
06:55
солнце - просто газовый фонарь ...
23 rphosts
 
13.05.14
07:10
(21) СП как-бы говорит, что на каждом уровне коллекция... получается, что можно и несколько...
24 rphosts
 
13.05.14
07:11
(21) не весь, только если ты для них сугубо привлекателен, не только газовый фонарь
25 Vasilisk
 
13.05.14
09:34
Между большим количеством слов сути не усмотрел так в итоге, это не выполнимо или как?
26 Wobland
 
13.05.14
09:35
(25) или как
27 Kalambur
 
13.05.14
09:38
Рекурсией
28 Vasilisk
 
13.05.14
09:39
Давайте по существу как добавить строку в дерево на форме без родителя то есть узел верхнего уровня, один узел верхнего уровня в дереве уже имеется.
29 Wobland
 
13.05.14
09:44
(28) перечитай (20) ещё разок
30 Vasilisk
 
13.05.14
09:48
Хорошо, я конечно понимаю, что краткость сестра таланта, но вопрос остается открытым как это реализовать тогда?
31 Wobland
 
13.05.14
09:49
(30) выполнить синтаксически и методологически верный код. чего пристал?
32 Vasilisk
 
13.05.14
09:52
Так в чем ошибка то, родитель(только чтение), текущий родитель устанавливается только на само дерево а не на текущие данные, мне нужно просто добавить еще один корень в дерево ничего того что это делает как надо не увидел, я пол ночи с этой фигней парился.
33 Wobland
 
13.05.14
09:55
возьми и добавь свой корень в строки дерева. это уже получится лес, но всем пофиг
34 Vasilisk
 
13.05.14
09:56
Нет доступа к "Строки" у дереваЗначений формы есть Добавить Строку()
35 Wobland
 
13.05.14
09:57
(34) а на сервере?
36 Vasilisk
 
13.05.14
10:00
А это разве оптимально?
37 Wobland
 
13.05.14
10:00
(36) а кто тебя знает. я вот своё дерево делал из внешнего источника, а форме тупо показывал
38 1dvd
 
13.05.14
10:03
(37) читер
39 skunk
 
13.05.14
11:21
ТвоеДеревоЗначений = ЭлементыФормы.ТвоеДеревоНаФорме.Значение; // вроде как Значение ...
ВерхниеСтроки = ТвоеДеревоЗначений.Строки;
40 Vasilisk
 
13.05.14
13:47
Вопрос закрыт разобрался сам
41 Vasilisk
 
13.05.14
13:47
//Процедура вычисления количества строк для определения ключа
&НаСервере
Функция ПолучитьКоличествоСтрокДерева(Дерево)
    Количество=0;
    Для А = 0 По Дерево.Строки.Количество()-1 Цикл
        Количество=Количество+ПолучитьКоличествоСтрокДерева(Дерево.Строки[А]);
        Количество=Количество+1;
    КонецЦикла;    
    Возврат Количество;
КонецФункции

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

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

//Создадим подраздел(Родителем будт выступать выделенный элемент)
&НаКлиенте
Процедура СоздатьПодраздел(Команда)
    Результат = ОткрытьФормуМодально("Справочник.РаботыУслуги.ФормаВыбора");
    Если НЕ Результат = Неопределено Тогда
        Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
            Родитель=Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.Ключ;
        Иначе
            Родитель=0;
        КонецЕсли;
        СоздатьСтрокуДереваНаСервере(Родитель,Результат);
        Элементы.ПереченьРаботУслугДерево.ЗакончитьРедактированиеСтроки(Ложь);    
    Иначе    
        Возврат;
    КонецЕсли;    
КонецПроцедуры

//В связи с удалением может возникнуть дублирование значний ключей, пересчитываем ключи
&НаСервере
Процедура ПересчитатьКлючиРекурсия(Дерево,Ключ)    
    Для А = 0 По Дерево.Строки.Количество()-1 Цикл
        Если Дерево.Строки[А].Ключ > Ключ Тогда
            Дерево.Строки[А].Ключ=Дерево.Строки[А].Ключ-1;
        КонецЕсли;
        ПересчитатьКлючиРекурсия(Дерево.Строки[А],Ключ);
    КонецЦикла;    
КонецПроцедуры

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

//Перед удалением
&НаКлиенте
Процедура ПереченьРаботУслугДеревоПередУдалением(Элемент, Отказ)
    Отказ=Ложь;
    Если Элементы.ПереченьРаботУслугДерево.ТекущиеДанные<>Неопределено Тогда
        УдалитьСтроку(Элементы.ПереченьРаботУслугДерево.ТекущиеДанные.Ключ);
    Иначе
        Возврат;
    КонецЕсли;
КонецПроцедуры
42 Wobland
 
13.05.14
17:08
(40) сам? да ты крут неимоверно
43 Wobland
 
13.05.14
17:09
и нечего нас благодарить, всё правильно
44 Vasilisk
 
13.05.14
19:06
Wobland спасибо, что на мысль навел, а всем остальным за что? За абстрактные фразы из другой оперы и за рандомные сленговые фразы одноэсников?
45 Kookish
 
13.05.14
19:14
(44) За поддерживающую среду. Например, если сунуть свежий огурец в банку с солеными... ну, ты понял.
46 Wobland
 
13.05.14
19:16
(44) тебе держали ветку на плаву и вели беседы на тему
47 Kookish
 
13.05.14
19:21
(46) А я, что, не так выразился?
48 skunk
 
13.05.14
20:51
все как в танках ... вот и помогай после этого рандомным оленям
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.