![]() |
![]() |
|
Сохранение иерархического списка без преобразования. | ☑ | ||
---|---|---|---|---|
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
|
Колонки я делал не вручную, а создавал в дереве значений на форме, но почему-то из-за этой строчки оставалась только одна.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |