Обход дерева значений на клиенте
Подскажите, пожалуйста, как обойти дерево значений на клиенте.
У меня в серверной процедуре обсчитываются итоги. После этого я используя метод ЗначениеВРеквизитФормы(Дерево, «ДеревоЗначений») заполняю дерево на форме. При этом оно становится свернутым.
А я не хочу, чтоб оно сворачивалось. Я пробывал обойти его на клиенте после это и развернуть, но так не получается(нет подходящих методов)
ЭлементыДерева = Дерево.ПолучитьЭлементы(); Для Каждого ЭлементДерева Из ЭлементыДерева Цикл Элементы.Дерево.Развернуть(ЭлементДерева.ПолучитьИдентификатор(), Истина); КонецЦикла;
Спасибо, но это не то. У меня многоуровненовое дерево.
То есть .получитьэлементы() возвращает только корневую коллекцию строк. А в дочерние я попасть не могу.
ЭлементыДерева = Дерево.ПолучитьЭлементы(); Для Каждого ЭлементДерева Из ЭлементыДерева Цикл Элементы.Дерево.Развернуть(ЭлементДерева.ПолучитьИдентификатор(), Истина); ЭлементыУр2 = ЭлементДерева.ПолучитьЭлементы(); Для Каждого ЭлементУр2 Из ЭлементыУр2 Цикл Элементы.Дерево.Развернуть(ЭлементДерева.ПолучитьИдентификатор(), Истина); ЭлементыУр3 = ЭлементДерева.ПолучитьЭлементы(); . КонецЦикла; КонецЦикла;
Спасибо большое. Получилось, написал в итоге рекурсивные процедуры. Одна запоминает какие развернуты были узлы, потом на сервере процедура пересчитывает итоги, и третья раскрывает узлы, какие были раскрыты до пересчета. Может кому пригодится код:
&НаКлиенте Процедура ДеревоЗначенийСуммаПриИзменении(Элемент) соотвКолонок = Новый Соответствие; соотвКолонок.Вставить("Сумма"); РазвернутыеСтроки = Новый Соответствие(); КоличествоСтрок = 0; ПроверитьСвернутостьДерева(ДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок); ПосчитатьНаСервере(соотвКолонок); УстановитьРазвернутостьДерева(ДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок); КонецПроцедуры &НаКлиенте Процедура ПроверитьСвернутостьДерева(пДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок) ЭлементыДерева = пДеревоЗначений.ПолучитьЭлементы(); КоличествоСтрок = КоличествоСтрок + 1; Если ЭлементыДерева.Количество() = 0 Тогда Возврат КонецЕсли; Для Каждого ЭлементДерева Из ЭлементыДерева Цикл Идентификатор = ЭлементДерева.ПолучитьИдентификатор(); РазвернутыеСтроки.Вставить(Идентификатор, Элементы.ДеревоЗначений.Развернут(Идентификатор)); ПроверитьСвернутостьДерева(ЭлементДерева, РазвернутыеСтроки, КоличествоСтрок); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура УстановитьРазвернутостьДерева(пДеревоЗначений, РазвернутыеСтроки, КоличествоСтрок) ЭлементыДерева = пДеревоЗначений.ПолучитьЭлементы(); Если ЭлементыДерева.Количество() = 0 Тогда Возврат КонецЕсли; Для Каждого ЭлементДерева Из ЭлементыДерева Цикл Идентификатор = ЭлементДерева.ПолучитьИдентификатор(); Если РазвернутыеСтроки.Получить(Идентификатор - КоличествоСтрок + 1) = Истина Тогда Элементы.ДеревоЗначений.Развернуть(Идентификатор); КонецЕсли; УстановитьРазвернутостьДерева(ЭлементДерева, РазвернутыеСтроки, КоличествоСтрок); КонецЦикла; КонецПроцедуры
Однако если вы хотите, что бы состояние развернутости запоминалось до пересчета итогов, и восстанавливалось после, то это уже совсем другая задача, которую можно решить примерно так, как вы написали в (5). Но только не совсем так, потому что так как вы написали, будет работать не всегда. Например, если пользователь будет сначала интерактивно заполнять дерево в хаотичном порядке, т.е. добавлять элементы, то в одну группу то в другую, а потом запустится процедура пересчета итогов, то дерево у вас раскроется не правильно, т.е. не так как было до пересчета. Произойдет это потому, что при хаотичном порядке заполнения дерева, идентификаторы строк будут присвоены в порядке их добавления, а после того, как будет выполнен метод ЗначениеВРеквизитФормы, идентификаторы строк присвоятся заново. И помимо того, что их нумерация увеличится на количество элементов в дереве, она еще будет заново упорядочена. И в этом случае никакое «Идентификатор — КоличествоСтрок + 1», уже не поможет. Т.к. например, строке с идентификатором «3» при количестве строк равным 10, не обязательно будет присвоен идентификатор «12», ей вполне может быть присвоен идентификатор с другим номером, например «15». Можете проверить.
Конечно, если у вас не происходит интерактивной работы пользователя с деревом, к примеру, если оно у вас заполняется программно и всегда по порядку, или изначально заполняется методом ЗначениеВРеквизитФормы, то тогда описанный вами способ будет работать.
(7) VBod, да все верно. Я тоже заметил такую особенность, поэтому и пришлось говнокодить как «Идентификатор — КоличествоСтрок + 1». Но другого способа не нашел.
а что делать в этом случае?
Например, если пользователь будет сначала интерактивно заполнять дерево в хаотичном порядке, т.е. добавлять элементы, то в одну группу то в другую, а потом запустится процедура пересчета итогов, то дерево у вас раскроется не правильно, т.е. не так как было до пересчета
Пользователи захотели сами править дерево 🙂
(9) mr_virtus, придется запоминать все развернутые строки, но только делать это не по идентификатору т.к. он меняется, а по значениям каких-либо ключевых полей (уникальных для каждой строки дерева). Потом выполняем процедуру на сервере, а затем снова разворачиваем строки. Для этого после загрузки дерева обратно на клиента, ищем нужную строку в дереве на сервере, и получаем ее индекс (не идентификатор). Затем по этому индексу, т.к. они одинаковые и на сервере и на клиенте, через метод
ДеревоНаКлиенте.Получить(ИндексСтрокиНаСервере)
получаем строку в дереве на клиенте, и разворачиваем ее. Только не забудьте, что индекс уникален только в пределах одного уровня дерева, поэтому получение строки на клиенте по индексу, нужно производить, находясь на соответствующем уровне дерева.
Источник
Как обойти, перебрать дерево значений?
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 — получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=» D:ВашаБаза1с77″ ; Пользователь= Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Посмотреть все результаты поиска похожих
Еще в этой же категории
Примеры работы с Деревом значений в УП 11
Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 н Дерево значений в таблицу значений или в табличную часть и обратно 9
Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранени Преобразование дерева значений в таблицу значений и обратно 6
Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее Как в дереве значений строку перекинуть в другой родитель? 5
Процедура ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, НовыйРодитель, Уровень = 0) Если Уровень = 0 Тогда НоваяСтрока = НовыйРодитель.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока); ПереместитьСтрокуДерева(Де Как Свернуть, Развернуть узлы Дерева значений на форме? 4
Как программно свернуть/развернуть дерево значений на управляемой форме? Желательно НаКлиенте. КоллекцияЭлементовДерева=ДеревоНоменклатуры.ПолучитьЭлементы(); //Свернуть дерево Для Каждого Строка Из КоллекцияЭлементовДерева Цикл ИдентификаторСт Посмотреть все в категории Работа с Деревом Значений
Источник