Имя: Пароль:
1C
1С v8
Перебрать в цикле дерево значений на сервере УФ
,
0 nushenka
 
17.10.13
09:39
Здравствуйте! Возникла проблема, во внешней обработке на форме есть дерево значений. Оно заполнено данными и есть колонка с типом "Булево" для выбора некоторых элементов. Задача записать выбранные элементы дерева в справочник. Не получается перебрать все строки дерева. Попытка:

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

находит элементы верхнего уровня дерева и вне зависимости от того, выбрана эта строка или нет записывает наименования групп в справочник
1 nushenka
 
17.10.13
09:40
строка Сообщить(НоваяСтрока); написана для теста, чтобы не удалять потом ненужные строки из реального справочника
2 Гефест
 
17.10.13
09:48
Зачем ты проверяешь заполненность реквизита, а не его значение? И где перебор вложенных строк?
3 nushenka
 
17.10.13
09:50
(2) Я проверяю стоит ли галочка в строке и если да, тогда мне нужно записать строку в справочник. А строки я и не могу перебрать все. в этом и суть проблемы
4 1dvd
 
17.10.13
09:50
Выбрать - это что, реквизит???
5 1dvd
 
17.10.13
09:51
(4) Если он булево, то:

//Если ЗначениеЗаполнено(СтрКонтрагенты.Выбрать) Тогда
Если СтрКонтрагенты.Выбрать Тогда
6 1dvd
 
17.10.13
09:53
ЗначениеЗаполнено(Истина) = Да
ЗначениеЗаполнено(Ложь) = Да
7 nushenka
 
17.10.13
09:53
(4) Выбрать- это колонка в дереве значений
8 nushenka
 
17.10.13
09:55
главная проблема не в проверке условия, а том, что перебираются только группы в дереве, а подчиненные элементы не видно. нужно, чтобы перебиралось все дерево и уже потом по условию выбранные элементы писались в справочник
9 1dvd
 
17.10.13
09:55
(8) Подчиненные строки находятся в СтрКонтрагенты.Строки
10 Гефест
 
17.10.13
09:56
Есть такое страшное слово - рекурсия
11 ДемонМаксвелла
 
17.10.13
09:57
два способа навскидку.

рекурсия
и перебор по уровням
12 nushenka
 
17.10.13
09:57
(5) Спасибо, условие заработало ) это уже хорошо
13 nushenka
 
17.10.13
10:00
(9)  {Форма.Форма.Форма(77)}: Поле объекта не обнаружено (Строки)
Для каждого Строка из СтрКонтрагенты.Строки цикл
14 nushenka
 
17.10.13
10:00
у меня не доступны стоки и колонки. дерево находится на форме и мне его нужно в процедуре на сервере перебрать
15 nushenka
 
17.10.13
10:01
(11) можете привести пример предложенных способов?
16 nushenka
 
17.10.13
10:01
(10) слово действительно страшное, я с рекурсией не дружу
17 1dvd
 
17.10.13
10:04
а... у тебя УФ.

ПодчСтрКонтрагенты = СтрКонтрагенты.ПолучитьЭлементы();
18 nushenka
 
17.10.13
10:10
(17) СПАСИБО ОГРОМНЕЙШЕЕ!!!
такое простое решение и все получилось ))))
19 nushenka
 
17.10.13
10:11
А теперь еще хочу спросить, как сделать так, чтобы при выборе группы выбирались все элементы группы в дереве?
20 andreymongol82
 
17.10.13
10:13
(19) Делаешь обход по подчиненным уровням и добавляешь их в параметр выбора
21 nushenka
 
17.10.13
10:17
(20) Т.е.
если СтрКонтрагенты.Выбрать Тогда
таб = СтрКонтрагенты.ПолучитьЭлементы();
Для каждого Стр из таб цикл
стр.выбрать = истина;
конецЦикла
КонецЕсли

что-то типа этого?
22 1dvd
 
17.10.13
10:21
(21) да
23 1dvd
 
17.10.13
10:21
(21) сколько там уровней?
24 nushenka
 
17.10.13
10:21
(23) 2. группы и элементы в них
25 nushenka
 
17.10.13
10:23
(21) а это нужно вызывать в событии при изменении? тогда как понять какая именно группа выбрана? можно как то получить текущую строку?
26 1dvd
 
17.10.13
10:23
(24) тогда так и делай. Рекурсия тут нафиг не нужна
27 1dvd
 
17.10.13
10:25
(25) смотри параметры функции (события) Выбор(...)
28 Infsams654
 
17.10.13
10:28
(26) а вдруг группу контрагентов еще разобьют на группы ?
29 nushenka
 
17.10.13
10:29
(28) давайте пока не будем усложнять. пусть так и будет. это для меня учебная задача и пока там столь замутно не требуют. а если потребуют, тогда разберемся и с рекурсией
30 nushenka
 
17.10.13
10:30
(27) Это событие выбора строки?
31 andreymongol82
 
17.10.13
10:32
(30) При двойном щелчке мыши или нажатии Enter
Выбор, Selection, - событие таблицы на форме
32 andreymongol82
 
17.10.13
10:32
(31) Далее "ОбработкаВыбора"
33 nushenka
 
17.10.13
10:33
(31) то же самое хотела написать ) ну так мне не подходит это событие. я же отмечаю галочками в строке, а это видимо событие при изменении
34 1dvd
 
17.10.13
10:36
(33) нет. тебе нужно именно это событие. В ПриИзменении нет ссылки на текущую строку
35 nushenka
 
17.10.13
10:37
&НаКлиенте
Процедура КонтрагентыПриИзменении(Элемент)
    
    ТабГрупп = Контрагенты.ПолучитьЭлементы();
    Для каждого СтрТабГрупп из ТабГрупп Цикл
        Если СтрТабГрупп.Выбрать Тогда
            ТабЭлементы = СтрТабГрупп.ПолучитьЭлементы();
                Для каждого СтрТабЭлементы из ТабЭлементы Цикл
                    СтрТабЭлементы.Выбрать = истина;
                КонецЦикла;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры
36 nushenka
 
17.10.13
10:38
(35) так все получилось. правда это корявый вариант, но все же работает исправно
37 nushenka
 
17.10.13
10:40
Всем спасибо )
38 andreymongol82
 
17.10.13
11:09
(33) Так-то правильнее было бы вызвать форму, у нее установить признак МножественныйВыбор, там выбрать все что нужно (хотя бы и с помощью галочек), затем обработать полученный массив в обработке выбора формы или таблицы, смотря с каким владельцем открывали форму выбора
39 nushenka
 
17.10.13
13:04
Появился еще вопрос в эту же тему. Делаю вот такую процедуру при изменении:

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

КонецПроцедуры

Можно ли как-то проверить строку на изменение:
Если СтрТабГрупп.Изменен = Истина Тогда - так ведь нельзя. А вообще есть такой способ или нет?
40 1dvd
 
17.10.13
13:05
(39) Что значит "Изменен" в данном контексте?
41 nushenka
 
17.10.13
13:09
(40) да ничего. просто от балды написано, чтобы передать смысл того, что я хочу добиться. Эта процедура в общем выделяет все элементы в группе при выделении группы и снимает, если снять галочку с группы. а просто выборочно поставить галочки на элементы не дает. Вот я и хочу вставить проверку на то что изменена группа или просто элемент
42 nushenka
 
17.10.13
13:39
вопрос (39) еще актуален
43 andreymongol82
 
17.10.13
13:39
(41)
Что-то вроде
ТабЭлементы = СтрТабГрупп.ПолучитьЭлементы();
Если ТабЭлементы.Количество() = 0 Тогда //выбран элемент
Иначе //выбрана группа
44 nushenka
 
17.10.13
13:41
(43) а зачем нам количество? оно не будет нулем, если в группе есть хоть один элемент и не важно выбран он или нет
45 nushenka
 
17.10.13
13:46
есть еще варианты решения проблемы?
46 andreymongol82
 
17.10.13
13:48
(44) Я так понял, нужно проверить  - элемент это или группа? разве не так?
47 nushenka
 
17.10.13
13:51
(46) правильно поняли. нужно проверить: если изменили группу, тогда нужно провести действия и над элементами, а если изменили элемент, тогда дополнительных действий не нужно. Может я не правильно поняла Вашу мысль. Как количество элементов в группе проверяет строку на группу или элемент?
48 nushenka
 
17.10.13
13:59
andreymongol82 ваша версия не работает, т.к.
ТабЭлементы = СтрТабГрупп.ПолучитьЭлементы();
получает просто элементы в группе, а они там есть всегда и по-этому количество никогда не равно 0
49 nushenka
 
17.10.13
14:00
ладно, рабочий день закончен. зайду сюда завтра. буду рада новым идеям )
AdBlock убивает бесплатный контент. 1Сергей