|
Оптимизация выгрузки регламентированной отчетности | ☑ | ||
---|---|---|---|---|
0
manti
18.07.13
✎
15:16
|
Коллеги, очень долго сохраняется и вышружается отчет в регл. отчетности - декларация об объеме и перевозке этилового спирта - форма № 8.
Как я понимаю механизмы выгрузки там везде типовые. Запись в 15000 строк - за квартал иил менее выгружается и сохраняется за 2 часа. Какие механизмы можно поменять, где возможно сделать рефакторинг?? Пробовал по отладчику - смотрел замеры производительности. В итоге самый больший процент рабочег времени занимает функция ПолучитьПутьВыгрузки_ЗУПки, в ней куско кода- РезВыбора = ФормаПараметровСохранения.ОткрытьМодально(); Я понимаю, что это форма - для сохранения и указания места для файла формата xml. Я ожидал увидеть самый большой процент рабочего времени у какой-то процедуры ии функции, формирующей выгрузки. Нужны предложения по рефактрингу для быстродействия выгрузки. |
|||
1
H A D G E H O G s
18.07.13
✎
15:23
|
Взять и переписать.
|
|||
2
H A D G E H O G s
18.07.13
✎
15:24
|
Не там ищите.
|
|||
3
H A D G E H O G s
18.07.13
✎
15:25
|
Догоните до 40000 строк - будет падать по памяти.
|
|||
4
manti
18.07.13
✎
15:32
|
(3) то то и оно. Там все основано на ХранилищеЗначения. Возможно оттуда и туда чтение/запись медленно идут. Но если не использвать хранилище то отчет не будет сохраняться в документе ВыгрузкаРегламентированныхОтчетов_ЗУП. И его нельзя будет прочитать -тоесть пидется все заново переформировывать.
Подскажите в каком месте искать)).. |
|||
5
manti
18.07.13
✎
15:36
|
(3) и как это обходите?
|
|||
6
H A D G E H O G s
18.07.13
✎
15:38
|
(4) У меня тоже на хранилище значения построено.
Выгрузка 100000 строк идет ну минут 5. |
|||
7
H A D G E H O G s
18.07.13
✎
15:40
|
Мы писали 8 форму еще до того, как это стало мэйнстримом (это сделало 1С).
Поэтому там нет именованных ячеек, хранения данных в структуре и помещения сырого текста XML в строку неограниченного размера. |
|||
8
manti
18.07.13
✎
15:55
|
(7) афигеть, получается там нужно абсолютно все перелопачивать. Тоесть обратить внимание на именованные ячейки, структуры? А если сделать строку ограниченно - это значительно повлияет на быстродействие?
|
|||
9
manti
18.07.13
✎
15:59
|
С каких процедур начать))
|
|||
10
H A D G E H O G s
18.07.13
✎
16:05
|
(9) Документ ВыгрузкаРегОтчетов, процедура СформироватьТекстыВыгрузки()
1) Добавить свой блок Если МОЙ_Отбор401алко.Количество() <> 0 И (НЕ ВыгрузкаПрервана) Тогда 2) Получить путь выгрузки сразу: Пока Истина Цикл Попытка КаталогФайловXML=РегламентированнаяОтчетность.ПолучитьПутьВыгрузки(); Если КаталогФайловXML=Ложь Тогда ВыгрузкаПрервана=Истина; Возврат; КонецЕсли; ВременныйФайл=Base64Значение(""); ВременныйФайл.Записать(КаталогФайловXML+"TestFile.tmp"); УдалитьФайлы(КаталогФайловXML+"TestFile.tmp"); Прервать; Исключение Предупреждение("В данный каталог у пользователя нет прав на запись файлов. Выберите другой каталог!"); КонецПопытки; КонецЦикла; 3) Писать XML сразу! в файл, по полученному пути. 4) По результату вызова процедуры Отчета ТекФорма.УниверсальнаяВыгрузка у тебя будет готовый файл, колторый ты запишешь в свой реквизит ХранилищеЗначения с сжатием 9. |
|||
11
H A D G E H O G s
18.07.13
✎
16:06
|
Функция ВыгрузитьДеревоВXML(ДеревоВыгрузки, Параметры)
ПотокXML = СоздатьНовыйПотокXML(); ЗаписатьУзелДереваВXML(ДеревоВыгрузки, ПотокXML, Параметры); ТекстДляЗаписи = ПотокXML.Закрыть(); Возврат ТекстДляЗаписи; КонецФункции заменить на: Процедура ВыгрузитьДеревоВXML(ДеревоВыгрузки, Параметры, ФайлДляВыгрузки) ПотокXML = СоздатьНовыйПотокXML(ФайлДляВыгрузки); // создаем новый поток для записи ЗаписатьУзелДереваВXML(ДеревоВыгрузки, ПотокXML, Параметры); // пишем дерево в поток ПотокXML.Закрыть(); КонецПроцедуры |
|||
12
H A D G E H O G s
18.07.13
✎
16:12
|
Движок регламентных отчетов писался в баянистом 200x году, и созидатели не ожидали пришествия Росалкогольрегулирования.
p.s. Вы еще с печатья понаслаждаетесь. |
|||
13
manti
18.07.13
✎
16:21
|
(10) (11) спасибо большое, буду разбираться. Попробую сделать по Вашей рекомендции, что получилось - отпишусь тут.
|
|||
14
manti
18.07.13
✎
16:22
|
(10) 1) Добавить свой блок
Если МОЙ_Отбор401алко.Количество() <> 0 И (НЕ ВыгрузкаПрервана) Тогда А что такое Отбор401алко это откуда взять? |
|||
15
manti
18.07.13
✎
16:23
|
(14) сори, смутил префикс МОЙ
|
|||
16
manti
18.07.13
✎
16:59
|
(10) Функция СоздатьНовыйПотокXML() - туда переменная ФайлДляВыгрузки подается. Как эта функция у Вас выглядит?
"4) По результату вызова процедуры Отчета ТекФорма.УниверсальнаяВыгрузка у тебя будет готовый файл, колторый ты запишешь в свой реквизит ХранилищеЗначения с сжатием 9." У нас файл вроде в документе формируется, тоесть его нужно передать в отчет, при этом поместив в обыное хранилише значений и сжав его?? Или как? |
|||
17
H A D G E H O G s
18.07.13
✎
17:05
|
(16) ФайлДляВыгрузки подается как параметр в УниверсальнаяВыгрузка() формы отчета, а дальше как параметр в ВыгрузитьДеревоВXML(), а потом пишется в реквизит документа ВыгрузкаРегламентированныхОтчетов, после возврата из процедуры УниверсальнаяВыгрузка()
Че непонятно то? НовСтр = Выгрузки.Добавить(); НовСтр.ИмяФайла = СтруктураРезультата.ИдФайл+".xml"; ДвоичныеДанные=Новый ДвоичныеДанные(КаталогФайловXML+НовСтр.ИмяФайла); НовСтр.СжатыйТекст = Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9)); |
|||
18
manti
18.07.13
✎
17:33
|
(17) Ну тут конешн после апргейда многое не ясно) - СтруктураРезультата, НовСтр - куда и откуда писать((. Вы можете на мыло скинуть код модуля формы ВыгрузкаРегламентированныхОтчетов и модуля формы РегламентированныйОтчетАлкоПриложение8?
|
|||
19
manti
19.07.13
✎
12:22
|
(17) посмотрел детально Ваш предложенный вариант.
Вы предлагаете избегать чтения во временный файл - темп? а сразу напрямую в файл записи производить, опять же с помощью хранилища даннх. Тоесть у нас уже данные в хранилище есть, а мы их снова в хранилище суем)). Тут по видимому сам механизм чтения их храниища само по себе весьма затроатное явление. Может сделать документ, у него ТЧ и в эту ТЧ помещать данные из таблицы и производить чтение оттуда. Только вот как это на быстродействии скажется???? |
|||
20
H A D G E H O G s
19.07.13
✎
12:32
|
Под железный топот ног.
Не останется дорог. Под забралом перегар, А в ладонях скипидар! |
|||
21
H A D G E H O G s
19.07.13
✎
12:34
|
(19) ОМГ.
Данные (показатели: код перевозки, код типа продукции, ИНН, КПП) храняться как и раньше, абсолютно также. Их не трогаем. Единственное, в процедуре Функция Сохранить(Автосохранение = Ложь) Экспорт жмем их с сжатием 9 ХранилищеДанных = Новый ХранилищеЗначения(СписокСохранения,Новый СжатиеДанных(9)); мСохраненныйДок.ДанныеОтчета = ХранилищеДанных; |
|||
22
H A D G E H O G s
19.07.13
✎
12:37
|
Все вышеперечисленное я писал ДЛЯ САМОЙ ВЫГРУЗКИ, для формирования XML файла.
Если вы его будете формировать в память - это будет: а) долго (постоянный realloc памяти) б) на больших объемах 1С вывалиться с ошибкой, когда не сможет выделить большой блок памяти. Поэтому XML пишем сразу на диск. Ну и в конце - тупо пихаем его не в строку, как 1С, а в хранилище значений с сжатием 9, отдельным реквизитом добавленное в ТЧ Выгрузки. Что не так? |
|||
23
H A D G E H O G s
19.07.13
✎
12:41
|
Вы бумажку сдавать планируете?
|
|||
24
manti
19.07.13
✎
14:34
|
(23) уже сдал руководству в виде отчетности)
Возможно это ненамного повлияет на время и ход выгрузки, но очевидно не будет существенного выигрыша во времени. По видимому тут замедляется из за самого факта работы с хранилищем. Скажите, после этого рефакторинга, что Вы предложили за сколько примерно у Вас квартал выгружается. |
|||
25
H A D G E H O G s
19.07.13
✎
14:44
|
7585 строк сформировался за 18 секунд.
ms sql 2008 r2+1С сервер на старом Xeon-e 2007 года с 8 гиг ОЗУ. База 18 гигов. |
|||
26
H A D G E H O G s
19.07.13
✎
14:46
|
Там конечно сервер курит в сторонке, ибо кэши и все делается на клиенте - i5 sandy bridge 3.1 ГГЦ и 8 гигабайт ОЗУ :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |