Вход | Регистрация
 

Конвертация УПП1.3 --> ЗУП 3.1 Оптимизация переноса

Конвертация УПП1.3 --> ЗУП 3.1 Оптимизация переноса
Я
   Optan
 
13.04.18 - 10:34
Перенос документа "Табель учета рабочего времени" оооочень долгий.

В УПП в ТЧ данных отработанного времени на одного сотрудника получается 248 реквизитов (31день*4 (ВидаВремени+Часы).
В ЗУП 1 строчка превращается в 4 (на каждый ВидВремени)

В ПВД выбираю запросом и при обходе выборки заполняю ТЗ и вызываю ВыгрузитьПоПравилу (для каждого документа). В ПКО правило без источника, а состав приемника соответствует ТЗ.

Сначала написал преобразование реквизитов (т.к. наименования отличаются) через"Выполнить", но один месяц у меня выгружался почти сутки (видимо, операции конкатенации со строками долговаты). Переписал через кучу присвоений для каждого реквизита - стало побыстрее но недостаточно.

Как можно еще ускорить выгрузку?
 
 
   Alexandr_U1982
 
1 - 13.04.18 - 10:43
Не использовать КД.
С помощью объекта ЗаписьXML сформировать свой XML-файл и выгрузить туда нужные данные.
С помощью объекта ЧтениеXML прочитать файл и создать документы.
   d4rkmesa
 
2 - 13.04.18 - 10:46
(0) Сколько же там этих табелей в итоге, тысячи человек? Какой объем выгружается?
   d4rkmesa
 
3 - 13.04.18 - 10:54
(0) Я бы сделал по-другому, ПКО документ-в-документ, с переопределенным обработчиком выгрузки ПКГС, где КоллекцияОбъектов бы заполнялась из запроса. Запрос бы постарался оптимизировать.
Имхо, проблема может быть в выборке:
"выбираю запросом и при обходе выборки заполняю ТЗ"
Лучше привести код обработчика.
   xxTANATORxx
 
4 - 13.04.18 - 10:59
(0)как-то нужно извернуться и выполнить замер производительности, понять в каком месте тормоза
   Optan
 
5 - 13.04.18 - 11:28
(2) 1 мес=357 документов=6834 строк ТЧ
Урезанный текст обработчика:
Запрос=Новый Запрос;

Запрос.УстановитьПараметр("ДатаНач",Дата(2014,4,1));
Запрос.УстановитьПараметр("ДатаКон",Дата(2014,5,1));

ТЧФизЛиц = Новый ТаблицаЗначений;
ТЧФизЛиц.Колонки.Добавить("ФизическоеЛицо");


ТЧВремени = Новый ТаблицаЗначений;
ТЧВремени.Колонки.Добавить("Сотрудник");
ТЧВремени.Колонки.Добавить("КоличествоСмен");

ТЧВремени.Колонки.Добавить("ВидВремени1");
ТЧВремени.Колонки.Добавить("ВидВремени2");
....
ТЧВремени.Колонки.Добавить("ВидВремени31");
...
ТЧВремени.Колонки.Добавить("Часов31");

Запрос.Текст="ВЫБРАТЬ
|    ТабельУчетаРабочегоВремениОрганизации.Ссылка,
|    ТабельУчетаРабочегоВремениОрганизации.Номер,
|    ТабельУчетаРабочегоВремениОрганизации.Дата,
|    ТабельУчетаРабочегоВремениОрганизации.Организация,
|    ТабельУчетаРабочегоВремениОрганизации.ПериодРегистрации,
|    ТабельУчетаРабочегоВремениОрганизации.ПодразделениеОрганизации,
|    ТабельУчетаРабочегоВремениОрганизации.Ответственный,
|    ТабельУчетаРабочегоВремениОрганизации.Комментарий,
|    ТабельУчетаРабочегоВремениОрганизации.КраткийСоставДокумента,
|    ТабельУчетаРабочегоВремениОрганизации.СпособУказанияПериода,
|    ТабельУчетаРабочегоВремениОрганизации.ДатаНачалаПериода,
|    ТабельУчетаРабочегоВремениОрганизации.ДатаОкончанияПериода
|ИЗ
|    Документ.ТабельУчетаРабочегоВремениОрганизации КАК ТабельУчетаРабочегоВремениОрганизации
|ГДЕ
|    ТабельУчетаРабочегоВремениОрганизации.Проведен
|    И ТабельУчетаРабочегоВремениОрганизации.Дата МЕЖДУ &ДатаНач И &ДатаКон
|";

ТЗ=Запрос.Выполнить().Выгрузить();
ТЗ.Колонки.Добавить("ФизическиеЛица");
ТЗ.Колонки.Добавить("ДанныеОВремени");

Для каждого докТабеля Из ТЗ Цикл
    Запрос.Текст="ВЫБРАТЬ
    ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник,
    ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.Сотрудник.ФизЛицо КАК ФизЛицо,
    ТабельУчетаРабочегоВремениОрганизацииОтработанноеВремя.ПервыйВидВремени1,

....248строк
Запрос.УстановитьПараметр("Ссылка",докТабеля.Ссылка);

ВыборкаВремени=Запрос.Выполнить().Выбрать();

    Пока ВыборкаВремени.Следующий() Цикл
        
        СтрокаТЧФизЛиц=ТЧФизЛиц.Добавить();
        СтрокаТЧФизЛиц.ФизическоеЛицо=ВыборкаВремени.ФизЛицо;


///Присвоения

        СтрокаТчВремени1=ТЧВремени.Добавить();
        
        СтрокаТчВремени1.Сотрудник=ВыборкаВремени.Сотрудник;
        СтрокаТчВремени1.КоличествоСмен=ВыборкаВремени.КоличествоСмен;        
        
        СтрокаТчВремени1.ВидВремени1=ВыборкаВремени.ПервыйВидВремени1;
        СтрокаТчВремени1.ВидВремени2=ВыборкаВремени.ПервыйВидВремени2;
.....
СтрокаТчВремени4.Часов31=ВыборкаВремени.ЧетвертыйЧасов31;

    КонецЦикла;
//документ закончился

докТабеля.ФизическиеЛица=ТЧФизЛиц.Скопировать();
докТабеля.ДанныеОВремени=ТЧВремени.Скопировать();

ВыгрузитьПоПравилу(докТабеля, , , , "ТабельУчетаРабочегоВремени");    
    
    
КонецЦикла;

   Alexandr_U1982
 
6 - 13.04.18 - 11:35
(5) Запрос в цикле??
Зачем вам переносить табели за 2014 год??
   Optan
 
7 - 13.04.18 - 11:38
(6) ТЗ от бизнеса такое.
Запрос без цикла в память не лезет - начинаются вылеты(
   Optan
 
8 - 13.04.18 - 11:39
(6) Приходится по шапкам отдельно ТЧ выгружать.
   d4rkmesa
 
9 - 13.04.18 - 12:11
Все-таки лучше использовать один запрос по ТЧ(второй можно сделать отдельно для реквизитов шапки) и обходить через выборку. Через консоль отдельно оцените, какие данные нужно выгружать, 3/4 реквизитов может быть не нужным вовсе.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует