Имя: Пароль:
1C
1С v8
Многопоточная запись файлов в pdf в фоне
0 jedbez
 
15.03.20
12:26
Чтото не получается
8.3.16
Создаю на сервере многопоточную генерацию табличных документов, заполняю их (набор однотипных этикеток). На выходе получаю 1 табличный документ, который необходимо записать как pdf.
Если без могопоточности то всё ок, а с ней выпадает Аварийно завершился процесс фонового задания. Причем 10 из 40 файлов записались корректно, и 2 по 15 байт
Если отключить запись в файл, то тоже всё ок. Подскажите куда копать.

КоличествоПотоковПечати = 4;
МассивЗаданий = Новый Массив;

Для каждого ЭлGTIN Из ТЗ Цикл
        
    //СформироватьЭтикеткиИЗаписатьВФайл(ЭлGTIN.GTIN);
            
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(ЭлGTIN.GTIN);
            
    Задание = ФоновыеЗадания.Выполнить("ВзаимодействиеСервер.СформироватьЭтикеткиИЗаписатьВФайл", МассивПараметров);
            
    МассивЗаданий.Добавить(Задание);
            
    Если МассивЗаданий.Количество() >= КоличествоПотоковПечати Тогда  
        Попытка
            ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
        Исключение
            ВызватьИсключение СтрШаблон(ТекстОшибки, ОписаниеОшибки());
        КонецПопытки;
        МассивЗаданий.Очистить();
    КонецЕсли;
            
КонецЦикла;
Если МассивЗаданий.Количество() > 0 Тогда
    Попытка
        ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
    Исключение
        ВызватьИсключение СтрШаблон(ТекстОшибки, ОписаниеОшибки());
    КонецПопытки;
    МассивЗаданий.Очистить();
КонецЕсли;    


Процедура СформироватьЭтикеткиИЗаписатьВФайл(GTIN) Экспорт
*******************
    ПараметрыФормирования = Новый Структура
    **************************************
    Данные = ПечатьЭтикеток.ПолучитьЭтикетки_V2(ПараметрыФормирования);
    Данные.ТД.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

КонецПроцедуры
1 acht
 
15.03.20
12:33
А не в один и тот же файл ты их параллельно записать пытаешся?
2 Garykom
 
гуру
15.03.20
13:42
3 Cyberhawk
 
15.03.20
14:02
Что-то у тебя не тру-многопоточность - когда активных стало столько, сколько задано в настройке, все ставится на паузу до _полной_ обработки этой порции.
4 jedbez
 
15.03.20
15:38
(1) Нет, но все равно проверю. Наверно вставить надо проверку перед записью на существование файла.
(2) Сяп, почитаю.
(3) Ну да, иначе перегрузка может произойти процессора. Итого, порциями по 4 потока.
5 jedbez
 
16.03.20
01:55
(2) Познавательно. Но насколько я понял часть описанных принципов реализуется платформой 1С

Похоже проблема возникает при больших файлах, более 10 Мб.
Решил проблему сохраняя pdf сначала в память, а мотом как двоичный код выгружаю в файл на диск.

Птк = Новый ПотокВПамяти;
Данные.ТД.Записать(Птк, ТипФайлаТабличногоДокумента.PDF);
ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
ДД.Записать(""+ПутьСохранения+"\"+ИмяФайла_);
6 jedbez
 
16.03.20
12:49
Блин нгифига не решил, иногда ндаже на мелких файлах "Аварийно завершился процесс фонового задания"
7 Cyberhawk
 
16.03.20
13:26
(6) Платформу обнови
8 Cyberhawk
 
16.03.20
13:27
Не поможет - багрепорт на тестплатформ