Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Многопоточная запись файлов в pdf в фоне

Многопоточная запись файлов в pdf в фоне
Я
   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);

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.