Если при рассылке закончилось место



С некоторого релиза, не могу сказать точно с какого, при проведении массовой рассылки писем с вложениями стало быстро заканчиваться место. Как я это обнаружил и что с этим сделал, напишу ниже. Очень приветствуются другие варианты решения в комментариях.

Что имелось:

  1. Клиент-серверный вариант 1С:Предприятие 8.3 (8.3.9.2033).
  2. «Управление торговлей», редакция 10.3 (10.3.40.1)
  3. Рабочая версия рассылки писем с вложениями,всего их 2 суммарным объемом ~1,5-2 мегабайта

Что случилось:

В один прекрасный момент на сервере полностью кончилось место. Анализ диска С привел к тому что в папке UserAppDataTemp повились файлы объем которых превышал 14G:

В отладке поймал момент возникновения этих «папочек»:

 Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.ИмяОтправителя = "";
Сообщение.Отправитель = УчетнаяЗаписьПочты.АдресЭлектроннойПочты;
Сообщение.Отправитель.ОтображаемоеИмя = "";
Сообщение.Кодировка = "windows-1251";

Сообщение.Вложения.Очистить();

мВременныеФайлы = Новый Массив;
Если НЕ Вложение = Неопределено Тогда
ФайлВФорматеXLS = ПолучитьИмяВременногоФайла();
мВременныеФайлы.Добавить(ФайлВФорматеXLS);
Вложение.Записать(ФайлВФорматеXLS, ТипФайлаТабличногоДокумента.XLSX);
Сообщение.Вложения.Добавить(ПолучитьДвоичныеДанные(ФайлВФорматеXLS), "Вложение.xlsx");
КонецЕсли;

Сообщение.Получатели.Очистить();

конкретно тут

Сообщение.Вложения.Добавить(ПолучитьДвоичныеДанные(ФайлВФорматеXLS), "Вложение.xlsx");

И что самое интересно, за собой 1С это чистит только после выхода из программы 1С. Долго и безрезультатно искал с чем это связано и можно ли настроить очистку сразу или периодически…

Обратите внимание! Это НЕ временный файл непосредственно вложения. Более того я тоже первый раз подумал на эти файлы, хотя они по массе и не превышают 2 мегабайт и лежат в папке temp. Ниже скриншот сравнения файла вложения, который я делаю для отправки и папки созданной системой.

и ещё содержимое этой папки, я не силен в разметке и прочее, но мне кажется это части письма:

 И ещё один скриншот, на котором хорошо видно, что созданный файл вложения имеет маленький размер и хранится отдельно, с возможностью легко удалить его. А «герой» статьи появляется отдельно, в момент когда созданное вложение помещается в письмо.

В итоге написал свою процедуру, которая примерно через равные промежутки времени удаляет эти каталоги.

Процедура ОчисткаКаталогаВременныхФайлов(дВремяНачала = Неопределено, сШаблон = "*.tmp") Экспорт
Если дВремяНачала = Неопределено Тогда
дВремяНачала = Дата(1,1,1)
КонецЕсли;
сКаталог = КаталогВременныхФайлов();
мСодержимое = НайтиФайлы(сКаталог, сШаблон);
Для Каждого элФайл Из мСодержимое Цикл
Если элФайл.ЭтоКаталог() Тогда
дВремяИзменения = элФайл.ПолучитьВремяИзменения();
Если дВремяИзменения >= дВремяНачала Тогда
УдалитьФайлы(элФайл.ПолноеИмя);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Надеюсь, это кому-нибудь поможет сэкономить время и нервы =)

19 Comments

  1. asved.ru

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

    Так что это ошибка.

    Reply
  2. kolya_tlt

    (0) зачем вы ищете все временные файлы? вы случайно можете удалить файлы с которыми сейчас идёт работа других сеансов.

    у вас есть переменная мВременныеФайлы, её и используйте для удаления

    Reply
  3. hydro2588_2015

    (2) Не. Я на другом форуме тоже никак не могу объяснить ) сейчас попробую ещё раз. Мои файлы в мВременныеФайлы хранятся в каталоге Temp непосредственно и весят они не так уж и много на самом деле, файл xlsx не больше 1.5 мегабайт. А вот эти папки создаются «сами» во время

    Сообщение.Вложения.Добавить(ПолучитьДвоичныеДанные(ФайлВФорматеXLS), «Вложение.xlsx»);

    Даже если я укажу

    Сообщение.Вложения.Добавить(ТабДокДвоичноеПредставление, «Вложение»);

    все равно он создаст эти папочки.

    вы случайно можете удалить файлы с которыми сейчас идёт работа других сеансов

    По идее Temp располагается в папке Users, т.е. если я это дело повешу на клиенте, то разные пользователи друг другу не помешают точно. В моем конкретном примере я повесил все это дело на сервере. Одновременно 2 рассылки на сервере я не запускаю, не за чем. Поэтому перекрытия не должно быть.

    Reply
  4. hydro2588_2015

    (1) У меня тоже была первая мысль что это ошибка платформы, на ранних версиях это не возникало. Но последнее время все «ошибки» 1с оформляет как фичи =) поэтому сразу решил не ждать, а править как получится.

    Reply
  5. asved.ru

    (4) это ошибка не платформы, а прикладного решения.

    Reply
  6. hydro2588_2015

    (5) Ок.

    возлагает ответственность за их своевременное удаление на разработчика

    А как тогда чистить? Может есть какие-то специальные методы, я таких в документации не нашел.

    Reply
  7. asved.ru

    (6) Требуется вызывать метод УдалитьФайлы(ПолноеИмяВременногоФайла) после прекращения работы с файлом. Т.е. «Чем я тебя породил, тем я тебя и убью».

    Reply
  8. МимохожийОднако

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

    Reply
  9. hydro2588_2015

    (7) (8) ещё разок, это не Я «порождаю»,в противном случае у меня была бы ссылка на то что я породил и я бы это удалил. Данные папки создаются системой в момент Сообщение.Вложения.Добавить(…). В комментарии (3) я это попытался расписать. В предыдущих релизах такого не было, видимо если и создавалась папка tmp, она тут же удалялась системой. Блин, видео что ли сделать =) я на мисте это объяснял, не поняли и тут тоже…

    Reply
  10. МимохожийОднако

    (9) Если бы ты в описании обработки добавил, что она создана с целью не трогать конфигурацию, то , возможно, подобных комментариев не появилось. Спасибо за разъяснение.

    Reply
  11. asved.ru

    (9) А покажите код функции ПолучитьДвоичныеДанные().

    Поскольку на

    Сообщение.Вложения.Добавить(Новый ДвоичныеДанные(ИмяИсходногоФайла), «Вложение.xlsx»);
    

    никакие папки не создаются.

    Reply
  12. hydro2588_2015

    (11)

    ПолучитьДвоичныеДанные (GetBinaryData)

    Синтаксис:

    ПолучитьДвоичныеДанные()

    Возвращаемое значение:

    Тип: ДвоичныеДанные.

    Описание:

    Получает результат чтения в виде двоичных данных.

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

    Тонкий клиент, сервер, толстый клиент, внешнее соединение.

    Попробовал ваш вариант, все тоже самое. Думаю что функция и ваш вариант через Конструктор на основании файла работают абсолютно аналогично.

    Reply
  13. hydro2588_2015

    (11) Вы проверяли на платформе (8.3.9.2033) ?

    Reply
  14. asved.ru

    (12) Вы описали метод объекта РезультатЧтенияДанных. Не уверен, что в режиме совместимости, в котором работает УТ 10.3, вообще поддерживается потоковая работа с двоичными данными.

    В коде же, приведенном в публикации, вызывается метод глобального либо текущего контекста с названием ПолучитьДвоичныеДанные(), в платформе не существующий. Нажмите правой кнопкой — «перейти к определению».

    Reply
  15. hydro2588_2015

    (14) Антон, это не моя процедура. Я не первый день программирую и это мой код, я помню что писал, а что не писал =). Конкретно эта функция типовая. Кроме того, я попробовал вариант через Конструктор (в публикации есть скриншот с отладкой ровно в этом месте), в плане создания временных файлов ничего не поменялось. Скажите на какой платформе вы пробовали использовать метод Вложения.Добавить(…) и у вас никакие каталоги не создавались?

    Reply
  16. asved.ru

    (15) А чья? Пушкина?

    PS Вы же указали в публикации версию платформы. Странно было бы с моей стороны пытаться воспроизводить на другой версии.

    Reply
  17. hydro2588_2015

    (16)

    //вспомогательные процедуры и функции

    Функция ПолучитьДвоичныеДанные(ИмяФайла)
    
    Файл = Новый Файл(ИмяФайла);
    
    Если Файл.Существует() Тогда
    Данные = Новый ДвоичныеДанные(ИмяФайла);
    Попытка
    УдалитьФайлы(ИмяФайла);
    Исключение
    КонецПопытки;
    Возврат Данные;
    Иначе
    Возврат Неопределено;
    КонецЕсли;
    
    
    КонецФункции
    

    Показать

    Даже хз что сказать в свое оправдание… =) Был не прав!

    Reply
  18. asved.ru

    (17) ок, давайте дальше. режим совместимости у конфигурации какой?

    Reply
  19. hydro2588_2015

    (18) Вот на скриншоте.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *