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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Украшения декора из дерева

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

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

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

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

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

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

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

Источник

8.3 Дерево — Что не так с .Индекс ?

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

В строке первый символ получает индекс 1, последний индекс 2, второй индекс 3, предпоследний индекс 4, третий индекс 5
В строке первый символ получает индекс 1, последний индекс 2, второй индекс 3, предпоследний индекс.

Переместить элемент, имеющий индекс К на место, что имеет индекс М, сдвинув другие элементы
Здравствуйте. Задача. Дано линейный массив X. Переместить элемент, имеющий индекс К на место, что.

Что делать если vb.net выдает ошибку «Индекс за пределами диапазона. Индекс должен быть положительным числом, а его раз»
Выдает ошибку вот такой код, в checklistbox надо поместить все значения из списка list, но при.

Эксперт 1С

НайдСтр = ДеревоХарактеристик.Строки.Найти(Хар.Ссылка, "Ссылка", Истина); Если НайдСтр <> неопределено Тогда Если НайдСтр.Родитель = Неопределено Тогда Инд = ДеревоХарактеристик.Строки.Индекс(НайдСтр); Иначе Инд = НайдСтр.Родитель.Строки.Индекс(НайдСтр); КонецЕсли; КонецЕсли;

Добавлено через 1 минуту
а, нет, не нужна

ЦитатаСообщение от Dethmontt Посмотреть сообщение

НайдСтр = ДеревоХарактеристик.Строки.Найти(Хар.Ссылка, "Ссылка", Истина); Если НайдСтр <> неопределено Тогда Если НайдСтр.Родитель = Неопределено Тогда Инд = ДеревоХарактеристик.Строки.Индекс(НайдСтр); Иначе Инд = НайдСтр.Родитель.Строки.Индекс(НайдСтр); КонецЕсли; КонецЕсли;

Источник

Читайте также:  Оформление входной двери деревом

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

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

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

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

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

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

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

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

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

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

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

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

Источник

1С 8.3 Дерево значений — Программист 1С Минск. Автоматизация бизнеса.

Дерево Значений в 1С 8.3 — это иерархический динамически набор любого типа. По своим функциям и структуре (колонки и строки) очень схожа с Таблицей Значений, но есть виртуальная колонка «Родитель». Дерево значений рекомендуется использовать для работы именно с иерархической информацией . Каждая строка дерева значений имеет свойства «Родитель» и «Строки», а также может иметь любое количество подчиненных строк. Операции с помощью встроенного функционала (сортировка, раскраска строк, поиск, итоги, различные отборы ) могут производится с учетом подчиненных строк / уровней иерархии.

&НаСервере
Процедура ЗаполнениеРеквизитаФормыДеревоЗначений ()

// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );
// ДеревоЗначений = Новый ДеревоЗначений; — если без реквизита

ДЗ_Корень = ДеревоЗначений . Строки . Добавить ();
ДЗ_Корень . Наименование = «Самый верхний уровень» ;

ДЗ_1уровень = ДЗ_Корень . Строки . Добавить ();
ДЗ_1уровень . Наименование = «1-ая папка (группа)» ;

ЭлементДЗ_1 = ДЗ_1уровень . Строки . Добавить ();
ЭлементДЗ_1 . Наименование = «Первый (вложенный) элемент» ;

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

ДЗ_2уровень = ДЗ_Корень . Строки . Добавить ();
ДЗ_2уровень . Наименование = «2-ая папка (группа)» ;

ЭлементДЗ_1 = ДЗ_2уровень . Строки . Добавить ();
ЭлементДЗ_1 . Наименование = «Первый (вложенный) элемент» ;

ЭлементДЗ_2 = ДЗ_2уровень . Строки . Добавить ();
ЭлементДЗ_2 . Наименование = «Второй (вложенный) элемент» ;

// Преобразование ДеревоЗначений в реквизит формы (табличное поле)
ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» );

&НаСервере
Процедура ЗаполнениеРеквизитаФормыДеревоЗначенийИзЗапроса ()

Запрос = Новый Запрос ;
Запрос . Текст = «ВЫБРАТЬ
| Материалы.Ссылка КАК Наименование
| Материалы.Родитель КАК Родитель
|ИЗ
| Справочник.Материалы КАК Материалы
|УПОРЯДОЧИТЬ ПО
| Наименование ИЕРАРХИЯ
|ИТОГИ ПО
| Родитель» ;

//Внимание! Если правильно не указать вид обхода результата выборки по запросу,
//то мы получим обычную таблицу значений
ДеревоЗначений = Запрос . Выполнить (). Выгрузить ( ОбходРезультатаЗапроса . ПоГруппировкамСИерархией );

// Заполнение дерева значений из результата запроса
// колонка «Материалы» – это элемент справочника, колонка «Родитель» – это группа
ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» ); // Преобразование в реквизит формы (табличное поле)

&НаСервере
Процедура ПоискСтрокиВДеревеЗначений () // найдём 1-ю строку со значением «Элемент №1» в дереве значений

// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );

// Поиск строки. (если строка не найдена, вернёт «Неопределено»)
НайденнаяСтрокаДЗ = ДеревоЗначений . Строки . Найти ( «Первый (вложенный) элемент» , «Наименование» , Истина);

// Анализ результата поиска
Если НайденнаяСтрокаДЗ = Неопределено Тогда
Сообщить ( «Строка не найдена» );
Иначе // вренёт первую найденную строку
Сообщить ( «Найдена: » + НайденнаяСтрокаДЗ . Наименование + » (» + НайденнаяСтрокаДЗ . Родитель . Наименование + «)» );
КонецЕсли;

&НаСервере
Процедура ПоискВсехСтрокВДеревеЗначений ()

// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );

// Создаем структуру для поиска (условие)
НаименованиеДляПоиска = «Первый (вложенный) элемент» ;
ПараметрыОтбора = Новый Структура ;
ПараметрыОтбора . Вставить ( «Наименование» , НаименованиеДляПоиска );

// Поиск всех строк содержащих наименование «Первый (вложенный) элемент»
МассивСтрок_ДЗ = ДеревоЗначений . Строки . НайтиСтроки ( ПараметрыОтбора , Истина);

// Проверка найдены ли строки
Если МассивСтрок_ДЗ . Количество () = 0 Тогда
Сообщить ( «Ни одной строкис наименованием » + НаименованиеДляПоиска + » не найдено!» );
КонецЕсли;

// Перебор строк
Для Каждого Строка_ДЗ Из МассивСтрок_ДЗ Цикл

Если Строка_ДЗ . Родитель = Неопределено Тогда
Сообщить ( «Корень дерева значений: » + Строка_ДЗ . Наименование );
Иначе
Сообщить ( Строка_ДЗ . Наименование + » — » + Строка_ДЗ . Родитель . Наименование );
КонецЕсли

&НаСервере
Процедура УдалениеСтрокиИзДереваЗначений ()

// Преобразование реквизита формы в объект прикладного типа ДеревоЗначений
ДеревоЗначений = РеквизитФормыВЗначение ( «ДеревоЗначНаФорме» );
// С помощью данных методов возможно удаление конкретных строк
// Важно! При удалении либо очистки строки — все её подчинённые строки удалятся

// 1.Очистка всех строк
ДеревоЗначений . Строки . Очистить ();

// 2. Удаление по конкретному индексу
ДеревоЗначений . Строки . Удалить ( 0 );

// 3.Или удаление по конкретному наименованию
НайтиСтроку = ДеревоЗначений . Строки . Найти ( » Легированная сталь » , «Наименование» );
Если НЕ НайтиСтроку = Неопределено Тогда
ДеревоЗначений . Строки . Удалить ( НайтиСтроку );
КонецЕсли;

ЗначениеВРеквизитФормы ( ДеревоЗначений , «ДеревоЗначНаФорме» ); // Преобразование в реквизит формы (табличное поле)

Источник

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