Имя: Пароль:
1C
1С v8
v8: КД: передача параметров в алгоритм
0 Aleksei_Pro
 
10.08.12
17:20
Создал алгоритм "ОбойтиУровеньДерева", в нем процедуру написал:

Процедура ОбойтиУровеньДерева(Строки)
 Для каждого Строка из Строки Цикл
    //что-то делаем со строкой, например:
    Сообщить(Строка.ИмяСуществующегоВСтрокеРеквизита);  
    ОбойтиУровеньДерева(Строка.Строки);
 КонецЦикла;
КонецПроцедуры

Этот алгоритм запускается из справочника "Контрагенты" в после выгрузке ПКО, есть запрос:

   Дерево = Новый ДеревоЗначений;
   запрос_2 = новый запрос;
   запрос_2.Текст  =
   "ВЫБРАТЬ
        ";
   запрос_2.УстановитьПараметр("Владелец",Источник);
   Дерево = запрос_2.выполнить().Выгрузить();
   Выполнить(ОбойтиУровеньДерева());

Вопрос как передать дерево в алгоритм? через параметр?
1 Aleksei_Pro
 
10.08.12
17:26
(0) не так написал:
   запрос_2.УстановитьПараметр("Владелец",Источник);
   Дерево = запрос_2.выполнить().Выгрузить();
   Выполнить(Алгоритмы.ОбойтиУровеньДерева);
2 Popkorm
 
10.08.12
17:26
(0)ОбойтиУровеньДерева(Дерево);
3 Mort
 
10.08.12
17:28
запрос_2.выполнить().Выгрузить() - это не дерево. Кури параметры функции Выгрузить()
4 Aleksei_Pro
 
10.08.12
17:28
Выполнить(Алгоритмы.ОбойтиУровеньДерева(Дерево.Строки)); // т.е так взлетит?
5 Aleksei_Pro
 
10.08.12
17:28
(3) я знаю "ОбходРезультатаЗапроса.ПоГруппировкамСИерархией"
6 Asmody
 
10.08.12
17:29
в терминах языка 1С это называется "процедура", у вас она объявлена с параметром 'строки', вот и вызывать ее надо с этим параметром
ОбойтиУровеньДерева(Дерево.Строки);
7 Йохохо
 
10.08.12
17:29
(ИсходящиеДанные = "", ВходящиеДанные = "", Источник = "", Приемник = "", ТипПриемника = "", Значение = "", Выражение = "",
           Пусто = "", ВыборкаДанных = "", Объект = "", КоллекцияОбъектов = "", ОбъектКоллекции = "", ИмяПКО = "", ИмяПКОВидСубконто = "",
           НомерПКО = "", НомерПКС = "", Правило = "", КлючВыгружаемыхДанных = "", НеЗапоминатьВыгруженные = "", НеЗамещатьОбъектПриЗагрузке = "",
           ВсеОбъектыВыгружены = "", ТолькоПолучитьУзелСсылки = "", РежимЗаписи = "", РежимПроведения = "", СтандартнаяОбработка = "",
           НеЗамещать = "", НеОчищать = "", УзелСсылки = "", УзелКоллекцииОбъектов = "", УзелОбъектаКоллекции = "", УзелСвойства = "",
           ВидСубконто = "", Субконто = "", Отказ = "")
8 andrewks
 
10.08.12
17:31
ты прямо в алгоритме прописал

Процедура ОбойтиУровеньДерева(Строки)

и у тебя работает?
9 Йохохо
 
10.08.12
17:31
(6) не, в кд ^^, это "параметры" "функции" алгоритм
10 andrewks
 
10.08.12
17:32
чё-то я нихрена не понял, это конвертация, или чё?
11 andrewks
 
10.08.12
17:33
короче, если я правильно понял, и это КД, то да - через параметр
12 Popkorm
 
10.08.12
17:35
(0)вот ты блин........в запросе группировку, делай потом:
ЁкорныйТы = запрос_2.выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЁкорныйТы  и будит тебе ДеревоЗначений;
13 Aleksei_Pro
 
10.08.12
17:36
(11) да это КД, я процедуру прописал в алгоритме, в процедуру мне надо передать "Дерево.Строки", а параметр если - какой тип ему задать?
14 Aleksei_Pro
 
10.08.12
17:36
(12) кури (5) , я знаю
15 andrewks
 
10.08.12
17:38
(13) не надо в алгоритме начинать с  "Процедура бла-бла-бла"

параметры юзай как хочешь, можешь даже не прописывать явно на закладке "Параметры" - это же обычная стркутура, добавь значение перед вызовом алгоритма, а в самом алгоритме извлекай
16 Йохохо
 
10.08.12
17:40
в (7) посте ответ ) первый параметр будет доступен в алгоритме как ИсходящиеДанные
17 andrewks
 
10.08.12
17:41
(16) ну да, можно и через исходящие. я через параметры привык
18 Aleksei_Pro
 
10.08.12
17:43
(16) не вижу (7), можно подробнее запутался уже
19 andrewks
 
10.08.12
17:44
(18) при вызове алгоритма ОбойтиУровеньДерева(ЗдесьТвоёЗначение)

можешь в самом алгоритме обращаться к этому значению как ИсходящиеДанные
20 Aleksei_Pro
 
10.08.12
17:45
(16) Т.е так:
Дерево = Новый ДеревоЗначений;
   запрос_2 = новый запрос;
   запрос_2.Текст  =
   "ВЫБРАТЬ
        ";
   запрос_2.УстановитьПараметр("Владелец",Источник);
   Дерево = запрос_2.выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
      Дерево = запрос_2.выполнить().Выгрузить();
   Выполнить(Алгоритмы.ОбойтиУровеньДерева(Дерево.Строки));

И уже алгоритм:
Процедура ОбойтиУровеньДерева(Строки)
 Для каждого Строка из Строки Цикл
    //что-то делаем со строкой, например:

    Сообщить(Строка.ИмяСуществующегоВСтрокеРеквизита);  
    ОбойтиУровеньДерева(Строка.Строки);
 КонецЦикла;
КонецПроцедуры
21 andrewks
 
10.08.12
17:46
блеать, опять процедура...


выкини процедуру!
22 Aleksei_Pro
 
10.08.12
17:47
ок понял
23 Aleksei_Pro
 
10.08.12
17:48
(21) тогда не понял как цикл строить, ведь передаю "Дерево.Строки"
24 andrewks
 
10.08.12
17:49
если в параметрах -
Строки=Параметры["НазваниеТвоегоПараметра"]
Для каждого Строка из Строки Цикл

если через исходящие - то просто

Для каждого Строка из ИсходящиеДанные Цикл
25 Aleksei_Pro
 
10.08.12
17:55
пишет метод объекта не обнаружен "ОбойтиУровеньДерева":
   запрос_2.УстановитьПараметр("Владелец",Источник);
   Дерево = запрос_2.выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   Выполнить(Алгоритмы.ОбойтиУровеньДерева(Дерево.Строки));
26 acsent
 
10.08.12
17:57
алгоритм без параметра, а вызывать

Строки = запрос_2.выполнить().Выгрузить().Строки;
Выполнить(Алгоритмы.ОбойтиУровеньДерева);
----
 Для каждого Строка из Строки Цикл
    //что-то делаем со строкой, например:

    Сообщить(Строка.ИмяСуществующегоВСтрокеРеквизита);  
    Строки = Строка.Строки;
    Выполнить(Алгоритмы.ОбойтиУровеньДерева);
 КонецЦикла
27 Infsams654
 
10.08.12
17:59
(25) Выполнить(<Строка>)
29 andrewks
 
10.08.12
18:01
(25) в каких академиях учат этой хрени?
Выполнить(Алгоритмы.ОбойтиУровеньДерева(Дерево.Строки));

алгоритм вызывает так:
ОбойтиУровеньДерева();
(если без исходящих)
30 Bugmenot
 
10.08.12
18:10
(0)
//Допустим это не управляемые формы, а обычные
//Где находится процедура? В общем модуле? Допустим в общем модуле: Общий_модуль
Процедура ОбойтиУровеньДерева(Строки)
 Для каждого Строка из Строки Цикл
    //что-то делаем со строкой, например:

    Сообщить(Строка.ИмяСуществующегоВСтрокеРеквизита);  
    ОбойтиУровеньДерева(Строка.Строки);
 КонецЦикла;
КонецПроцедуры

//Допустим этот код в МОДУЛЕ ОБЪЕКТА справочника находится:
   Дерево = Новый ДеревоЗначений;
   запрос_2 = новый запрос;
   запрос_2.Текст  =
   "ВЫБРАТЬ
        ";
   запрос_2.УстановитьПараметр("Владелец",Источник);
   Дерево = запрос_2.выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

//Терь вызываем твою процедуру:
Общий_модуль.ОбойтиУровеньДерева(Дерево.Строки);

//Типа всё.
31 Bugmenot
 
10.08.12
18:16
Тоже, если алгоритм находится не в общем модуле, а прям за запросом в модуле объекта(или формы) справочника:

//Допустим этот код в МОДУЛЕ ОБЪЕКТА справочника находится:

Процедура ОбойтиУровеньДерева(Строки)
 Для каждого Строка из Строки Цикл
    //что-то делаем со строкой, например:


    Сообщить(Строка.ИмяСуществующегоВСтрокеРеквизита);  
    ОбойтиУровеньДерева(Строка.Строки);
 КонецЦикла;
КонецПроцедуры

Процедура ПроцедураВызывающаяЗапрос()
//... ля ля ля какие-то действия

   Дерево = Новый ДеревоЗначений;
   запрос_2 = новый запрос;
   запрос_2.Текст  =
   "ВЫБРАТЬ
        ";
   запрос_2.УстановитьПараметр("Владелец",Источник);
   Дерево = запрос_2.выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

//Терь вызываем твою процедуру:

ОбойтиУровеньДерева(Дерево.Строки);

//....

КонецПроцедуры //ПроцедураВызывающаяЗапрос()
//Типа всё.
32 Йохохо
 
10.08.12
18:17
(31) ты всё еще не угадал
33 Bugmenot
 
10.08.12
18:21
(32)
Поди угадай. Хм... прочитал буквы КД :) Согласен. Не угадал.
Программист всегда исправляет последнюю ошибку.