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