| 
    
        
     
     | 
    
  | 
УФ: Установить текущую строку дерева значений | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Родом из детства    
     23.09.21 
            ✎
    11:38 
 | 
         
        Всем привет! Суть задачи в следующем
 
        Имеется механизм назначения на смену, в определенный цех исполнителей(бригад). Бригада состоит из сотрудников. В течении смены можно менять состав бригады(а не бригаду). Создана форма подбора бригад и сотрудников(типо слева дерево бригад,где на верхем уровне - статус(свободна/занята), а на нижнем - сама бригада, при выборе бригады справа заполняется таблица значений, где перечисляется состав бригады). При открытии в нее передается текущая бригада(справочник.ссылка). Возможно ли, после заполнения дерева бригад установить текущую строку по переданной текущей бригаде? Что дерево бригад, что таблица её состава - реквизиты формы  | 
|||
| 
    1
    
        mikecool    
     23.09.21 
            ✎
    11:49 
 | 
         
        наверное тебе сюда Дерево значений ; Как по номеру строки получить строку     
         | 
|||
| 
    2
    
        Родом из детства    
     23.09.21 
            ✎
    11:54 
 | 
         
        (1) То есть на сервере, после выгрузки результата запроса в дерево,  получить строку по текущей бригаде. А на клиенте уже установить её текущей?     
         | 
|||
| 
    3
    
        fisher    
     23.09.21 
            ✎
    12:03 
 | 
         
        Обходом находишь строку дерева с нужной бригадой и потом
 
        Элемент.ТекущаяСтрока = СтрокаДерева.ПолучитьИдентификатор()  | 
|||
| 
    4
    
        fisher    
     23.09.21 
            ✎
    12:05 
 | 
         
        Элементы.Дерево.ТекущаяСтрока = СтрокаБригады.ПолучитьИдентификатор()     
         | 
|||
| 
    5
    
        Родом из детства    
     23.09.21 
            ✎
    12:21 
 | 
         
        (3) Сделал что-то подобное.
 
        &НаКлиенте Процедура ОбновитьБригады() СтрокаБригады = неопределено; ОбновитьБригадыНаСервере(СтрокаБригады); Элементы.Бригады.ТекущаяСтрока = СтрокаБригады;//Бригады.НайтиПоИдентификатору(СтрокаБригады.ПолучитьИдентификатор()); КонецПроцедуры  | 
|||
| 
    6
    
        Родом из детства    
     23.09.21 
            ✎
    12:23 
 | 
         
        Процедура ОбновитьБригадыНаСервере передает в СтрокаБригады - найденную строку дерева. Только возникает ошибка
 
        "Отсутствует отображение для типа 'СтрокаДереваЗначений'" - похоже, нужно создавать реквизит формы "СтрокаБригады" и передавать это значение через ЗначениеВРеквизитФормы() - но как-то стремно выглядит  | 
|||
| 
    7
    
        Родом из детства    
     23.09.21 
            ✎
    12:31 
 | 
         
        А нет - тип строка дерева значений не может использоваться в данных формы.     
         | 
|||
| 
    8
    
        Родом из детства    
     23.09.21 
            ✎
    12:31 
 | 
         
        получается, что строка дерева значений доступна нам на сервере. А метод, устанавливающий текущую строку - на клиенте...     
         | 
|||
| 
    9
    
        fisher    
     23.09.21 
            ✎
    12:38 
 | 
         
        Если двухуровневое дерево, то можно без рекурсии:
 
        
     | 
|||
| 
    10
    
        fisher    
     23.09.21 
            ✎
    12:39 
 | 
         
        А, черт. Забыл в конце проверку на Неопределено.     
         | 
|||
| 
    11
    
        Родом из детства    
     23.09.21 
            ✎
    12:40 
 | 
         
        (10) А, слушай, да. Про получитьЭлементы я не знал. Спасибо!     
         | 
|||
| 
    12
    
        fisher    
     23.09.21 
            ✎
    12:43 
 | 
         
        (11) На клиенте дерева значений нет. Оно трансформируется в ДанныеФормыДерево, у которого узлами ДанныеФормыЭлементДерева. Забей это в СП и посмотри свойства/методы.     
         | 
