|
Перебрать в цикле дерево значений на сервере УФ | ☑ | ||
---|---|---|---|---|
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
|
ладно, рабочий день закончен. зайду сюда завтра. буду рада новым идеям )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |