Имя: Пароль:
1C
 
Как быстро свернуть большую таблицу значений?
0 eeyore
 
10.07.09
17:30
Создаю ТЗ:
   
ТЗ = Новый ТаблицаЗначений;
   ТЗ.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.Подразделения"));
   ТЗ.Колонки.Добавить("Продукция", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   ТЗ.Колонки.Добавить("ВесПродукции");
   ТЗ.Колонки.Добавить("КоличествоПродукции");
   ТЗ.Колонки.Добавить("СуммаЗатратНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
   ТЗ.Колонки.Добавить("КоличествоМатериалаНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
   ТЗ.Колонки.Добавить("Счет");
   ТЗ.Колонки.Добавить("Субконто1");
   ТЗ.Колонки.Добавить("Субконто2");
   ТЗ.Колонки.Добавить("Субконто3");
   ТЗ.Колонки.Добавить("Материал");
   ТЗ.Колонки.Добавить("ЭтоПолуфабрикат", Новый ОписаниеТипов("Булево"));

Заполняю ее в обработке - получаю ~200 000 записей
Далее стоит задача свернуть ее, по такому правилу:
ТЗ.Свернуть("Подразделение, Продукция, ЭтоПолуфабрикат, Материал, КоличествоПродукции", "КоличествоМатериалаНаВесПродукции, СуммаЗатратНаВесПродукции");

После сворачивания - в таблице остается в 2 раза меньше записей, НО 1с сворачивает ее 1 час. Как решить вопрос со скоростью?
1 Лефмихалыч
 
10.07.09
17:31
(0) запросом пробовал?
2 73
 
10.07.09
17:31
Запросом не пробовал?
3 eeyore
 
10.07.09
17:33
(1),(2) - забыл уточнить у меня платформа 8.0
4 НЕА123
 
10.07.09
17:34
индексы могет помогут, но не уверен.
5 GedKo
 
10.07.09
17:37
(0) а может в обработке не добавлять строки, а искать по нужным критериям уже созданные строки и изменять значения?
6 eeyore
 
10.07.09
17:37
(4) к сожалению индексы только в 8.1 а у меня 8.0, к тому же там с индексами нюанс:
"Индекс индексирует строковое представление ссылочного объекта, а не сами ссылки"
7 НЕА123
 
10.07.09
17:37
+(4)но в 80 индексов вроде тоже нет.
8 Лефмихалыч
 
10.07.09
17:39
может заюзать xBase? там и индексы есть, и можно через ОЛЕДБ запросом свернуть
9 GedKo
 
10.07.09
17:39
или писать напрямую в какую-нить скл таблицу и доставать запросом
10 eeyore
 
10.07.09
17:41
(5) - в принципе вариант, я об этом думал, только это значительно усложняет наглядность кодо - т.е. я формирую не одну таблицу для нескольких расчетов, которую затем группирую под каждый вид расчета, а создаю отдельную таблицу для каждого расчета. Мне такой вариант не очень импонирует, но если лучше решения не найдется то придется идти по этому пути.
11 НЕА123
 
10.07.09
17:43
(0)
колонки, которые не участвуют в свернутой таблице нужны? если нет то и не добавлять, если нужны, то типизировать все.
12 eeyore
 
10.07.09
17:45
(9) - идею понравилась, а как из 1с 8.0 напрямую с sql работать? Можешь ссылку дать или пример кода?
13 НЕА123
 
10.07.09
17:45
+(11) в 77 это сильно убыстряло.
14 Живой Ископаемый
 
10.07.09
17:46
а можно базу сконвертить в в81
15 eeyore
 
10.07.09
17:48
(8) - c xBase попробую, не понял второй части, а именно как "через ОЛЕДБ запросом свернуть"?
16 Живой Ископаемый
 
10.07.09
17:51
2(15) Записать таблицу с 200 т строк в Хбэйс, а ту которую тебе нужно - получить не сворачиванием и скл-запросм через ОЛЕДБ с  уже нужными тебе группировками
17 НЕА123
 
10.07.09
17:51
(15)
интересно, а сколько отрабатывает после заполнения без свертки
ТЗ = Неопределено;
не пробовал?
18 eeyore
 
10.07.09
17:52
(11) - все колонки нужны - т.к. по этой таблице строятся еще такие итоги
ТЗ.Свернуть("Счет, Субконто1, Субконто2, Субконто3", "СуммаЗатратНаВесПродукции");
но тут получается мало(~200)записей и такаое сворачиваение работает быстро - 20сек.

Я не понял какой смысл типизировать колонки которые в сворачивании не учавствуют - они же все равно выбрасываются из таблица по теории?
19 eeyore
 
10.07.09
17:56
(17) - не понял ни вопроса ни идеи.
20 НЕА123
 
10.07.09
17:57
(18) освобождение памяти при удалении. например, если тип число, ссылка на объект БД - ниче не проверяется. если СЗ, ТЗ - тоды да.
если не типизировано - всегда смотрит что там. в 77 эффект типизации был огромный.
21 eeyore
 
10.07.09
17:58
(16) как из 1с работать с OLEDB - через какой объект?
22 Живой Ископаемый
 
10.07.09
17:59
2(21) э... через ОЛЕ... примеры искать в гугле.
23 eeyore
 
10.07.09
18:00
(20) - ок, с оптимизаций попробую, лишние колонки удалю, посмотрю что получится.
24 eeyore
 
10.07.09
18:00
(22) - спасибо за идею - поищу.
25 vde69
 
10.07.09
18:16
(0) у меня похожая шняга на 7.7 реализована поэтапным сворачиванием,

обьясню:

обработка тянет данные из навижена по куче счетов, после каждого запроса и добавления полей в ТЗ я сворачиваю всю ТЗ, но это только в том случае если итоговая таблица будет не очень большая, в моем случае свертка 1 ляма строк до 50тыс идет примерно 3 минуты
26 eeyore
 
10.07.09
18:34
(25) - а как в моем случаем можно сделать поэтапное сворачивание? если у меня на 200 000 исходных записей приходится 100 000 конечных? т.е. в среднем одинаковые записи всего в 2х экземлярах. Если бы их было много, то тогда еще понятно.
27 Пеппи
 
10.07.09
18:42
на заметку
28 vde69
 
10.07.09
18:57
(26) ну в твоем случае мой совет не пойдет
29 Злопчинский
 
10.07.09
19:08
Организовать заполнение тз таким образом (порядок исходной выборки данных) чтобы добавить запись в конец, а потом к ней суммировать...
30 73
 
10.07.09
19:09
Попробуй построителем.
Вот идея:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("Кво", Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("Примечание", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(20)));
Для й=1 по 100000 цикл
   НовСтр = ТЗ.Добавить();
   Новстр.Номер = й;
   Новстр.Кво = 100000-й;
   Новстр.Примечание = "Строка "+Цел(й/100);
КонецЦикла;
   
ТЗ.ВыбратьСтроку();
   
ИстДанных = Новый ОписаниеИсточникаДанных(ТЗ);
ИстДанных.Колонки.Примечание.Измерение = Истина;
ИстДанных.Колонки.Кво.Итог = "Сумма(Кво)" ;
ИстДанных.Колонки.Номер.Итог = "Максимум(Номер)" ;

ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = ИстДанных;

Результат = ПостроительЗапроса.Результат; // отобранные строки типа РезультатЗапроса    
   
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Примечание");

ТЗ.Очистить();
Пока Выборка.Следующий() Цикл
   ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Выборка);
КонецЦикла;

ТЗ.ВыбратьСтроку();
31 Читатель
 
10.07.09
19:10
Колонки типизировать не пробовал ?
32 eeyore
 
13.07.09
11:58
(29) - не представляю как это возможно - выборки из запроса нет, тз заполняется на внутреннем языке путем сложного распределения себестоимости используемых в производстве материалов на конечную продукцию.
33 eeyore
 
13.07.09
12:01
(31)(20)(13)(11) - типизировал все колонки, которые участвуют в сворачивании, лишнии удалил. Это ничего не дало вообще, как он час сворачивал так и сворачивает.
34 eeyore
 
13.07.09
12:03
(33)
   ТЗ.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.Подразделения"));
   ТЗ.Колонки.Добавить("Продукция", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   ТЗ.Колонки.Добавить("КоличествоПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
   ТЗ.Колонки.Добавить("СуммаЗатратНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
   ТЗ.Колонки.Добавить("КоличествоМатериалаНаВесПродукции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
   ТЗ.Колонки.Добавить("Материал", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   ТЗ.Колонки.Добавить("ЭтоПолуфабрикат", Новый ОписаниеТипов("Булево"));

   ТЗ.Свернуть("Подразделение, Продукция, ЭтоПолуфабрикат, Материал, КоличествоПродукции", "КоличествоМатериалаНаВесПродукции, СуммаЗатратНаВесПродукции");
35 eeyore
 
13.07.09
16:23
(30) - спасибо - то что нужно! Запрос за 7 секунд отрабатывает! И еще за 80 секунд я этот запрос преобразовываю в ТЗ.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.