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

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

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

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

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

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

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