Имя: Пароль:
1C
1С v8
Работа с деревом значений в Управляемой форме.
0 Rom_Kat
 
16.06.19
17:11
Дерево заполняю из Справочника с иерархией. В дереве на форме устанавливаю числовое значение реквизита. При изменении ячейки соответствующей этому реквизиту записывается на сервере это же значение по иерархии в справочник. Если ещё и рекурсивно записывать в дерево, то дерево на форме сворачивается.

Как бы записать в дерево или обновить запросом из справочника и оставить на форме в таком же виде как было и до записи?
1 Rom_Kat
 
16.06.19
21:14
Как вообще управлять отображением дерева?
2 Zhuravlik
 
17.06.19
00:40
Свертка происходит после ЗначениеВРеквизитФормы. Соотв. чтобы не сворачивалось надо обновлять используя только данные формы. Либо запоминать текущую открытую позицию, и потом разворачивать дерево до нее (с этим вроде были какие-то сложности, не упомню, надо попробовать установку свойства ТекущаяСтрока, емнип). А прежде все задуматься - оно вообще того стоит? Может есть иное, либо более простое решение?
Вспоминается фраза с ИТС - если вы испытываете затруднения при разработке, скорее всего проблемы с архитектурой. Либо выбран неудачный подход к решению задачи.
3 Mort
 
17.06.19
03:34
Вот клиентские функции:



Пример использования:


СостояниеДерева =  ПолучитьСостояниеДерева(Элементы.ДеревоЗначений, ДеревоЗначений, "Ссылка"); // Вместо "ссылка" нужно указать уникальное поле дерева

ОбновитьДерево(); // Вызываем функцию которая меняет дерево.

УстановитьСостояниеДерева(Элементы.ДеревоЗначений, ДеревоЗначений, СостояниеДерева, "Ссылка")



Вот сам функции:


Функция ПолучитьСостояниеДерева(ТаблицаФормы, Дерево, ПолеКлюча) Экспорт
    
    Результат = Новый Структура("ПутьТекущейСтроки, СостояниеУзлов", Новый Массив, Новый Соответствие);
    
    Если ТаблицаФормы.ТекущаяСтрока <> Неопределено Тогда
        
        ТекСтрока = Дерево.НайтиПоИдентификатору(ТаблицаФормы.ТекущаяСтрока);
        
        Выделение = Новый Массив;
        
        Пока ТекСтрока <> Неопределено Цикл
            Результат.ПутьТекущейСтроки.Вставить(0, ТекСтрока[ПолеКлюча]);
            ТекСтрока = ТекСтрока.ПолучитьРодителя();
        КонецЦикла;    
        
    КонецЕсли;
    
    ДобавитьСостояниеУзлов(ТаблицаФормы, Дерево, Результат.СостояниеУзлов, ПолеКлюча);
    
    Возврат Результат;
    
КонецФункции


Процедура ДобавитьСостояниеУзлов(ТаблицаФормы, СтрокиДереваФормы, СостояниеУзлов, ПолеКлюча)
    
    Для Каждого СтрокаДерева из СтрокиДереваФормы.ПолучитьЭлементы() Цикл
        СостояниеУзлов.Вставить(СтрокаДерева[ПолеКлюча], ТаблицаФормы.Развернут(СтрокаДерева.ПолучитьИдентификатор()));
        ДобавитьСостояниеУзлов(ТаблицаФормы, СтрокаДерева, СостояниеУзлов, ПолеКлюча);
    КонецЦикла;
    
КонецПроцедуры


Процедура УстановитьСостояниеДерева(ТаблицаФормы, Дерево, СостояниеДерева, ПолеКлюча) Экспорт
    
    Для Каждого СтрокаДерева из Дерево.ПолучитьЭлементы() Цикл
        
        
        Если СостояниеДерева.ПутьТекущейСтроки.Количество() > 0 И СтрокаДерева[ПолеКлюча] = СостояниеДерева.ПутьТекущейСтроки[0] Тогда
            ТаблицаФормы.ТекущаяСтрока = СтрокаДерева.ПолучитьИдентификатор();
            СостояниеДерева.ПутьТекущейСтроки.Удалить(0);
        КонецЕсли;
        
        Развернут = СостояниеДерева.СостояниеУзлов.Получить(СтрокаДерева[ПолеКлюча]);
        Если Развернут <> Ложь Тогда
            ТаблицаФормы.Развернуть(СтрокаДерева.ПолучитьИдентификатор());
        Иначе
            ТаблицаФормы.Свернуть(СтрокаДерева.ПолучитьИдентификатор());
        КонецЕсли;
        
        УстановитьСостояниеДерева(ТаблицаФормы, СтрокаДерева, СостояниеДерева, ПолеКлюча);
        
    КонецЦикла;
    
КонецПроцедуры
4 Rom_Kat
 
17.06.19
12:08
(3) спасибо, попробую.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший