Имя: Пароль:
1C
1С v8
Оптимизация выгрузки регламентированной отчетности
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 гигабайт ОЗУ :-)