|||
| 
    13
    
        Родом из детства    
     23.09.21 
            ✎
    12:48 
 | 
         
        (12) Хорошо, спасибо ещё раз)     
         | 
|||
| 
    14
    
        TormozIT    
     гуру 
    23.09.21 
            ✎
    17:02 
 | 
         
        Для всех древовидных объектов реализовал универсальные функции получения адреса (Дерево_ПутьСтрокойЛкс) и нахождения по этому адресу строки дерева (Дерево_НайтиПоПутиСтрокойЛкс).
 
        Правда для тонкого клиента не расставлял экранирование недоступных типов. В частности задачу (0) можно решить так 1. Найти в дереве значений на сервере нужную строку например через ДеревоЗначений.НайтиСтроки(Отбор, Истина) 2. Найти ту же строку в проекции этого дерева в реквизит формы. НайденнаяСтрока = Дерево_НайтиПоПутиСтрокойЛкс(ДеревоФормы, "", Дерево_ПутьСтрокойЛкс(СтрокаДерева, "")) 3. Элементы.Дерево.ТекущаяСтрока = НайденнаяСтрока.ПолучитьИдентификатор() // Параметры: // ИмяКолонки - Строка - если задать пустое значение, то будет использован индекс строк дерева // ИгнорироватьПростойПервыйУровень - Булево - если на первом уровне только одна строка, то игнорировать ее Функция Дерево_ПутьСтрокойЛкс(СтрокаДерева, ИмяКолонки = "Имя", ИгнорироватьПростойПервыйУровень = Ложь, Разделитель = ".", Дерево = Неопределено, Исключения = Неопределено) Экспорт Если Не ЗначениеЗаполнено(ИмяКолонки) Тогда Родитель = РодительСтрокиДереваЛкс(СтрокаДерева, Дерево); Если Ложь Или ТипЗнч(Родитель) = Тип("ДеревоЗначений") Или ТипЗнч(Родитель) = Тип("СтрокаДереваЗначений") Тогда Результат = Родитель.Строки.Индекс(СтрокаДерева); ИначеЕсли Ложь Или ТипЗнч(Родитель) = Тип("ОтборКомпоновкиДанных") Или ТипЗнч(Родитель) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Или ТипЗнч(Родитель) = Тип("ДоступныеПоляКомпоновкиДанных") Или ТипЗнч(Родитель) = Тип("ДоступноеПолеКомпоновкиДанных") Или ТипЗнч(Родитель) = Тип("ДоступноеПолеОтбораКомпоновкиДанных") Тогда Результат = Родитель.Элементы.Индекс(СтрокаДерева); ИначеЕсли Ложь Или ТипЗнч(Родитель) = Тип("ДанныеФормыДерево") Или ТипЗнч(Родитель) = Тип("ДанныеФормыЭлементДерева") Тогда Результат = Родитель.ПолучитьЭлементы().Индекс(СтрокаДерева); Иначе ВызватьИсключение "Неподдерживаемый тип элемента дерева - " + ТипЗнч(Родитель); КонецЕсли; Иначе Если Исключения <> Неопределено Тогда Для Каждого Структура Из Исключения Цикл Если СравнитьЗначенияСвойствЛкс(СтрокаДерева, Структура, Структура.СвойстваДляСравнения) Тогда Результат = Структура[ИмяКолонки]; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Если Результат = Неопределено Тогда Результат = СтрокаДерева[ИмяКолонки]; КонецЕсли; КонецЕсли; Попытка Родитель = СтрокаДерева.Родитель; Исключение Родитель = СтрокаДерева.ПолучитьРодителя(); КонецПопытки; Если Родитель = Неопределено Тогда Если Истина И ИгнорироватьПростойПервыйУровень И СтрокаДерева.Владелец().Строки.Количество() = 1 Тогда Результат = Неопределено; КонецЕсли; Иначе РезультатСверху = Дерево_ПутьСтрокойЛкс(Родитель, ИмяКолонки, ИгнорироватьПростойПервыйУровень, Разделитель, Дерево, Исключения); Если РезультатСверху <> Неопределено Тогда Результат = РезультатСверху + Разделитель + Результат; КонецЕсли; КонецЕсли; Возврат XMLСтрока(Результат); КонецФункции // Параметры: // ИмяКолонки - Строка - если задать пустое значение, то будет использован индекс строк дерева // ИгнорироватьПростойПервыйУровень - Булево - если на первом уровне только одна строка, то игнорировать ее Функция Дерево_НайтиПоПутиСтрокойЛкс(СтрокаДерева, ИмяКолонки = "Имя", Путь, ИгнорироватьПростойПервыйУровень = Ложь) Экспорт Если Истина И ИгнорироватьПростойПервыйУровень И ТипЗнч(СтрокаДерева) = Тип("ДеревоЗначений") И СтрокаДерева.Строки.Количество() = 1 Тогда Возврат Дерево_НайтиПоПутиСтрокойЛкс(СтрокаДерева.Строки[0], ИмяКолонки, Сред(Путь, 2)); КонецЕсли; ТекущийУровень = ПервыйФрагментЛкс(Путь); Если Не ЗначениеЗаполнено(ТекущийУровень) Тогда Возврат СтрокаДерева; КонецЕсли; ОстальнойПуть = Сред(Путь, СтрДлина(ТекущийУровень) + 2); Если Не ЗначениеЗаполнено(ИмяКолонки) Тогда ЗначениеИндекса = Число(ТекущийУровень); Если Ложь Или ТипЗнч(СтрокаДерева) = Тип("ДеревоЗначений") Или ТипЗнч(СтрокаДерева) = Тип("СтрокаДереваЗначений") Тогда Если СтрокаДерева.Строки.Количество() > ЗначениеИндекса Тогда ТекущаяСтрока = СтрокаДерева.Строки[ЗначениеИндекса]; КонецЕсли; ИначеЕсли Ложь Или ТипЗнч(СтрокаДерева) = Тип("ОтборКомпоновкиДанных") Или ТипЗнч(СтрокаДерева) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Или ТипЗнч(СтрокаДерева) = Тип("ДоступныеПоляКомпоновкиДанных") Или ТипЗнч(СтрокаДерева) = Тип("ДоступноеПолеКомпоновкиДанных") Или ТипЗнч(СтрокаДерева) = Тип("ДоступноеПолеОтбораКомпоновкиДанных") Тогда Если СтрокаДерева.Элементы.Количество() > ЗначениеИндекса Тогда ТекущаяСтрока = СтрокаДерева.Элементы[ЗначениеИндекса]; КонецЕсли; ИначеЕсли Ложь Или ТипЗнч(СтрокаДерева) = Тип("ДанныеФормыДерево") Или ТипЗнч(СтрокаДерева) = Тип("ДанныеФормыЭлементДерева") Тогда Если СтрокаДерева.ПолучитьЭлементы().Количество() > ЗначениеИндекса Тогда ТекущаяСтрока = СтрокаДерева.ПолучитьЭлементы()[ЗначениеИндекса]; КонецЕсли; Иначе ВызватьИсключение "Неподдерживаемый тип элемента дерева - " + ТипЗнч(СтрокаДерева); КонецЕсли; Иначе Если Ложь Или ТипЗнч(СтрокаДерева) = Тип("ДанныеФормыДерево") Или ТипЗнч(СтрокаДерева) = Тип("ДанныеФормыЭлементДерева") Тогда ТекущаяСтрока = Неопределено; ДочерниеЭлементы = СтрокаДерева.ПолучитьЭлементы(); Для Каждого ДочернийЭлемент Из ДочерниеЭлементы Цикл Если ДочернийЭлемент[ИмяКолонки] = ТекущийУровень Тогда ТекущаяСтрока = ДочернийЭлемент; Прервать; КонецЕсли; КонецЦикла; Иначе ТекущаяСтрока = СтрокаДерева.Строки.Найти(ТекущийУровень, ИмяКолонки); КонецЕсли; КонецЕсли; Если ТекущаяСтрока <> Неопределено Тогда Возврат Дерево_НайтиПоПутиСтрокойЛкс(ТекущаяСтрока, ИмяКолонки, ОстальнойПуть); Иначе Возврат СтрокаДерева; КонецЕсли; КонецФункции  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |