Имя: Пароль:
1C
1С v8
Отправка по почте файлов из регламентного задания. Чудеса..
,
0 mr_K
 
16.07.13
13:19
Есть задача, отправлять клиентам отгрузочные документы за день. Регламентное задание вечером запускает процедуру, которая формирует Торг12 и счет-фактуру, записывает их в КаталогВременныхФайлов() и затем прикрепляет к письму, как вложения. Первый проход (первый отгрузочный документ)- все работает. Перед вторым проходом нужно удалить созданные ранее файлы и на их месте создать новые. Вот с этим беда: файлы оказываются залочены процессом rphost. Причем залочены они до конца жизни фонового задания на сервере. Как побороть?

зы есть аналогичное регламентное задание по отправке формируемых динамически файлов. Написано 2 года назад. Работает зараза, ничего не лочится. Хотя код идентичен процентов на 99% (формирования и запись файлов).
1 shuhard
 
16.07.13
13:20
(0) а не о чем без кода разговаривать
2 mr_K
 
16.07.13
13:25
(1) Согласен. Код ниже:

Пока Выборка.Следующий() Цикл
       
   ИмяКаталога = КаталогВременныхФайлов();
   ИмяФайла = ИмяКаталога + "torg12.pdf";
   УдалитьФайлы(ИмяФайла);

   СформироватьФайл(ИмяФайла, Выборка.Ссылка);
   ... далее не интересно
КонецЦикла

Процедура СформироватьФайл(ИмяФайла, ДокСсылка)
   ТабДокумент = ПечатьТорг12(ДокСсылка);
   ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
КонецПроцедуры
3 mr_K
 
16.07.13
13:29
(2)+ Первый проход по циклу проходит. Письмо уходит, файл прикреплен. Второй проход вываливается на УдалитьФайлы(). Если делать УдалитьФайлы в Попытка..Исключение - вываливается на ТабДокумент.Записать().
Если УдалитьФайлы делать в таком цикле:
Пока Истина Цикл
   Попытка
       УдалитьФайлы();
       Прервать;
   Исключение
   КонецПопытки
КонецЦикла
- то будет выполняться бесконечно и как раз тут и видно чем залочен файл. Когда через консоль сервера срубаешь фоновое задание - файл сразу освобождается
4 zzerro
 
16.07.13
13:29
Есть такая же беда... Регламентом формируются письма с вложением, отправляются. После отправки временные файлы не удаляются, ошибка доступа к файлу...
5 Галахад
 
гуру
16.07.13
13:33
Насчет ошибки не знаю, а вообще я бы так сделал.

Для каждого файла - уникальное имя. Допустим Номер+Дата+torg12.pdf.
6 mr_K
 
16.07.13
13:35
(5) Это на крайний случай )
Не люблю за собой горы мусора оставлять
7 hhhh
 
16.07.13
13:39
(6) СформироватьФайл у тебя раньше выполняется, чем УдалитьФайлы. поставь wait секунд на 5, чтобы все файлы успели удалиться.
8 mr_K
 
16.07.13
13:41
(7) Я же написал в (3), что если постоянно долбится, пытаясь удалить файл, то не происходит удаление, ни через 5 секунд, ни через 5 минут. Файл освобождается, только когда убивается процесс, который его создал.
9 alexei366
 
16.07.13
14:02
Попрбуй затести другой каталог, там на диске D к примеру, будет ли он также ся вести, также затести можешь ли сам ручками удалить файл с сервера когда фоновое ещё работает, но не производит с этим файлом ничего.
10 Галахад
 
гуру
16.07.13
14:08
(8) А если файлы не отправлять? Просто создать и удалить. Это прокатит?
11 ildary
 
16.07.13
14:12
Понятно, что велосипед, с квадратными колесами, но:
что если при создании временных файлов - их создавать во временной папке вида ГГ-ММ-ДД_ЧЧ-ММ-СС, которая при запуске создаются и затем при следующем запуске удаляется.
12 defini
 
16.07.13
14:16
я сделал так:

ИмяФайлаВложения = "ТвоеИмяФайла";
ФайлВФорматеPDF = ПолучитьИмяВременногоФайла("pdf");
ТабДокумент.Записать(ФайлВФорматеPDF, ТипФайлаТабличногоДокумента.PDF);
СписокФайловВложений.Добавить(Новый Структура("Хранилище, ИмяФайла, Наименование", ПолучитьДвоичныеДанные(ФайлВФорматеPDF), (ИмяФайлаВложения + ".PDF"), ИмяФайлаВложения));

Правда процедуру запускает пользователь, не регламентно.
13 alexei366
 
16.07.13
14:18
У меня рег задании тож сохраненный файл переводиться в ДвоичныеДанные и сразу удаляется, и в письмо соответственно пихается ДвоичныеДанные.
14 defini
 
16.07.13
14:19
я не удаляю файл, он сам удалится, при последующем запуске:

ПолучитьИмяВременногоФайла (GetTempFileName)
Синтаксис:

ПолучитьИмяВременногоФайла(<Расширение>)
Параметры:

<Расширение> (необязательный)

Тип: Строка.
Указывает желаемое расширение имени временного файла. Если параметр не задан, то создается временный файл с расширением по умолчанию (.tmp). Желаемое расширение задается строкой, которая и будет использована в качестве расширения. Указание точки в начале расширения не обязательно. Например, при указании ".xml" или "xml" результат будет одинаковый.
Возвращаемое значение:

Тип: Строка.

Описание:

Для записи данных во временный файл необходимо сначала сформировать имя такого файла. При этом, во избежание случайных потерь имеющихся файлов требуется получить уникальное имя. Данный метод предназначен для получения такого имени. При выполнении метода файл не создается.
Удаление временных файлов не обязательно. Если этот файл, по каким либо причинам, не был удален, программа удалит его при следующем запуске.

Доступность:

Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Примечание:

Рекомендуется удалять временный файл самостоятельно после его использования.
15 lEvGl
 
гуру
16.07.13
14:23
файл блокируется не ТабДок.Записать() а вот там где "... далее не интересно", где ПочтовыйПрофиль и все остальное. ИнтеренетПочту закрывать надо
16 тшл
 
16.07.13
14:24
в УТ в обработке ВыгрузкаДанныхCommerceML все по полочкам разложено. можно там посмотреть.
17 Infsams654
 
16.07.13
14:27
(15) (16) - не, пудрит что-то. Изначально неправильно сделано
18 mr_K
 
16.07.13
14:34
(15) Там где не интересно, следующее:
Письмо.Вложения.Добавить(ИмяФайла, "Товарная накладная по форме ТОРГ12");
ИПочта = Новый ИнтернетПочта;
       
Попытка
   ИПочта.Подключиться(ПрофильЭлектроннойПочты);
   ИПочта.Послать(Письмо);
   ИПочта.Отключиться();
Исключение
КонецПопытки;
(14) Если бы нужно за раз было послать только один файл - разговора бы не было. А тут либо на удалении блокируется, либо на записи следующего
(17) Конкретно, что не правильно?
(12)-(13) Сейчас так и попробую, только на вскидку разницы не вижу )
19 lEvGl
 
гуру
16.07.13
14:40
гм.... ну тогда
Письмо.Вложения.Удалить(0);
20 defini
 
16.07.13
14:41
(18) попробуй через ПолучитьИмяВременногоФайла()
метод каждый раз возвращает уникальное имя файла.
21 alexei366
 
16.07.13
14:48
(18) Попробуй как я и ещё некоторые писали, после создания файла перенеси его в ДвоичныеДанные и сразу удаляй, а к вложением вот это примени

Вариант синтаксиса: Добавить двоичные данные

Синтаксис:

Добавить(<ДвоичныеДанные>, <НаименованиеВложения>)
22 alexei366
 
16.07.13
14:49
(18) Или если у тя цикл, то мож Письмо = Неопределенно в конце каждого цикла
23 lEvGl
 
гуру
16.07.13
14:52
(22)ага, или письмо прибить
24 mr_K
 
16.07.13
14:55
(21) Заработало )
Спасибо!
Но все равно: ..ничего не понимаю (с)
25 1Сергей
 
16.07.13
15:00
ТабДокумент = ПечатьТорг12(ДокСсылка);
   ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
   ТабДокумент = "";

не предлагали ещё?
26 mr_K
 
16.07.13
15:03
(25) Я даже в разные процедуры разнес запись файла и его удление ). НЕ помогало. Через двоичные данные - работает.
Всем спасибо!
Но 1С не перестает удивлять своей чудесатостью )
27 arsik
 
гуру
16.07.13
15:04
(25) Может все же  ТабДокумент = Неопределенно;
28 GANR
 
16.07.13
15:09
29 mr_K
 
16.07.13
15:10
(28) Да. Спасибо ). Эту ветку давно в избранное добавил
30 alexei366
 
16.07.13
15:28
(29) твои файлы блокировало ИнтернетПочтовоеСообщение, так как ты в него прикреплял пути а не двоичные данные, тоесть если прикреплять пути то после отправки надо обнулять переменную содержащую ИнтернетПочтовоеСообщение (возможно будет так работать)