1с дерево значений получить идентификатор строки

Поиск в дереве значений на клиенте

Есть обработка, в которой есть дерево с большим количеством строк(несколько десятков тысяч). При выполнении процедуры мне возвращается в качестве параметра массив структур, в которых содержится значение, которое нужно искать в дереве.
Пытался сделать следующим образом: Передавал массив структур на сервер. Там дополнял структуры индексами строк дерева, в которых находилось нужное значение. Но на деле оказалось, что индекс строки дерева не то же самое, что идентификатор строки дерева формы.
Т.е. если я пытаюсь выполнить Элементы.Дерево.ТекущаяСтрока = Индекс то активируется совсем не та строка, что я нашел с индексом в дереве значений.
Просто выполнить всё на сервере не могу, так при этом собьются идентификаторы строк дерева формы, а для дальнейшей работы это критично.
Вопросы: Можно ли как-то организовать поиск на клиенте по дереву значений без полного перебора строк? Как?
Как получить идентификатор строки дерева значений на клиенте?

Код, который использовал на данный момент(неправильно возвращает идентификатор строки):

&НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) . ЗаполнитьИндексыСтрокДерева(Параметр.СозданныеОбъекты); Для каждого стр Из Параметр.СозданныеОбъекты Цикл// Параметр.СозданныеОбъекты - массив структур Элементы.ДеревоНоменклатуры.ТекущаяСтрока = стр.Индекс; ТекущиеДанные = Элементы.ДеревоНоменклатуры.ТекущиеДанные; Элементы.ДеревоНоменклатуры.ТекущиеДанные.Номенклатура = стр.Номенклатура; КонецЦикла; . КонецПроцедуры &НаСервере Процедура ЗаполнитьИндексыСтрокДерева(СозданныеОбъекты) Дерево = РеквизитФормыВЗначение("ДеревоНоменклатуры"); Для каждого стр Из СозданныеОбъекты Цикл строкаДерева = Дерево.Строки.Найти(стр.ИдентификаторНоменклатуры,"ИдентификаторНоменклатурыОблака"); стр.Вставить("Индекс", Дерево.Строки.Индекс(строкаДерева)); КонецЦикла; КонецПроцедуры

Источник

УФ, ДеревоЗначений как на сервере узнать, текущую выбранную на клиенте строку

&НаСервере
ДеревоФормы = РеквизитФормыВЗначение(«РеквизитФормыДеревоЗначений»);
//это Универсальные коллекции значений/Дерево значений
//.
//Изменения
ЗначениеВРеквизитФормы(ДеревоФормы, «РеквизитФормыДеревоЗначений»);

Вопрос — подскажите, пожалуйста, как на сервере получить строку, выбранную на клиенте .

>как на сервере получить строку, выбранную на клиенте

надо передать эту информацию с клинета в серверную процедуру в параметре

Читайте также:  Символ два ствола дерева

(1), (2) Если я на клиенте беру
ИндексСтроки=ТекущиеДанные.ПолучитьИдентификатор();
то получаю идентификатор в наборе строк текущего уровня и в нем не указано в каком узле все это творится. т.е., на сервере по идентификатору я пытаюсь по верхнему уровню набора строк этот идентификатор искать — не проходит.
у меня так:
УзелУровня1_1
|-УзелУровня2_1
|-УзелУровня2_2
|-УзелУровня2_3

Если меняю УзелУровня2_2 — на клиенте Идентификатор=1,
На сервере индекс не входит, т.к. там по дереву на верхнем уровне имеется только идентификатор [0]

(4) Т.е. делать все на клиенте. Но это неудобно — данные формы не позволяют обращаться к табличным частям и реквизитам объектов.

(6) я угуглился. связки между ЭлементФормыДеревоНоменклатура и Универсальные коллекции значений/Дерево значений — тупо нету.
И в описаниях от 1С прямо так и висит предупреждение об ограничениях при работе с Деревом значений.

В толстом клиенте такой ботвы нет — сам делал. Но там нет и разделения на Клиент и Сервер

(11) текст в указанной ссылке нашел в трёх источниках, буква в букву. И он не дает ответа как из формы передать на сервер дерево со строкой. При передаче — ошибка XDTO и описание у 1С о недоработанности работы с Деревьями в УФ.

И преобразованиях. Если дерево вернулось на клиент со структурой, отличающейся от структуры реквизита формы, будет ошибка.

Если бы была таблица, то можно получить идентификатор текущей строки, по нему — саму текущую строку, по ней ее индекс, затем преобразовать таблицу из реквизита формы в значение и по индексу выйти на нужную строку в таблице. В дереве же так нельзя сделать, потому что метод Получить(<Индекс>) работает только в коллекции строк от конкретного уровня от конкретного родителя и такого однозначного индекса, чтобы сразу попасть на нужную строку, в дереве нет. Поэтому возможны два пути, как ты можешь поступить:
1. Либо полностью делаешь добавление нужных строк на клиенте, и для каждой строки делаешь вызов сервера для данных, которых нет на клиенте.
2. Либо строишь полный путь текущей строки из массива индексов дерева и по нему уже ищешь на сервере, либо просто передавай на сервер ключевые поля строки, и по ним ищи в дереве текущую строку, которая оной являлась на форме.

Читайте также:  Порошковый налет на деревьях

Источник

Дерево значений в УФ и текущая строка

На форме есть дерево значений, у которого есть колонка «Документ». Есть реквизит формы, в который я периодически пихаю ссылку на документ. Как мне спозиционировать курсор на нужной мне строке, если я знаю значение колонки «документ», соответственно строку могу вычислить, но как?
Нужно получить идентификатор строки, как мне его получить зная значение одной из колонок?

Я чего то моз сломал.
Элементы.Дерево.ТекущаяСтрока=Ссылка
Элементы.Список.ТекущаяСтрока=Ссылка

Что сделать то нужно? Сформулируй как нибудь по другому.

Элементы.СписокЗаявокНаПродажу.ТекущаяСтрока = «Вот сюда нужно вставить ИдентификаторСтроки»

А вот как мне его получить, на клиенте или на сервере, думаю что на сервере, так как перебрать дерево значений на клиенте не представляется возможным.

Есть СписокЗаявокНаПродажуРеквизит с типом ДанныеФормыДерево, как в нем найти нужную мне строку, каким методом?

работает только с Таблицей формы, источник которой таблица базы данных, причем у Дин. списка установлена основная таблица

Если таблица формы — это произвольное именно дерево значений, а не иерархический список дин. списка с основной таблицей, то на

клиенте — получить идентифиактор строки можно только перебором
сервере — получить идентифиактор строки можно перебором или конвертаций данных формы дерева в значение дерева значений и поиска элемента методами Дз и последующим определением айди строки

(5) «клиенте — получить идентифиактор строки можно только перебором «, что нужно перебирать на клиенте, реквизит формы? Как? Он то заполнен, но там тип ДанныеФормыДерево

двоешники, где вы видели в сущностях

ДанныеФормыДерево — весь образ дерева на УФ
или
ДанныеФормыКоллекцияЭлементовДерева — узел(ветка) дерева на УФ

(12) получаю одну строку дерева, корень..
то есть СписокЗаявокНаПродажуРеквизит.ПолучитьЭлементы() получает только корневую строку с типом ДанныеФормыКоллекцияЭлементовДерева

Читайте также:  Нужно ли формировать дерево вишни

(15) нет мань, ты точно ляпнул. в vmv все правильно сказал, уже разобрался, теперь надо плядское дерево перебирать в рекурсии(((

(18) истерики, упрямство, отсутствие логики, обидчивость — явно не мужкие черты.

Это элементарная дедукция)

(16) дурак чтоли. для активации строки дерево перебирать.
Я собствено говоря и написал — кто мешает найти строку методом, получить ее идентификатор и после этого использовать активацию.
тут влез педик, ты его поддержкал и решил делать рекурсию. пипец.

тырено с БСП специально для девочек

// Получает идентификатор (метод ПолучитьИдентификатор()) строки дерева значений для заданного значения поля строки дерева.
// Используется для позиционирования курсора в иерархических списках.
//
Процедура ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементовДерева, КлючСтроки, ПрекратитьПоиск) Экспорт

Для Каждого СтрокаДерева ИЗ КоллекцияЭлементовДерева Цикл

Если ПрекратитьПоиск Тогда
Возврат;
КонецЕсли;

Если СтрокаДерева[ИмяПоля] = КлючСтроки Тогда

Если КоллекцияЭлементов.Количество() > 0 Тогда

ПолучитьИдентификаторСтрокиДереваПоЗначениюПоля(ИмяПоля, ИдентификаторСтроки, КоллекцияЭлементов, КлючСтроки, ПрекратитьПоиск);

(20) еще раз спрашиваю метод НайтиСтроки() это метод какого объекта? С радостью его использую, если объяснишь как.

(23) дерева. с синтаксис помощником не дружишь?

(24) Где ж мне дерево взять? Есть Реквизит формы с типом ДанныеФормыДерево, как мне из него дерево вытянуть?

Источник

Оцените статью