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

Индексы в дереве значений 8.2

Товарищи. Нету предлела моему возмущению относительно кривизны моих рук, по сему к вам обращаюсь за помощью и сочувствием.

Происходит все в управляемом приложении.

Есть у меня форма, у формы есть реквизит типа Дерево.
Заполняю я его, нажав нужную кнопку и нарадоваться не могу. Все замечательно.
Но, если я понажимаю нужную кнопку несколько раз, индексы у моего дерева не обновятся. Дерево очищаю и всячески обновляю, но индексы ни в какую. Копятся, заразы.
То есть если у меня в дереве всего одна строка, то после трех нажатий у этой строки будет индекс 3.
Как можно догадаться, это жутко бесит, хочется взять и настучать.

Многоуважаемые. Поделитесь пожалуйста знаниями, что можно сделать в этом случае?

Хм. Дело в том, что я балуюсь с перетаскиванием. А в соответствующих процедурах/событиях есть параметр «Строка», — индекс строки, над которой повис мой перетаскиваемый объект. И держа курсор над первой строкой, я получаю не нулевой индекс, а полную лажу. Как по другом идентифицировать строку-приёмник, я не знаю.

Индекс и идентификатор строки — абсолютно не одно и тоже. Правильный ответ в (1). Ничего обнулять не надо 🙂

Конечно прочитал. Там написано:Но, как видимо, то, что я про перетаскивание написал, никого не волнует.
Если кто знает, то все эти события с перетаскиванием возвращают мне исключительно индекс строки, над которой «висит» объект, а не саму строку.
Поэтому совет про метод ПолучитьИдентификатор мне бесполезен. Либо я страшно туплю.

И я готов не обнулять индексы. Мне на них наплевать.
Мне главное получить нужную строку, над которой висит объект. Может благодарная публика все-таки подскажет решение, как в перетаскивании получить строку-приемник не по кривому индексу?

(6) «Прочитал про ПолучитьИдентификатор» это конечно много, но ещё стоит потрудится и почитать про НайтиПоИдентификатору.

Хорошо. Я прочитал и про НайтиПоИдентификатору.
Подскажите пожалуйста, как мне этими методами воспользоваться? А то у меня мозг рака, видимо.

(9) В том порядке, в котором читал, в том и юзай. Получаешь идентификатор по индексу, по идентификатору ищешь ДанныеФормыЭлементКоллекции — которое то самое, строка дерева.

«Получаешь идентификатор по индексу» — как это? Правильно ли я понимаю, что этот метод применим к конкретной строке?

Как же мне получить строку, если у меня индекс смещается, и любые попытки по кривому индексу получить эту треклятую строку заканчиваются епическим провалом?

Конечно будут:
Пить и курить вредно.

А по сабжу уже все разжевали.

Да что разжевали? Посоветовали неприменимые в моей ситуации методы? Очень полезно.
Ведь так и не присоветовали чего-то стоящего. И, видимо, теперь будет обыкновенное отмалчивание или банальное игнорирование.

Читайте также:  Сколько градусов мороза выдерживает мандариновое дерево

Про 8.2, наверное, мало кто знает. А если знает, то общие случаи.
У меня вопрос v8: СКД 8.2: программный вывод в дерево значений на форме так и висит без ответа.

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

По ходу я совсем ничего не понимаю. Даже индексы обыкновенного списка значений после каждого обновления списка не обнуляются, а накапливаются. И, чтобы всё работало корректно, надо обработку каждый раз открывать по-новой.

(16) — не кипятись, объясни пожалуйста, как мне по числу получить идентификатор?
Вот у меня есть на форме дерево, состоящее, включая подчинение, всего 10 строк. Я беру одну строку и пытаюсь перетащить в другую строку. Когда я отпускаю объект, у меня срабатывает процедура «Перетаскивание». В ней параметр «Строка» показывает 56.
Что мне можно сделать с этой цифрой?

А. Многоуважаемый Морт. Видимо, мы друг друга никак не хотели понимать.
Но, оказывается, вот этот вот параметр «строка» и есть идентификатор.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Дерево значений ; Как по номеру строки получить строку

Господа.
Имеется управляемая форма.
На форме дерево значений.

Использую обработчик события Выбор()
ТаблицаДереваВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Второй параметр возвращает номер выбранной строки.
Теперь надо по этому номеру получить саму строку — ветвь дерева в которую ткнул пользователь.

Если сделать так
ТаблицаДерева.Строки[ВыбраннаяСтрока]
то получим строку нулевого уровня дерева, что не совпадает с тем куда он ткнул.

Вопрос : Как все таки получить строку выбранную пользователем.
Прошу подсказать

(0) ВыбраннаяСтрока это всего лишь уровень вложенности в данном обработчике. Можно получить строчку ДЗ.НайтиПоИдентификатору(ВыбраннаяСтрока)

(0) если нужно получить именно значение колонки, куда щелкнул юзвер, то можно из Поле.Имя вычленить имя колонки нужной и через [] использовать. Может как то проще можно.

Если активирован множественный выбор, тогда да — массив идентификаторов выбранных строк обрабатывать.

Ключ к пониманию — что это не номер строки, а именно идентификатор. И нельзя его использовать как номер. Многие путают, потому что в обычной таблице после начального заполнения идентификаторы могут совпадать с номерами. И тогда это вообще плавающую ошибку дает. Хорошо что в дереве сразу на мине подорвало.

(11) Мне уже ничего не поможет.
Но для события выбора не надо анализировать выбранные строки. Вторым параметром сразу их массив прилетит.
А по ссылке не понял нафига ты так делал:

СтрокаКоллекции = Объект.СоставЗаказа.НайтиПоИдентификатору(Идентификатор); ИндексСтрокиКоллекции = Объект.СоставЗаказа.Индекс(СтрокаКоллекции); МассивВыделеннойНоменклатуры.Добавить(Объект.СоставЗаказа[ИндексСтрокиКоллекции].Номенклатура);
СтрокаКоллекции = Объект.СоставЗаказа.НайтиПоИдентификатору(Идентификатор); МассивВыделеннойНоменклатуры.Добавить(СтрокаКоллекции.Номенклатура);

(13) В случае дерева на форме «данные строки» — это и будет ссылка на строку дерева (т.е. собственно строка).

Источник

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

Есть программно создаваемое и выводимое на форму дерево значений.
Необходимо понять и получить какую именно строку в текущий момент разворачивает пользователь.
Для этого я вклиниваюсь в процедуру «ПередРазворачиванием».
Там есть такие переменные как: Элемент, Строка, Отказ

Читайте также:  Мод вот сломанные деревья

Всё отлично работает когда пользователь вначале выделяет строку, а затем щёлкает на «+».
Но такое происходит далеко не всегда. А если с самого начала формирования дерева нажать на разворот строки, то в переменной «Элемент» нет ни каких данных.
Вышел из положения так
Процедура СоставПередРазворачиванием(Элемент, Строка, Отказ)

Но вот какая странность происходит. В переменную «Строка» передаётся непонятно откуда взявшееся число. Т.е. в самом дереве фактически есть 7 строк, а при щелчке на разворот по первой строке в переменной «Строка» оказывается значение 14.
Не могу понять почему там 14.

Подскажите как ещё можно получить текущие данные строки дерева значений на разворот которой нажимает пользователь НЕ ВЫДЕЛЯЯ СТРОКУ?

И ещё интереснее.
При каждом нажатии на разворот первой строки номер передаваемой строки увеличивается на 14
Хотя строки нигде не добавляются.

Нашёл где происходит это умножение

ДеревоФормы = РеквизитФормыВЗначение(«Состав»);
****************
ЗначениеВРеквизитФормы(ДеревоФормы, «Состав»);

Не понимаю отчего такое чудо происходит.
Убрал даже обработчики какие либо.
Просто получаю реквизит, и возвращаю обратно. И такое безобразие происходит.

(1) > номер передаваемой строки увеличивается на 14
Потому что это не номер строки, а идентификатор в коллекции. ДанныеФормыДерево или что у тебя там.

Но удвоение строк, после Выгрузить/Загрузить никуда не делось.

(11) а вот это как раз норма. объект на форме не пропадает, но перезаполняется. поэтому идентификаторы бегут вперёд.
перепиши пару РеквизитФормыВЗначение-ЗначениеВРеквизитФормы во что-то другое. напиши рекурсивные функции и процедуры по чтению\заполнению дерева, по поиску идентификатора с ключами, по получению ключей из идентификатора и т.д.

(14) Я так уже и сделал.
В строку всобачил колонку с уникальным идентификатором и по нему ищу. Но блин ощущение что изобретаю велосипед.

(17) это действительно велосипед, который каждый пишет сам.
кстати, никто не видел готовые модули клиентские для работы с деревьями?

Столкнулся с другой бедой.
Теперь строка дерева ни разворачивается.
После того как проходит

Строка ни разворачивается.

(22)
— Получить разворачиваемую пользователем строку на клиенте
— На сервере обработать её, при необходимости добавив в неё подчинённые строки
— Вывести полученную строку развёрнутой, с добавленными подчинёнными строками

Фигня в том что я после того как добавил новые строки и вернул дерево обратно через ЗначениеВРеквизитформы, у строки меняется идентификатор и я не знаю какую мне строку разворачивать.

(22) какая нибудь ВундерВафля, которая собрала в себе все типичные операции с деревом на форме, имеет клиентский и серверный контекст, чтобы кинул элемент на форму, наделал однообразных вызовов «&НаКлиенте процедура ДЗПередРазворачиванием(Элемент, Строка, Отказ) ВундерВафляКлиент.ПередРазворачиванием(Элемент, Строка, Отказ) конецпроцедуры» и готово.

Источник

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