Пробежать элементы элемента дерева

1. LegendarykeF 22.05.18 17:56 Сейчас в теме
народ, подскажите, пожалуйста! как можно пробежать элементы элемента дерева. т.е я получил элемент дерева в переменную текущиеданные, но у этого элемента есть ещё элементы как я понял из окна отладчика. вот как их можно пробежать? в цикле не получается. скрин приложил
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
20. starik-2005 3038 23.05.18 12:56 Сейчас в теме
(1) ну довай попорядку:
Q. Как можно пробежать элементы дерева?
A. Рекурсивно.
Q. Как можно пробежать все колонки элемента?
A. Для каждого Колонка ИЗ РеквизитНаФормеДерево.Колонки Цикл ... ЭлементДерева[Колонка.Имя]; ...
Q. У элемента есть еще элементы?
A. Могут быть.
Q. есть ещё элементы как я понял из окна отладчика.
A. По всей видимости поняли не правильно - это колонки, а не элементы дерева. Чтобы понять из окна отладчика, есть ли у элемента дерева подчиненные элементы, нужно в выражении написать "ТекущийЭлементДерева.ПолучитьЭлементы()". Этих элементов может быть и "0" штук.
Q. в цикле не получается. скрин приложил.
A. На скрине цикла нет, есть колонки, которые можно пробежать так, как указано во втором ответе настоящего сообщения.
Dimeron; LegendarykeF; Ditron; +3 Ответить
21. LegendarykeF 23.05.18 13:05 Сейчас в теме
(20) Видимо, что-то делаю не так, ибо говорит, что нет поля "колонки"
Прикрепленные файлы:
22. spacecraft 23.05.18 13:05 Сейчас в теме
(20)
Для каждого Колонка ИЗ РеквизитНаФормеДерево.Колонки Цикл ... ЭлементДерева[Колонка.Имя]; ...

Учитывая, что у ДанныеФормыДерево нет свойства Колонки...
LegendarykeF; +1 Ответить
23. starik-2005 3038 23.05.18 13:24 Сейчас в теме
(22) ну при таком раскладе придется сначала всю эту колбасу выгрузить в дерево, а там уже получить колонки. Ну я знал, что 1С - та еще система, и УТ 11 (или с чем там аффтор пытается работать) - та еще конфа.
24. LegendarykeF 23.05.18 13:40 Сейчас в теме
(23) не могу понять, как "это" можно выгрузить в дерево, можно пример, пожалуйста? розница это)
25. spacecraft 23.05.18 13:54 Сейчас в теме
(24) в данном случае не надо ничего выгружать в ДеревоЗначений.
Там же, в модуле формы можно посмотреть, как работать с ДанныеФормыЭлементДерева.
Весь смысл сводится к тому, что вся информация о выбранных колонках сохраняется в ТЗ ВыбранныеЦены.
Потом, для заполнения/чтения значений строки ДанныеФормыЭлементДерева, имена колонок получеют из ТЗ.
Что-то в этом роде:
	ВидыЦен = Новый Массив();
	
	Для Каждого ТекСтрока Из ВыбранныеЦены Цикл
		Если ТекСтрока.Выбрана Тогда
			ВидыЦен.Добавить(ТекСтрока);
		КонецЕсли;
	КонецЦикла;

	Для Каждого ВидЦены Из ВидыЦен Цикл
		
		ИмяКолонки         = ВидЦены.ИмяКолонки;
		ИмяКолонкиУпаковка = "Упаковка" + ИмяКолонки;
		
		Если ЗначениеЗаполнено(ТекущаяСтрока[ИмяКолонки]) И РассчитатьЦены Тогда
			ТекущаяСтрока[ИмяКолонки] = 0;
		КонецЕсли;
		
		Если ИспользоватьУпаковкиНоменклатуры И ЗначениеЗаполнено(ТекущаяСтрока[ИмяКолонкиУпаковка]) Тогда
			ТекущаяСтрока[ИмяКолонкиУпаковка] = Справочники.УпаковкиНоменклатуры.ПустаяСсылка();
		КонецЕсли;
		
	КонецЦикла;
Показать
26. starik-2005 3038 23.05.18 15:17 Сейчас в теме
(24) по всей видимости речь идет о документе изменения цен номенклатуры, который через такой вот "интерфейс", явно сделанный через одно место сертифицированными специалистами, работает, то имена колонок как правильно сказали выше приходится этим сертифицированным где-то хранить. В итоге если это какая-то таблица значений (или список значений - с них станется), то можно как-то так:
  Для каждого Колонка ИЗ ТаблицаКолонок Цикл
    Значение = ТекущийДанные[Колонка.ПолеИмениКолонки];
  КонецЦикла;

Но тут выпирает другая проблема - а как мы узнаем, за что эта колонка отвечает? Ведь цель пробежаться по всем колонкам элемента дерева не состоит в самой пробежке, как я понял, а состоит в том, чтобы с этими значениями что-то сделать (например, получить максимальную цену или проверить, на сколько максимальная цена больше минимальной). Фактически, пробежав по списку значений элемента, сама задача так решена и не будет, а появится новая задача - распознать, что за муть перед нами в этой конкретной колонке находится...

Поэтому лучше бы Вам определить сразу, что Вы такое хотите сделать, и, возможно, сделать это можно будет куда более простым способом, нежели пробегание по всем колонкам текущей строки...
27. LegendarykeF 23.05.18 16:19 Сейчас в теме
(26) Стоит, казалось бы простая задача, при изменении цен в одном магазине на какое-то число в документе установка цен, это число должно проставиться во все магазины.
28. starik-2005 3038 23.05.18 20:21 Сейчас в теме
(27) эту задачу можно миллионом разных способов сделать. Можно перед записью документа поправить цены в табличной части с ценами вместо того, чтобы пытаться сделать это в форме. Но, как я понимаю, пользователь должен при изменении цены получить изменение всех остальных цен в таблице - тогда придется реализовать тот самый обход всех свойств, поиск среди них цен, при этом только цен в магазинах, после чего произвести их подмену на введенную цену... Без конфигурации под руками тут подсказать не просто...
29. LegendarykeF 23.05.18 22:32 Сейчас в теме
(28) Ну не миллионом) первый явно не подходит, ибо пользователь не будет видеть всё ли проставилось, а второй не могу реализовать из-за "топовой" структуры данных, которую использовали всеми любимые 1сники.
2. VmvLer 22.05.18 18:07 Сейчас в теме
как правило рекурсивно.

поиск по тегу "Обход дерева 1С8" думаю даст готовые решения
3. Ditron 185 22.05.18 18:16 Сейчас в теме
Процедура ОбходРекурсивно(СтрокаДерева)
   ВложенныеЭлементы = СтрокаДерева.ПолучитьЭлементы();
   Для каждого ВложенныйЭлемент Из ВложенныеЭлементы Цикл
// Здесь обработка строки
      ОбходРекурсивно(ВложенныйЭлемент);
//или здесь...
   КонецЦикла;
КонецПроцедуры
Показать
starik-2005; +1 Ответить
7. LegendarykeF 23.05.18 09:08 Сейчас в теме
(3) Метод "получитьЭлементы()" возвращает пустую таблицу почему-то
17. Ditron 185 23.05.18 12:30 Сейчас в теме
(7) Потому что там нет ничего
4. ye_s 22.05.18 19:37 Сейчас в теме
&НаСервере
Функция ОбходДерева()

	ДеревоОбъект = РеквизитФормыВЗначение("ДеревоРеквизит", Тип("ДеревоЗначений"));
       
	Для Каждого СтрокаДерева Из ДеревоОбъект.Строки Цикл
	    .....
	КонецЦикла;

КонецФункции
Показать
5. starik-2005 3038 22.05.18 22:50 Сейчас в теме
(4) плохой вариант, ибо:
1. Создается объект Дерево в памяти, что совершенно не нужно.
2. Обходится только один верхний уровень. а в дереве количество уровней не ограничено ничем...
Serg243; ye_s; +2 Ответить
6. ditp 91 23.05.18 07:43 Сейчас в теме
Массив = новый Массив;
Для Каждого элем из Дерево.ПолучитьЭлементы() Цикл
	Массив.Добавить(элем);
КонецЦикла;
Пока Массив.Количество() > 0 Цикл
	Для Каждого элем из Массив[0].ПолучитьЭлементы() Цикл
		Массив.Добавить(элем);
	КонецЦикла;
	// тут обработка узла
	Массив.Удалить(0);
КонецЦикла;
Показать
LegendarykeF; ye_s; +2 Ответить
8. LegendarykeF 23.05.18 09:20 Сейчас в теме
(6) метод ПолучитьЭлементы() почему-то возвращает пустую таблицу
9. Aftee 23.05.18 09:23 Сейчас в теме
(8) Так оно у вас заполнено к моменту, когда вы получаете его элементы?
LegendarykeF; +1 Ответить
10. LegendarykeF 23.05.18 09:31 Сейчас в теме
(9) да, заполнено
Прикрепленные файлы:
11. Octopus 337 23.05.18 10:44 Сейчас в теме
(10) Сдается мне, конкретно у этого элемента нет подчиненных. Поэтому ПолучитьЭлементы() возвращает пустую коллекцию
LegendarykeF; +1 Ответить
12. LegendarykeF 23.05.18 10:54 Сейчас в теме
(11) а как тогда можно вытащить поля из текущиеданные?
13. spacecraft 23.05.18 11:41 Сейчас в теме
(12) ДанныеФормыЭлементДерева невозможно обойти. Только получая по именам колонок.
Для обхода нужно перегонять в тип Дерево и уже там обходить.
14. LegendarykeF 23.05.18 11:57 Сейчас в теме
(13) Да, понятно, потому что например так "НашиСтроки[ТекущаяСтрока].ВидЦеныd88dea17d5fd11e58bb20cc47a0e0b1a" я могу вытащить нужное значение, но суть в том что в элементе может быть несколько полей ВидЦены, мне надо их все обойти. Не могу дойти до того, как это сделать...
15. Octopus 337 23.05.18 12:03 Сейчас в теме
(14) Выплевывайте в "ДеревоЗначений", у него есть коллекция колонок
16. spacecraft 23.05.18 12:06 Сейчас в теме
(14) имена колонок смотрите в реквизите формы ВыбранныеЦены. Реквизит этой ТЗ так и называется: "ИмяКолонки"
18. Ditron 185 23.05.18 12:40 Сейчас в теме
У ДанныеФормыЭлементДерева есть метод Свойство(), см. в синтаксис помощнике
19. LegendarykeF 23.05.18 12:56 Сейчас в теме
(18) да, знаю, могу при помощи этого получить поле из элемента, но если нужных полей 10? не понимаю, как этот метод может помочь
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот