|
Вывод 2 миллиона строк в СКД | ☑ | ||
---|---|---|---|---|
0
virdim
21.02.19
✎
10:12
|
Здравствуйте! Делаю выгрузку данных при помощи скд. Для отладки использую консоли запросов и скд из ИР. Написал запрос для скд. В консоле без отборов запрос выполняется достаточно быстро и вывоводит в результате более 2 млн. строк за 4-5 минут. Переношу данный запрос в консоль скд, с отборами в результате которого выводятся несколько сотен или тысяч строк, работает так же быстро. Если делать без отборов 1с падает из-за недостатка памяти. Брал результирующий запрос из скд и выполнял его в консоле, там всё так же быстро. Пробовал программно заполнить табличный документ этой схемой скд, продождал около часа, процесс на сервере занимал более 3гб оперативной памяти, и принудительно его завершил, так как ждать около часа неприемлемо. Подскажите в чем может быть проблема? Тормозит вывод или само выполнение запроса в скд? И ещё вопрос: насколько вывод в табличный документ в скд медленнее записи текста при выводе 2-2.5 млн. строк?
|
|||
1
ДенисЧ
21.02.19
✎
10:14
|
2 ляма строк - это очень много для табличного документа.
Или реж вывод, или ставь 64б сервер |
|||
2
virdim
21.02.19
✎
10:16
|
(1) Ок, а тогда можно делать выборку из результата скд для последовательной записи в запись текста?
Сервер х64, клиент х32, толстый клиент. Как бы не проблема выполнять на сервере, но оно там за час так и не выполнилось |
|||
3
SleepyHead
гуру
21.02.19
✎
10:16
|
(0) у меня на 400 тысячах строках падал отчет из-за нехватки памяти. Поэтому нужно менять постановку задачи, делать разные варианты отчета. Один вариант для подробного анализа, с обязательным использованием отборов, а второй для поиска "неисправностей", чтобы понять, с какими отборами выводить первый вариант.
Я таким путем пошел. |
|||
4
DrWatson
21.02.19
✎
10:17
|
Может для цели выгрузки использовать не табличный документ, а выводить в таблицу, а её уже выгружать куда надо?
|
|||
5
palsergeich
21.02.19
✎
10:21
|
Формировать отчёт программно.
Все что касается расшифровки - в утиль. На больших отчетах расшифровка очень ресурсоемка. Условное оформление - туда же. |
|||
6
virdim
21.02.19
✎
10:21
|
(4) Кажется я пробовал выводить в таблицу значений и результат был тот же. Но сейчас перепроверю. А последующий проход циклом по этой ТЗ кажется будет очень долгим. Оптимальным вариантом считаю последовательное чтение результата и последовательную запись сразу в файл, но я так понимаю скд не умеет в последовательное чтение результата?
|
|||
7
Cyberhawk
21.02.19
✎
10:21
|
"Делаю выгрузку данных при помощи скд" // Зачем тогда что-то выводить на клиенте?
|
|||
8
palsergeich
21.02.19
✎
10:22
|
(6) сначала результат готовится во внутреннем представлении - вот оно и не умеет.
А вот трансформация в табдок уже может быть последовательна, но это не тот случай где это поможет |
|||
9
ДенисЧ
21.02.19
✎
10:23
|
(2) Получить из СКД результирующий запрос?
|
|||
10
toypaul
гуру
21.02.19
✎
10:24
|
что мешает взять код из консоли КД и сделать тоже самое в своем отчете?
|
|||
11
palsergeich
21.02.19
✎
10:24
|
Ещё раз повторю.
Расшифровку и условное оформление в утиль |
|||
12
d4rkmesa
21.02.19
✎
10:24
|
(0) Попробуйте в разных версиях платформы. На 8.3.12 с этим проблемы. К примеру, раньше можно было загнать ТЗ в источник данных на 1-1,5 млн. строк, сейчас - уже нет, виснет с зацикливанием. Но, в любом случае, лучше оптимизировать вывод(ваш Кэп).
|
|||
13
toypaul
гуру
21.02.19
✎
10:27
|
если делаешь выгрузку данных, то попробуй через ПроцессорВывода https://its.1c.ru/db/metod8dev#content:3622:hdoc
|
|||
14
palsergeich
21.02.19
✎
10:29
|
(13) процессор вывода уже имеет рассчитанный результат на входе и по факту срабатывает после исполнения отчёта.
Прокладка между исполнением и выводом, не более. С очень высокой долей вероятности не поможет. |
|||
15
palsergeich
21.02.19
✎
10:30
|
Стандартно - так
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Ложь); Тебе надо сделать ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Ложь); Всё |
|||
16
DrWatson
21.02.19
✎
10:32
|
(6) Посмотри методы объекта ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Там кроме Вывести есть НачатьВывод, ВывестиЭлемент. https://its.1c.ru/db/v8314doc#bookmark:dev:TI000000622. правда там пример вывода в табличный документ, но в таблицу значений должно быть так же.
|
|||
17
palsergeich
21.02.19
✎
10:32
|
И тут
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки) А надо так МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки()) |
|||
18
virdim
21.02.19
✎
10:33
|
(7) На клиенте просто для удобства отладки схемы.
(11) Ок, а разве расшифоровка есть при выводе в ТЗ, тем более у меня все поля простых типов, строка или число? А если есть пользовтельское поле которое, которое собирает все поля в одно конкатенацией и на некоторые поля накладывается формат, это может тормозить? Хотя я пробовал просто поля выводить в скд, результат тот же. (15) При программном выводе делаю именно так ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Ложь); не помогает |
|||
19
ам794123
21.02.19
✎
10:34
|
(О) если результат нужно записать в файл, то такой код работает в 1000 раз быстрее чем последовательная запись:
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); ТабДок.Записать(&ИмяФайла, ТипФайлаТабличногоДокумента.TXT); |
|||
20
scanduta
21.02.19
✎
10:35
|
(0) Была аналогичная проблема когда пытался через СКД данные выгржать , а объем колол миллиона строк был.
Тоже была нехватка памяти. Тут вся вишка что СКД данные медленно выводит на форму. Поэтому решил проблемы следующим образом, из СКД напрямую результат в ТЗ грузил. А из нее выгржал в Excel и все было чики пуки. |
|||
21
palsergeich
21.02.19
✎
10:36
|
(18) расшифровка это спец объект, который хитрожопость заполняется в момент исполнения и не важно используется потом или нет(
|
|||
22
virdim
21.02.19
✎
10:43
|
(19) А в чем разница если именно на выводе в табдок всё повисает, а не на записи?
(21) То есть если я пропускаю параметр с расшифровкой при инициализации, оно потом генерит стандартную расшифровку всё равно? А как это отключить тогда? И опять же, влияет это, если у меня в выводе только одно пользователькое поле строковое? |
|||
23
ам794123
21.02.19
✎
10:45
|
(22) т.е. здесь виснет: ПроцессорВывода.Вывести(ПроцессорКомпоновки)?
|
|||
24
toypaul
гуру
21.02.19
✎
10:45
|
в модуле при компоновке можно получить реальный запрос с отборами, который будет выполнятся. ты можешь его получить и выполнить. без вывода в таб док, ТЗ и еще куда либо.
|
|||
25
palsergeich
21.02.19
✎
10:47
|
(22) расшифровка это соответствие ячейки и значения и указателя родительской группировки группировке (если упрощённо то такое Убер дерево)
На больших отчетах как правило именно она больше всего памяти кушает. |
|||
26
palsergeich
21.02.19
✎
10:47
|
(24) как вариант кстати
|
|||
27
DrWatson
21.02.19
✎
10:49
|
(24) Как? Там, вроде, из строки его надо выковыривать.
|
|||
28
palsergeich
21.02.19
✎
10:51
|
(27) это же xml при сериализации.
В чем сложность? Консоль СКД то умеет показывать, а дальше дело техники. |
|||
29
dmpl
21.02.19
✎
10:53
|
(2) Почитать книжку по СКД - как программно сформировать отчет. Само формирование при этом будет состоять из 3 стадий: компоновка настроек, собственно компоновка данных и вывод данных. Вот если перехватить данные до вывода - думаю, будет самое то.
|
|||
30
virdim
21.02.19
✎
10:57
|
(24) (26) (27) Насколько я знаю это нужно из хмл макета компновки вытаскивать, а там ещё параметры запроса для отборов как минимум. Вообще я сделал на скд ради удобства вывода при помощи сборки строки выгрузки через пользовательское поле, чтобы можно при случае просто менять в схеме формат строки, а не править код. Так что выдергивать запрос не самый лучший вариант
|
|||
31
catena
21.02.19
✎
11:07
|
(27)(30)Кого вытаскивать? Результирующий запрос?
https://cdn1.savepice.ru/uploads/2019/2/21/a326cf842cd1b97d65bee06ef3d62e92-full.png |
|||
32
catena
21.02.19
✎
11:08
|
+ЗначенияПараметров там же рядом лежат
|
|||
33
virdim
21.02.19
✎
11:13
|
(32) Ок, а как насчет пользовательских полей?
|
|||
34
DrWatson
21.02.19
✎
11:14
|
(30) Что за сбор пользовательского поля? Пользователи сами добавляют поля через настройки компоновки?
(31) Сдаётся мне, это не тот текст который получается после применения настроек компоновки. |
|||
35
singlych
21.02.19
✎
11:17
|
(34) тот-тот
(33) разве что ручками при обходе результата запроса |
|||
36
ADenPiter
21.02.19
✎
11:18
|
Если данные потом будут грузиться в 1С же, то проще в СКЛ таблицу их грузить. И быстрее, и смотреть результат можно разными способами.
|
|||
37
virdim
21.02.19
✎
11:18
|
(34) В схеме есть пользователько поле которое я сам сделал нужного мне формата, типа "Код + Наименование + формат(цена,"<фс>") + ...". Иногда нужно этот формат менять. И я думал проще менять в скд, чем переписывать код выборки с обычным запросом. Ну и + удобство наложение отборов в СКД
|
|||
38
catena
21.02.19
✎
11:18
|
(34)Таки а что это, если ам все отборы, параметры и усечения, которые применила СКД?
https://cdn1.savepice.ru/uploads/2019/2/21/f04c5996d267fcfc0b2edde018093ee8-full.png |
|||
39
virdim
21.02.19
✎
11:22
|
(35) Ну вот тут тогда всё изящество применения скд теряется:(
|
|||
40
singlych
21.02.19
✎
11:23
|
(37) Бери выражение поля из настроек и вычисляй при обходе.
|
|||
41
singlych
21.02.19
✎
11:23
|
(39) А процессор вывода, думаешь, как делает?
|
|||
42
DrWatson
21.02.19
✎
11:24
|
(38) Сорри, всё правильно. Не разглядел сначала, что это МакетКомпоновки, а не СхемаКомпоновки.
|
|||
43
singlych
21.02.19
✎
11:25
|
(37) наложение отборов тоже лежит в настройках и отражается на тексте запроса и параметрах из макета
|
|||
44
singlych
21.02.19
✎
11:27
|
Только вот с отборами, которые на уровне группировок, я не уверен.
|
|||
45
virdim
21.02.19
✎
11:34
|
(44) Хорошо, вот есть результирующий запрос. А как быть с группировками в отчете?
Попробовал такой вариант https://its.1c.ru/db/v8314doc#bookmark:dev:TI000000622 ТД сформировался примерно за 15 минут, что уже неплохо, хотя вывовод в запись текста с обычным запросом занимает около 4-5 минут |
|||
46
singlych
21.02.19
✎
11:53
|
(45) Хм, еще и группировки надо.. Ну добавь итоги, если группировки несложные. Но так-то смотри, чем больше вопросов, тем больше аргументов в пользу процессора вывода. А то еще окажется, к примеру, что наборов данных не один и т.п.
|
|||
47
virdim
21.02.19
✎
12:16
|
(46) Ну да в этом и проблема, что требуются дополнительные телодвижения при модификации схемы. А группировки добавлять путем конкатенации текста запроса с текстом итогов? Тоже так себе вариант. Кстати, никто ещё под это дело не придумал шаблонный модуль, который будет схему разворачивать в запрос? Я пока продолжаю оптимизировать запрос для скд, убрал условное оформление, стало быстрее.
|
|||
48
singlych
21.02.19
✎
12:42
|
(47) Да не потребуется. Ты ж динамически итоги будешь собирать по текущим настройкам компоновщика. Другое дело, стоит ли игра свеч. Обычно такие задачи с выполнением запроса из макета компоновки вместо самой компоновки, подразумевают, что там настройки примитивные, без всяких там сложных ресурсов и вычисляемых полей, какие-нибудь детальные записи. Тот же процессор компоновки в коллекцию значений, к примеру, не работает для группировок-таблиц.
|
|||
49
TormozIT
гуру
03.03.19
✎
14:08
|
Если структура компоновки достаточно простая (плоская, без соединений наборов данных и без ресурсов), то из компоновки эффективнее получить запрос (ирОбщий.ПолучитьЗапросИзКомпоновкиЛкс) и уже с ним работать, т.е. не использовать процессор вывода компоновки. В ИР такое много где используется. А вывод в табличный документ действительно в разы увеличивает расход памяти по отношению к выводу в таблицу значений. Возвращаясь к запросу, рекомендую открыть из него выборку и, обходя результат, писать строки в файл последовательно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |