Имя: Пароль:
1C
 
Сохранение иерархического списка без преобразования.
0 WizardProff
 
06.05.12
09:47
Доброго времени суток!

Есть один очень интересный вопрос! Как сохранить иерархический список в базу 1С 8?

Преобразование из иерархического спика в таблицу значений очень сильно влияет на производительность. Может кто сталкивался с такой задачей.
1 Wobland
 
06.05.12
09:50
(0) дерево значений в хранилище
2 vicof
 
06.05.12
09:50
"Как сохранить иерархический список в базу 1С 8?"
что это значит?
3 Wobland
 
06.05.12
09:51
(2) кстати, да? что это за бред?
4 m-serg74
 
06.05.12
09:57
(3) кстати не всегда бред) сталкивался с такой фигней... одной конторе надо было чтоб в отчете статьи затрат выходили в строго определенной иерархии, ну и еще там кое что))) так и делал дерево в хранилище и потом именно по нему и выводил в отчет...
5 WizardProff
 
06.05.12
10:00
С хранилищем - это был мой первый вариант. Почему-то сохраняются не все колонки дерева значений.
6 m-serg74
 
06.05.12
10:04
ну у меня проще было там одна колонка - ссылка на СтЗатрат
7 m-serg74
 
06.05.12
10:05
сначала хотел специально для этого справочник завести, потом Статьям - реквизит добавить, остановился все таки на хранилище)
8 m-serg74
 
06.05.12
10:06
(5) а второй вариант какой был?
9 wertyu
 
06.05.12
10:06
(5) как это удалось добиться такого замечательного результата? может просто они не все восстанавливаются?
10 WizardProff
 
06.05.12
10:09
После восставновления из хранилища остается только одна колонка, где тип данных Ссылка, остальные числовые значения не восстанавливаются ну или не сохраняются.

Второй вариант был преобразование из дерева в таблицу значений документа, но такая процедура занимает слишком много времени при больших объемах данных.
11 wertyu
 
06.05.12
10:10
(10) запости плиз три вещи: получение ДЗ, сохранение ДЗ и восстановление ДЗ
12 m-serg74
 
06.05.12
10:21
наверное уже все затер) теперь восстанавливает "три вещи")
13 WizardProff
 
06.05.12
10:28
// Заполняет дерево значений по результату запроса
// Вызывается рекурсивно
Процедура ВыбратьПоГруппировкам(ИндексГруппировки, ПредВыборка, ПредСтрокаТЧ)
   
   Если (ИндексГруппировки + 1) > ПостроительОтчета.ИзмеренияСтроки.Количество() Тогда
       Возврат;
   КонецЕсли;
   
   СтрокаГруппировки = ПостроительОтчета.ИзмеренияСтроки.Получить(ИндексГруппировки);
   
   Выборка = ПредВыборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   Пока Выборка.Следующий() Цикл
       
       СтрокаТЧ = ПредСтрокаТЧ.Строки.Добавить();
       
       <...>
       // Здесь идет заполнение многочисленных реквизитов строки дерева значений
       <...>    
           
       ВыбратьПоГруппировкам(ИндексГруппировки + 1, Выборка, СтрокаТЧ);
       
   КонецЦикла;

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

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

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

// Вызов
Результат.Очистить(); // Таблица значений документа с нужными реквизитами
СохранитьИерархию( РезультатИерархия.Строки, 0 );

// Восстановление иерархии из таблицы значений в дерево значений
Процедура ВосстановитьРезультатИерархически()
   
   РезультатИерархия.Строки.Очистить();
   
   Для Каждого СтрокаТЧ Из Результат Цикл

       Если СтрокаТЧ.ИДРодителя = 0 Тогда
           
           НовСтрокаТЧ = РезультатИерархия.Строки.Добавить();
           
           <...>
           // Здесь идет заполнение многочисленных реквизитов строки дерева значений
           <...>
           
           ДобавитьПодчиненныеСтроки( СтрокаТЧ, НовСтрокаТЧ );
       КонецЕсли;
       
   КонецЦикла;
   
КонецПроцедуры

// Обход по всем подчиненным строкам иерархии
// Вызывается рекурсивно
Процедура ДобавитьПодчиненныеСтроки( РодительСтрокаТЧ, НовРодительСтрокаТЧ )
   
   Для Каждого СтрокаТЧ Из Результат Цикл

       Если СтрокаТЧ.ИДРодителя <> 0 Тогда
           Если СтрокаТЧ.ИДРодителя = РодительСтрокаТЧ.ИДСтроки Тогда
               
               НовСтрокаТЧ = НовРодительСтрокаТЧ.Строки.Добавить();
               
               <...>
               // Здесь идет заполнение многочисленных реквизитов строки дерева значений
               <...>
               
               ДобавитьПодчиненныеСтроки( СтрокаТЧ, НовСтрокаТЧ );
           КонецЕсли;
       КонецЕсли;
       
   КонецЦикла;
   
КонецПроцедуры

// Ну а сохранение, восстановление с помощью хранилища выглядит так

// Сохранение
СохраненныйРезультат = Новый ХранилищеЗначения(РезультатИерархия);

// Восстановление
РезультатИерархия = СохраненныйРезультат.Получить();
ЭлементыФормы.РезультатИерархия.СоздатьКолонки();
14 m-serg74
 
06.05.12
10:36
че то как то сложно... по моему...
15 m-serg74
 
06.05.12
10:49
//получение ДЗ
   Запрос = Новый Запрос(
   "ВЫБРАТЬ
   |    Подразделения.Ссылка КАК Ссылка,
   |    Подразделения.Код,
   |    Подразделения.Наименование,
   |    1 КАК Поле1
   |ИЗ
   |    Справочник.Подразделения КАК Подразделения
   |ИТОГИ
   |    СУММА(Поле1)
   |ПО
   |    Ссылка ТОЛЬКО ИЕРАРХИЯ");
   ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   //получение ДЗ
   
   //сохранение ДЗ
   Сохраненное = Новый ХранилищеЗначения(ДЗ);
   //сохранение ДЗ
   
   
   //восстановление ДЗ
   ДЗ = Сохраненное.Получить();
   //восстановление ДЗ
16 WizardProff
 
06.05.12
10:57
Данные в запросе компануются из нескольких регистров с указанным пользователем количеством и расположением группировок. Т.е. документ работает по принципу отчета - пользователь устанваливает произвольный отбор и произвольные группировки. Результат запроса сохраняется в дерево значений.

На этом этапе все работает нормально.

Теперь у меня есть результат запроса сохраненный в дерево значений, где произвольное количество уровней иерархии. Причем группируется по разным признакам, напрмер:
+ Склад
 + Номенклатура
  + Номенклатура.НоменклатурнаяГруппа
   + Качество

Причем уровней иерархии пользователь может задать неограниченное количество.

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

Причем пользователь еще может вносить изменения в дерево значений, они тоже должны сохраниться.
17 m-serg74
 
06.05.12
11:02
так у тебя с заполнением дерева перед сохранением или перед выводом пользователю трудности, а сохраняется - восстановливается дерево один в один
18 wertyu
 
06.05.12
11:03
дык зачем при сохранении и восстановлении всё это обходить, ДЗ то от этого не меняется, сделай просто как в (15) посление две строчки
19 WizardProff
 
06.05.12
11:05
Ребят, всем спасибо! Задача решене!

Лишней была строчка: ЭлементыФормы.РезультатИерархия.СоздатьКолонки(); )))
Из-за нее при восстановлении из хранилища оставалась только одна колонка.
20 wertyu
 
06.05.12
11:08
(19) а, так ты колонки вручную делал...
21 WizardProff
 
06.05.12
11:09
Колонки я делал не вручную, а создавал в дереве значений на форме, но почему-то из-за этой строчки оставалась только одна.
AdBlock убивает бесплатный контент. 1Сергей