Имя: Пароль:
1C
1С v8
Вывод 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
Если структура компоновки достаточно простая (плоская, без соединений наборов данных и без ресурсов), то из компоновки эффективнее получить запрос (ирОбщий.ПолучитьЗапросИзКомпоновкиЛкс) и уже с ним работать, т.е. не использовать процессор вывода компоновки. В ИР такое много где используется. А вывод в табличный документ действительно в разы увеличивает расход памяти по отношению к выводу в таблицу значений. Возвращаясь к запросу, рекомендую открыть из него выборку и, обходя результат, писать строки в файл последовательно.
AdBlock убивает бесплатный контент. 1Сергей