Как установить нужную позицию в дереве на управляемой форме, если известен только критерий поиска этой позиции.

1. Mastershi 22.03.19 11:10 Сейчас в теме
Имеется иерархическая структура организации с подразделениями. Имеем форму и дерево на ней, которое эту структуру представляет. Имеется конкретное Подразделение, переданное в форму в качестве параметра. Требуется спозиционировать дерево на это Подразделение.
1С 8.3. Конфигурация ЗУП 2.5 КОРП. Тонкий клиент, управляемая форма.
Найти нужную строку в представлении дерева на сервере - не проблема.
    
&НаСервере
    тДерево = РеквизитФормыВЗначение("Дерево");
    ПозицияПодразделения=НайтиПодразделениеВДереве(ПодразделениеОрганизации,тДерево.Строки);

и вуаля, строка найдено, но!... получить её идентификатор не представляется возможным в силу отсутствия у СтрокаДереваЗначений соответствующего метода. А без него не получить идентификатор строки и не передать его на клиент, чтобы спозиционировать моё многострадальное дерево.
"Доктор, что я делаю не так?" (с) анек
Как спозиционировать дерево на нужный мне элемент?

Если что, НайтиПодразделениеВДереве - это самописная ркурсивная функция, которая существует на просторах разных форумов и прекрасно ищет то, что надо.
Текст функции
Найденные решения
3. Mastershi 22.03.19 11:49 Сейчас в теме
(2) С НайтиСтроки() для "ДеревоЗначений.Строки" - это замечательно, но результат таки не тот, хотя я это запомню на будущее. Спасибо.
За "адаптацию" двойное спасибо. Решение найдено.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПозицияПодразделения=Неопределено;
    ПриОткрытииНаСервере(ПозицияПодразделения);
    Если ПозицияПодразделения<>Неопределено Тогда
        Элементы.Дерево.ТекущаяСтрока=ПозицияПодразделения;
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриОткрытииНаСервере(ПозицияПодразделения)
    тДерево = РеквизитФормыВЗначение("Дерево");
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    ПодразделенияОрганизаций.Код КАК Код,
                 |    ПодразделенияОрганизаций.Наименование КАК Наименование,
                 |    ПодразделенияОрганизаций.Ссылка КАК Подразделение
                 |ИЗ
                 |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
                 |ГДЕ
                 |    ПодразделенияОрганизаций.Владелец = &Организация
                 |
                 |УПОРЯДОЧИТЬ ПО
                 |    ПодразделенияОрганизаций.Ссылка ИЕРАРХИЯ"
                 ;
    Запрос.УстановитьПараметр("Организация",Организация);             
    тДерево=Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    ЗначениеВРеквизитФормы(тДерево,"Дерево");
    
    ПозицияПодразделения=НайтиПодразделениеВДереве(ПодразделениеОрганизации,Дерево.ПолучитьЭлементы());

КонецПроцедуры

&НаСервере
Функция НайтиПодразделениеВДереве(ПодразделениеП,СтрокиДерева)
    Для каждого Стр из СтрокиДерева Цикл
        Если Стр.Подразделение=ПодразделениеП Тогда        // нашлось подразделение
            Возврат Стр.ПолучитьИдентификатор();
        КонецЕсли;
    КонецЦикла;
    
    // на данном уровне нужного подразделения нет, ищем на нижних
    Для каждого Стр из СтрокиДерева Цикл
        НайденнаяСтрока=НайтиПодразделениеВДереве(ПодразделениеП,Стр.ПолучитьЭлементы());
        Если НайденнаяСтрока<>Неопределено Тогда
            Возврат НайденнаяСтрока.ПолучитьИдентификатор();
        КонецЕсли;
    КонецЦикла;
    
    // не повезло, такого подразделения вообще нет
    Возврат Неопределено;
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Octopus 339 22.03.19 11:16 Сейчас в теме
Для значения типа "ДеревоЗначений" еще прекраснее работает метод НайтиСтроки(). А ваша процедура поиска легко адаптируется к типу "ДанныеФормыДерево", и вернет идентификатор строки, по которому вполне можно позиционироваться
3. Mastershi 22.03.19 11:49 Сейчас в теме
(2) С НайтиСтроки() для "ДеревоЗначений.Строки" - это замечательно, но результат таки не тот, хотя я это запомню на будущее. Спасибо.
За "адаптацию" двойное спасибо. Решение найдено.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПозицияПодразделения=Неопределено;
    ПриОткрытииНаСервере(ПозицияПодразделения);
    Если ПозицияПодразделения<>Неопределено Тогда
        Элементы.Дерево.ТекущаяСтрока=ПозицияПодразделения;
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриОткрытииНаСервере(ПозицияПодразделения)
    тДерево = РеквизитФормыВЗначение("Дерево");
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    ПодразделенияОрганизаций.Код КАК Код,
                 |    ПодразделенияОрганизаций.Наименование КАК Наименование,
                 |    ПодразделенияОрганизаций.Ссылка КАК Подразделение
                 |ИЗ
                 |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
                 |ГДЕ
                 |    ПодразделенияОрганизаций.Владелец = &Организация
                 |
                 |УПОРЯДОЧИТЬ ПО
                 |    ПодразделенияОрганизаций.Ссылка ИЕРАРХИЯ"
                 ;
    Запрос.УстановитьПараметр("Организация",Организация);             
    тДерево=Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    ЗначениеВРеквизитФормы(тДерево,"Дерево");
    
    ПозицияПодразделения=НайтиПодразделениеВДереве(ПодразделениеОрганизации,Дерево.ПолучитьЭлементы());

КонецПроцедуры

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

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