Имя: Пароль:
1C
1С v8
Самый быстрый способ получения данных из внешнего sql в ТЗ какой?
,
0 Fragster
 
гуру
05.02.13
16:56
Ну, кроме внешних источников данных, ибо не 8.2.
т.е. есть ADODB.recordset где-то 3мегазаписей, надо быстро запихать в ТЗ, чтобы крутануть в отчете СКДшном потом.
Хранить в базе тоже не предлагать, ибо обновления данных во внешнем источнике весьма странные могут быть. Интересуют именно "грязные" хаки по получению ТЗ.
1 Fragster
 
гуру
05.02.13
16:57
90% времени приходится на заполнение строк ТЗ поколоночно :(
2 ДенисЧ
 
05.02.13
16:59
GameWithFire?

ЗЫ. Сам не пробовал
3 acsent
 
05.02.13
17:02
перейти на 8.2
4 acsent
 
05.02.13
17:02
отдельную базу сделать под этот отчет на 8.2
5 Fragster
 
гуру
05.02.13
17:03
(2) хм... счас попробую
(3) ага, вот прям взяли и перешли за несколько часов все
6 zmaximka
 
05.02.13
17:06
А внешний источник данных использовать не пробовали?
7 zmaximka
 
05.02.13
17:07
Упс. Сорри
8 Мыш
 
05.02.13
17:11
Лучший хак - вместо * выбирать конкретные поля.
9 Fragster
 
гуру
05.02.13
17:14
(8) запрос в скуле выполняется 18-20 секунд, перекачка в ТЗ 1с - десять минут
10 ДенисЧ
 
05.02.13
17:19
(5) Проверишь - не забудб результаты теста показать...
11 Мыш
 
05.02.13
17:28
(9) Однако. 3 миллиона записей и сколько полей? Любопытно стало )
12 Fragster
 
гуру
05.02.13
17:31
(11) пока 7
13 Мыш
 
05.02.13
17:35
(12) А в какой части заполнения ТЗ наибольшая задержка?
Например "Таблица.Добавить()" или "Fields(Сч).Value" или что-то ещё. Не анализировал?
14 Sammo
 
05.02.13
17:42
Сделай, например, регистр сведений и скулем копируй из скулевской таблицы напрямую в скулескую таблицу РС
15 Жан Пердежон
 
05.02.13
17:43
(0) почему в базе хранить не хочешь?
16 Fragster
 
гуру
05.02.13
17:44
(13) по сумме примерно так:    
75% ТМП = Recordset.Fields(Поле).Value;
25% Стр[Поле] = ТМП;
17 Fragster
 
гуру
05.02.13
17:44
(15) механизм синхронизации, обновление базы и т.п. ради одного отчета
18 Fragster
 
гуру
05.02.13
17:45
(16)+ на ТЗ.Добавить столько же, сколько на 7 штук Стр[Поле] = ТМП;
19 Жан Пердежон
 
05.02.13
17:46
(17) какой механизм? сразу всю таблицу заливай, а если хочется "грязного" пиши данные сразу в скуль
20 РазДва
 
05.02.13
18:02
(0) Могу подсказать "грязный хак":
Делаем регистр сведений в конфигурации.
После создания таблицы в SQL заменяем её на вьюху с таким же именем с твоим запросом.
21 Fragster
 
гуру
05.02.13
18:03
короче, на части данных (скопируйте в эксельку, кому непонятны колонки):
Записей    1000    10000    20000    30000    40000    50000
1с    0,65    6,6    13,38    20,14    27,26    35,78
ЕИ    0,13    1,38    2,74    4,25    5,16    6,98
Отношение    5    4,782608696    4,883211679    4,738823529    5,282945736    5,126074499
22 Fragster
 
гуру
05.02.13
18:04
вот миста, похерила табуляции....
23 МихаилМ
 
05.02.13
18:10
(20)
как решаете проблему удаления таблиц при реструктуризации?
24 РазДва
 
05.02.13
18:14
(23) Так если не менять этот регистр, не загружать - выгружать из dt, то он не реструктуризируется.
В случае изменения, вернуть таблицу, пересоздать вьюху заново заготовленым скриптом.
Вообще это запрещенный "грязный хак", но зато работает очень быстро.
25 sapphire
 
05.02.13
18:15
(0) ВК GameWithFare, ComSafeArray
26 ДенисЧ
 
06.02.13
20:26
попробовал мой совет? Результаты есть?
27 Fragster
 
гуру
06.02.13
20:27
(26) -> (21)
28 Жан Пердежон
 
07.02.13
11:19
(27) расшифруй
29 Fragster
 
гуру
07.02.13
11:26
(28) в (21) сравнение заполнения ТЗ из ADODB.Recordset средствами 1с (заполнение реквизитов Строк ТЗ в цикле) и средствами Enterprise Integretor (gamewithfire.dll) на разном количестве строк на моем компьютере. всего 7 колонок в таблице (если влом читать всю ветку).
30 Speshuric
 
07.02.13
17:23
Recordset.Fields(Поле).Value - тут надо Recordset.Fields(Поле) в массив или в структуру перед циклом вытащить. Сразу поди раза в 2 раза и ускорится.

Есть способы ускорить без ВК: асинхронный фетч, запихивать в рекордсет структуру в виде "ЗначениеВСтрокуВнутр" и т.п.
31 Fragster
 
гуру
07.02.13
18:12
про массив и как преобразовать ком объект в строку для значения из строки непонятно мне
32 Fragster
 
гуру
07.02.13
18:13
рекордсет весь целиком в комсэйвэррэй можно, но он падает по нехватке памяти
33 Speshuric
 
07.02.13
18:52
(31)

Поле1ЧтобыПолучать = Recordset.Fields(Поле1);
Поле2ЧтобыПолучать = Recordset.Fields(Поле2);

Пока ... Цикл

....
   Поле1Значение = Поле1ЧтобыПолучать.Value;
   Поле2Значение = Поле2ЧтобыПолучать.Value;
....

КонецЦикла;
34 Fragster
 
гуру
07.02.13
18:53
(33) т.е. так не только первая строка получается?
35 Speshuric
 
07.02.13
18:59
(34) На получение Com-объекта "Field" выражением Recordset.Fields(Поле) тратится до фига времени. И для выражения Recordset.Fields(Поле).Value это делается в каджой строчке на каждое поле, а можно схитрить и эти объекты Field получить заранее. Смущаеть, наверное, что кажется что эти поля "конкретной строки"? Нет, это поля рекордсета, а Поле.Value - значение в текущей строке.